本文所需文件下载地址: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 "$@"
上面的整个研究过程花了我四天时间,如果对你有帮助,希望打赏我一杯咖啡钱: