U8打包把dx替换为d8

本文所需文件下载地址:https://download.csdn.net/download/wei1583812/21059961

建议看此文之前先把我上传的资源tool.zip下载下来看看目录结构,对照着看下文会更容易一些。

最近一直在搞公司的一套U8打包系统,虽然我的主业不是干这个,但是公司交代的工作,还是得尽心干好的。

接入oppo渠道时,打包遇到了如下报错:

Uncaught translation error: com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)

反编译了oppo SDK 的 jar,发现是因为oppo SDK用了java8开发,但是dx.jar 把jar生成dex时,dx.jar 不支持java8 。怎么办呢,我去找U8 SDK的作者问了下,对方说要用d8.jar 取代dx.jar 。因为d8是专为java8脱糖而写的。方向已经知道了,那么下面就开搞。

首先在apk_utils.py中,找到 jar2dex 方法,把如下代码注释调:

# dexToolPath = file_utils.getFullToolPath("/lib/dx.jar")
# heapSize = config_utils.getJDKHeapSize()
# cmd = file_utils.getJavaCMD() + ' -jar -Xms%sm -Xmx%sm "%s" --dex --multi-dex --output="%s" ' % (heapSize, heapSize, dexToolPath, dstDir)

换成:

cmd = file_utils.getFullToolPath("d8") + " --lib --min-api 21 " + file_utils.getFullToolPath("android.jar") + " --output " + dstDir + " "

其中 android.jar 我用的是Android\Sdk\platforms\android-30\android.jar 目录下的。这里也建议使用最新的,否则安卓的一些新属性无法识别重新打包时会报错。参数 --min-api 21 是为了解决jar 65K 方法数超出的。如果方法数超出65536,会自动切割dex

那么d8从哪儿来呢,需要从你的Adroid SDK 的目录拿:...\Android\Sdk\build-tools\30.0.3\d8.bat

为了大家方便使用,我已经把文件打包上传了:https://download.csdn.net/download/wei1583812/21059961

但是呢,d8.bat中,把调用d8.jar的路径写成 Android\Sdk\tools\lib\find_java.bat:

set java_exe=
if exist    "%~dp0..\tools\lib\find_java.bat" call    "%~dp0..\tools\lib\find_java.bat"
if exist "%~dp0..\..\tools\lib\find_java.bat" call "%~dp0..\..\tools\lib\find_java.bat"
if not defined java_exe goto :EOF

咱们不能非得再整个这样的目录吧,所以得改改,把d8.bat改成如下:

set java_exe=
if exist    "%~dp0lib\find_java.bat" call  "%~dp0lib\find_java.bat"
if not defined java_exe goto :EOF

这样就会取portal-sdk-tool\tool\win\lib\find_java.bat路径。执行d8.bat 还需要  find_java32.exe   find_java64.exe 两个文件,我都已经放到我上传的资源tool.zip中了。

还有,打包环境的java 一定要是java8,如果是java7也会报错。

此时改造完毕,重新打包即可。

but,没完,我发现我这只是改造完成了windows平台的打包,但是我们公司还有人在用linux平台打包。真是坑啊,还得搞一下linux平台打包。那就开始吧。

Linux平台打包改造:

细细研究发现,linux平台不需要find_java.bat,那就简单多了。apk_utils.py代码不变,只需要把我上传的资源目录tool\linux 对应复制到你的tool\linux目录即可。

再说一遍,打包环境的java 一定要是java8,如果是java7也会报错。

好了,linux平台也改造完毕,愉快的打包吧。

==============================================

补充,写完之后才想起来,我上传的资源目录 linux\d8 文件,也被我改造过。最后一行被我改造成了:

exec $(pwd)"/tool/linux/jdk1.8.0_301/bin/java" "${javaOpts[@]}" -cp "$jarpath" com.android.tools.r8.D8 "$@"

你没有这个路径的话肯定报错,但是我也懒得重新上传了,你自己改吧,改成如下即可:

exec java "${javaOpts[@]}" -cp "$jarpath" com.android.tools.r8.D8 "$@"

上面的整个研究过程花了我四天时间,如果对你有帮助,希望打赏我一杯咖啡钱:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值