文章目录
一、生成 dex 文件
二、生成 dex 文件代码示例
三、生成 dex 结果
参考博客 :
【Android 安全】DEX 加密 ( 常用 Android 反编译工具 | apktool | dex2jar | enjarify | jd-gui | jadx )
【Android 安全】DEX 加密 ( Proguard 简介 | Proguard 相关网址 | Proguard 混淆配置 )
【Android 安全】DEX 加密 ( Proguard 简介 | 默认 ProGuard 分析 )
【Android 安全】DEX 加密 ( Proguard keep 用法 | Proguard 默认混淆结果 | 保留类及成员混淆结果 | 保留注解以及被注解修饰的类/成员/方法 )
【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )
【Android 安全】DEX 加密 ( Proguard 混淆 | 将混淆后的报错信息转为原始报错信息 | retrace.bat 命令执行目录 | 暴露更少信息 )
【Android 安全】DEX 加密 ( DEX 加密原理 | DEX 加密简介 | APK 文件分析 | DEX 分割 )
【Android 安全】DEX 加密 ( 多 DEX 加载 | 65535 方法数限制和 MultiDex 配置 | PathClassLoader 类加载源码分析 | DexPathList )
【Android 安全】DEX 加密 ( 不同 Android 版本的 DEX 加载 | Android 8.0 版本 DEX 加载分析 | Android 5.0 版本 DEX 加载分析 )
【Android 安全】DEX 加密 ( DEX 加密使用到的相关工具 | dx 工具 | zipalign 对齐工具 | apksigner 签名工具 )
【Android 安全】DEX 加密 ( 支持多 DEX 的 Android 工程结构 )
【Android 安全】DEX 加密 ( 代理 Application 开发 | multiple-dex-core 依赖库开发 | 配置元数据 | 获取 apk 文件并准备相关目录 )
【Android 安全】DEX 加密 ( 代理 Application 开发 | 解压 apk 文件 | 判定是否是第一次启动 | 递归删除文件操作 | 解压 Zip 文件操作 )
【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 反射获取系统的 Element[] dexElements )
【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )
【Android 安全】DEX 加密 ( Java 加密工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 ) )
在 【Android 安全】DEX 加密 ( 支持多 DEX 的 Android 工程结构 ) 博客中介绍了 DEX 加密工程的基本结构 ,
app 是主应用 , 其 Module 类型是 “Phone & Tablet Module” ,
multiple-dex-core 是 Android 依赖库 , 其作用是解密并加载多 DEX 文件 , 其 Module 类型是 “Android Library” ,
multiple-dex-tools 是 Java 依赖库 , 其类型是 “Java or Kotlin Library” , 其作用是用于生成主 DEX ( 主 DEX 的作用就是用于解密与加载多 DEX ) , 并且还要为修改后的 APK 进行签名 ;
在 【Android 安全】DEX 加密 ( 代理 Application 开发 | multiple-dex-core 依赖库开发 | 配置元数据 | 获取 apk 文件并准备相关目录 ) 博客中讲解了 multiple-dex-core 依赖库开发 , 每次启动都要解密与加载 dex 文件 , 在该博客中讲解到了 获取 apk 文件 , 并准备解压目录 ;
在 【Android 安全】DEX 加密 ( 代理 Application 开发 | 解压 apk 文件 | 判定是否是第一次启动 | 递归删除文件操作 | 解压 Zip 文件操作 ) 博客中讲解了 apk 文件解压操作 ;
在 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 反射获取系统的 Element[] dexElements )博客中讲解了 dex 文件加载第一阶段 , 获取系统中的 Element[] dexElements ;
在 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 ) 博客中讲解了讲解 dex 文件加载操作 第二阶段 , 创建本应用的 dex 文件数组 Element[] dexElements ;
在 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 将系统的 dexElements 与 应用的 dexElements 合并 | 替换操作 ) 博客中讲解了剩余的两个操作 :
将 系统加载的 Element[] dexElements 数组 与 我们 自己的 Element[] dexElements 数组 进行合并操作 ;
替换 ClassLoader 加载过程中的 Element[] dexElements 数组 ( 封装在 DexPathList 中 )
在 【Android 安全】DEX 加密 ( Java 加密工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 ) ) 博客中介绍 加密解密算法 API , 编译代理 Application 依赖库 , 解压依赖库 aar 文件 ;
本博客中介绍 使用 SDK 中的 dx 工具生成 dex 文件 ;
一、生成 dex 文件
上一篇博客解压了 代理 Application 依赖库 multiple-dex-core-debug.aar , 并获取了其中的 classes.jar 文件 ;
现在开始使用 dx 命令 , 将其转为 dex 文件 ;
dx 具体用法参考 【Android 安全】DEX 加密 ( DEX 加密使用到的相关工具 | dx 工具 | zipalign 对齐工具 | apksigner 签名工具 ) 博客 ;
查看在 Android 应用 Module 下的 build.gradle 中使用的 buildToolsVersion 版本 , 30.0.2 , 之后我们要去 SDK 的 build-tools\30.0.2 目录下查找 dx.bat 工具 , 使用该工具将 classex.jar 转为 classes.dex 文件 ;
dx 工具的实际路径 : D:\001_Programs\001_Android\002_Sdk\Sdk\build-tools\30.0.2\dx.bat
在我的电脑上执行的完整命令行命令是 : D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/dx.bat –dex –output D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-tools\aarUnzip\classes.dex D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-tools\aarUnzip\classes.jar
D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/dx.bat --dex --output D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-tools\aarUnzip\classes.dex D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-tools\aarUnzip\classes.jar
上述命令中所有的 指令 文件 均没有使用环境变量 , 全部都是实际的绝对路径 ;
dx 工具路径 : D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/dx.bat
classes.jar 路径 ( 转换前的文件 ) : D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-tools\aarUnzip\classes.jar
classes.dex 路径 ( 转换后的文件 ) : D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-tools\aarUnzip\classes.dex
Windows 执行 DOS 命令行注意 : 命令之前需要加上 "cmd /c " 信息
Linux 与 MAC 命令行不用添加 , 直接使用命令即可 ;
Windows 中执行的完整命令是 :
cmd /c D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/dx.bat –dex –output D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-tools\aarUnzip\classes.dex D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-tools\aarUnzip\classes.jar