Android 使用dx/d8将jar转换为dex

前言

在 JDK1.8 之前我们可以通过 dx 工具将 jar 转为 dex。
为了能够支持 JDK1.8,目前 AGP 是通过在 D8/R8 将 class 文件编译成 dex 文件的过程中,对字节码进行转换来实现的,这个转换过程称为脱糖。
因此 JDK1.8 及以后我们需要使用 d8 工具将 jar 转为 dex。

dx

dx 位于AndroidSDK/build-tools/<33.0.0的版本号中。

  1. windows 电脑可以直接在目录下执行 dx,mac 需要./dx来执行。
  2. 建议将AndroidSDK/build-tools/<33.0.0的版本号配置到环境变量中。

在这里插入图片描述

如果你的项目使用的 JDK 版本<1.8,你完全可以使用 dx。
如果你的项目使用的 JDK 版本>=1.8,但是不包含 Lambda 等需要脱糖的代码,经实验也可使用 dx。

dx 命令行使用如下:

dx --dex --output=输出 目标.jar

Output name must end with one of: .dex .jar .zip .apk or be a directory.

如:

dx --dex --output=dexlib_dex.jar dexlib.jar

如果报错提示:

Uncaught translation error: com.android.dx.cf.code.SimException: ERROR in com.demon.dexlib.TestActivity.onCreate:(Landroid/os/Bundle;)V: invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13)
1 error; aborting

说明你的项目中有需要脱糖的代码。
虽然可以加上–min-sdk-version=26 去解决报错,继续生成 dex。

dx --dex --min-sdk-version=26  --output=dexlib_dex.jar dexlib.jar

但是运行使用会崩溃,因此慎用!!!

java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup

d8

现在的 Android 项目普遍都是>=JDK1.8,会在 build.gradle 中配置:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget = '1.8'
}

d8 位于AndroidSDK/build-tools/>=28.0.1的版本号中。

  1. windows 电脑可以直接在目录下执行 d8,mac 需要./d8来执行。
  2. 建议将AndroidSDK/build-tools/>=28.0.1的版本号配置到环境变量中。
    在这里插入图片描述

d8 命令行使用如下:

d8 --output 输出 目标.jar

Output must be a .zip or .jar archive or an existing directory

如:

d8 --output dexlib_dex.jar dexlib.jar

参考

U8 打包把 dx 替换为 d8
逆向开发使用 dx.jar、d8.jar、baksmali.jar 将 jar 转 dex 文件,解决 requires --min-sdk-version >= 26 (currently 13)问题
ASM 字节码插桩:从 Lambda 表达式讲起

  • 0
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeMonnnnnn

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值