风也温柔

计算机科学知识库

java支持库 艰辛的Delphi 11.1 Android项目升级之路(成功升级的注意事项)

  我使用了洪荒之力,终于把项目成功升级到 11.1了,可能因为项目里面用到的三方SDK比较多,像推送、支付、扫码、相册选择等,所以遇到的问题也比较多吧。

  1.将工程 32位目标平台下的恢复为默认

  如果用D11打开工程,10.4下很多自带的jar都已经被去除了

  如果立即编译的话,会报错:

  这个时候,你只要右键,在弹出的菜单中点击“ Files to ”

  点击之后,会清除不存在的jar,把D11中自带的jar添加进去:

  再清一下工程的临时生成目录

  2.由于 10.4.2编译jar用的是dx,D11.1编译jar用的是d8,我复制一个工程出来专门用于D11.1下编译,配置下工程的生成目录,与D10.4的生成目录区分开

  比如.dproj是给D10.4编译的,

  再复制一个工程出来,命名为.dproj,表示是给D11编译的,

  然后再修改工程的生成目录,

  比如原来为:.$()$()

  更改为:.$()D11$()

  3.修改权限申请方法的参数类型

  如下10.4下面申请权限的代码已经编译不过了

  的声明为:

  (const : ;

  : ; : nt = nil);

  ;;

  其中,D10.4下的声明为:

  = (: ; const : ;

  : ) of ;

  D11下的声明为:

  = (: ; const : ay;

  : ) of ;

  ay=array of ;

  所以改成如下,这样这段代码10.4和11都能使用了:

  //申请权限

  {$}

  .

  ([(n..),

  //要有震动的权限

  (n..)

  ],

  (: {$IF >= 35.0}ay{$ELSE}{$IFEND};

  : {$IF >= 35.0}{$ELSE}{$IFEND})

  begin

  end);

  {$ENDIF}

  4.一些三方SDK的jar在编译成dex.jar时会卡住,

  比如编译支付宝支付SDK的时候卡住了

  编译华为二维码扫描SDK的时候也是:

  一动不动,初步估计是将jar编译为dex的时候卡住了,

  这个时候该怎么办呢?

  编译dex用的是java,所以我们只需要找到java.exe相关的进程当前在执行什么,即找到启动该进程的参数:

  在cmd下执行如下命令:

  wmic where ='java.exe' get , /value

  然后把后面的命令复制下来,在cmd中运行,看看它会报什么:

   stack map table for with non- flow.

  这些是警告,并非是报错(Error),可以忽略,并且实际上jar对应的dex.jar已经生成了,

  再把java.exe进程杀掉,

  杀掉之后,在的窗口也能看到上面那些警告,

  再继续编译即可,重复以上步骤,直到将所有的jar都编译成dex.jar。

  5.由于 11.1添加了许多系统自带的jar,导致不能用太多第三方的jar,需要打补丁修复这个问题

  D11.1添加了支持库相关的jar,现在很多SDK都需要这个包

  如果你的项目使用了很多三方SDK,会导致原来在 10.4以下编译正常的项目到D11下编译不了,报:

  Error: E7688 Error: fit in a dex file (# : 68541 > 65536). Try a main-dex list,

  如下图所示:

  这个问题是因为一个dex文件中不能包含大于65536个方法所导致的,你可以禁用掉和相关的jar来临时解决,

  下面是我所使用的一堆三方SDK包:

  上有人说在编译.dex时加--min-api 21就能通过,

  试了一下,果然成功,并生成了两个dex

  不过,每次Build的时候都会编译.dex并报错,所以解决不了问题,

  我在,,上都问了一圈,多亏有人在Slack上指点:

  原来早就有人提出了这个问题,

  //RSP-37667

  并且也发了补丁来修复,

  /rad--11-1--patch-1-/

  那就下载安装这个补下吧,

  补丁就安装好了,

  再编译,还是报错,可以看出--min-api参数的值为19,不是21,

  那就需要改..xml中的为21,

  再次编译,成功!!!

  同时生成了两个dexjava支持库

  6.D11.1将旧的支持库升级为了库

  D11.1去除了--v4.jar,使用了新的支持库,但是就我所用到的SDK中,还是有用到这个--v4库的,所以我还得把它加上去。但是加上去也不是这么简单的,和自带的jar之间会有冲突,编译的时候会报类重复定义多次:

  [ Error] Error: E7688 Type ..v4.app.nnel is times: c: files (x86)\22.0lib\core-1.5.0-rc02.dex.jar:.dex, C:\图片视频选择器\D11\---dexed.jar:.dex

  因此需要用将jar打开,把重复的类删除掉java支持库,再清缓存编译,直至编译成功。

  7.布署也恢复一下默认

  以上编译没有问题了,本以为皆大欢喜了,但是运行闪退,令人头大,

  手机插电脑上java支持库 艰辛的Delphi 11.1 Android项目升级之路(成功升级的注意事项),在cmd下运行adb > C:a.log命令,

  我是将这个命令放在批处理,然后运行这个批处理的:

  cd C:\

  chcp 936

  cd C:\-tools

  C:

  adb >C:alog.txt

  在手机上点击APP,闪退后,关闭这个命令,打开C:a.log查看闪退日志,

  06-16 21:58:29.330 20573 20573 E : by: java.lang.on: Didn't find class '.core..'

  说是没有这个类,可是这个类在core-1.5.0-rc02.jar中,并且也是自带的jar,

  这就有点纳闷了,

  难道是分包了之后,只有将.dex布署进去了,但是其他包比如.dex这些没有布署进去,说到这里,我打开布署,

  可以看到,旧项目里面是有布署一个.dex的,

  点击“ to ”之后 ,

  这个.dex的布署就被删除了,说明D11是不需要这个布署项的,

  再编译,运行,

  我的APP终于可以正常打开了。真是太难了。

  文章来源:http://www.360doc.com/content/22/0827/14/69596681_1045495457.shtml