本文所需文件下载地址: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 " + file_utils.getFullToolPath("android.jar") + " --output " + dstDir + " "

其中 android.jar 我用的是Android\Sdk\platforms\android-30\android.jar 目录下的。这里也建议使用最新的,否则安卓的一些新属性无法识别重新打包时会报错。

那么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 "$@"

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

U8打包把dx替换为d8相关推荐

  1. maven 打包时动态替换properties资源文件中的配置值

    pom build节点下面添加resource配置: [html] view plaincopy <resources> <resource> <directory> ...

  2. iOS重打包之脚本替换

    iOS重打包之脚本替换 上一篇文章讲的是通过MonkeyDev工具重打包,其实MonkeyDev的功能远不止用来重打包,他可以很方便的注入自己的动态库.调试指令,后面我还会介绍. 今天这篇文章讲一下另 ...

  3. 逆向开发使用dx.jar、d8.jar、baksmali.jar将jar转dex文件,解决requires --min-sdk-version >= 26 (currently 13)问题

    apk母包中合并第三方SDK代码 当我们需要将某些第三方SDK的代码合并到自己的apk母包的时候,一般的流程是解压第三方SDK的aar文件,然后合并里面的资源文件,assets.res目录直接拷贝合并 ...

  4. Unity 打包 iOS 工程 替换Native 和 Data 时出错

    当我们用unity 打包x-code 工程时,一般会打包一个新的工程然后替换原始工程的 Native和Data文件夹.但是有时候替换会出现下图的问题! 在确定没有添加unity调用ios的方法或者有需 ...

  5. 【UE4】4.26安卓打包流程

    前言: 本教程适用于UE4.26.文章最后部分有常见问题解决与性能优化. 教程开始: 1.下载 Android Studio最新版-默认安装(请先关闭UE相关程序) 2.打开Android Studi ...

  6. Android程序打包安装过程

    Android程序打包安装过程 Android程序--编译打包--apk--签名--通过adb发布到设备上 编译打包:dx.bat:可以将bin目录下的classes文件.deseLibs依赖包打包成 ...

  7. Android Studio Gradle实践之多渠道自动化打包+版本号管理

    转: Android Studio Gradle实践之多渠道自动化打包+版本号管理 上次介绍了Android Studio的安装.配置和基本使用.这次讲一下Android Studio用到的打包工具G ...

  8. Android Studio Gradle打包实践之多渠道+版本号管理

    上次介绍了 Android Studio的安装.配置和基本使用 .这次讲一下Android Studio用到的打包工具Gradle. Gradle 是一种构建项目的框架,兼容Maven.Ant,为Ja ...

  9. maven 排除配置文件打包_maven 打包排除配置文件

    如果你想通过pom.xml文件的配置实现的话,你可以这样 1.打jar包时过滤配置文件 src/main/resources **/* true .............. 2.在plugins中添 ...

最新文章

  1. cassandra框架模型之二——存储机制 CommitLog MemTable SSTable
  2. 淘宝——移动端页面终端适配
  3. sql SUBSTR
  4. jar包和war包区别及理解
  5. python第一周心得体会_Python学习第一周学习总结
  6. oracle数据库快照打点,Oracle数据库快照的使用
  7. 首发不同文件的md5碰撞真正方法——有图(视频教程加工具)非暴力碰撞!
  8. 知识资产投资——《程序员修炼之道》的建议
  9. ssm radis mysql_SSM完美整合Redis
  10. yii CComponent组件 实例说明1
  11. 物流广告收入实现高速增长 国际投行看好京东转型潜力
  12. 流程机器人 RPA:AI落地的接盘侠 | 甲子光年
  13. 字节流和字符流的读写
  14. vue移动端复杂表格表头,固定表头与固定第一列
  15. Capstone 专注HDMI转VGA DP转VGA DP转HDMI DP转LVDS TYPEC转HDMI拓展方案+设计PCB板图
  16. 如何在2015年后的MacBook Air上安装双系统
  17. Linux中exec函数用法,linux exec用法总结
  18. 互联网运营面试题_必看❗️面试互联网运营常见问题及答案
  19. 区块链DAPP开发 以太坊智能合约框架有哪些
  20. Block源码解析和深入理解

热门文章

  1. 机器学习__05__K近邻算法
  2. [COCI2017-2018#5] Olivander
  3. Java设计模式之结构型-桥接模式 (Bridge)
  4. MoveTo和LineTo函数的意思
  5. BMS | 动力电池应用领域技术重点整理
  6. 商家想要做小红书探店推广应该怎么做?
  7. 中国网建 SMS短信接口帮助文档
  8. freemarker解析html标签,【转】Freemarker输出$和html标签等特殊符号
  9. 化解射频和微波设计挑战的六个技巧
  10. 素问 —渗透测试基本知识