二、生成 dex 文件代码示例
创建 classes.jar ( dex 转换前的文件 ) , classes.dex ( dex转换后的文件 ) 文件对象 , 使用这两个文件对象获取完整路径 ;
// 拿到 multiple-dex-core-debug.aar 中解压出来的 classes.jar 文件 var classesJarFile = File(aarUnzip, "classes.jar") // 创建转换后的 dex 目的文件, 下面会开始创建该 dex 文件 var classesDexFile = File(aarUnzip, "classes.dex")
Java 代码中调用命令行执行 : 使用 Runtime.getRuntime().exec("") 执行命令行 ;
var process = Runtime.getRuntime().exec("cmd /c D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/dx.bat --dex --output ${classesDexFile.absolutePath} ${classesJarFile.absolutePath}")
等待命令行执行完毕 : process.waitFor() 等待执行完毕 ;
// 等待上述命令执行完毕 process.waitFor()
最后查看命令行执行结果 : 如果执行成功 , process.exitValue() 返回值为 0 , 反之不为 0 ;
// 执行结果提示 if(process.exitValue() == 0){ println("执行成功"); }else{ println("执行失败"); }
生成 dex 文件的完整代码 :
fun main() { /* 1 . 生成 dex 文件 , 该 dex 文件中只包含解密 其它 dex 的功能 编译工程 会生成 Android 依赖库的 aar 文件 生成目录是 module/build/outputs/aar/ 目录下 前提是需要在 菜单栏 / File / Setting / Build, Execution, Deployment / Compiler 设置界面中 , 勾选 Compile independent modules in parallel (may require larger ) 将 D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-core\build\outputs\aar 路径下的 multiple-dex-core-debug.aar 文件后缀修改为 .zip 解压上述文件 拿到 classes.jar 文件即可 ; */ // 获取 multiple-dex-core-debug.aar 文件对象 var aarFile = File("multiple-dex-core/build/outputs/aar/multiple-dex-core-debug.aar") // 解压上述 multiple-dex-core-debug.aar 文件到 aarUnzip 目录中 // 创建解压目录 var aarUnzip = File("multiple-dex-tools/aarUnzip") // 解压操作 unZipAar(aarFile, aarUnzip) // 拿到 multiple-dex-core-debug.aar 中解压出来的 classes.jar 文件 var classesJarFile = File(aarUnzip, "classes.jar") // 创建转换后的 dex 目的文件, 下面会开始创建该 dex 文件 var classesDexFile = File(aarUnzip, "classes.dex") // 打印要执行的命令 println("cmd /c D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/dx.bat --dex --output ${classesDexFile.absolutePath} ${classesJarFile.absolutePath}") /* 将 jar 包变成 dex 文件 使用 dx 工具命令 注意 : Windows 命令行命令之前需要加上 "cmd /c " 信息 , Linux 与 MAC 命令行不用添加 */ var process = Runtime.getRuntime().exec("cmd /c D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/dx.bat --dex --output ${classesDexFile.absolutePath} ${classesJarFile.absolutePath}") // 等待上述命令执行完毕 process.waitFor() // 执行结果提示 if(process.exitValue() == 0){ println("执行成功"); }else{ println("执行失败"); } }
三、生成 dex 结果
控制台打印结果 :
D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\bin\java.exe -javaagent:D:\001_Programs\001_Android\004_AndroidStudio_4.1\lib\idea_rt.jar=53488:D:\001_Programs\001_Android\004_AndroidStudio_4.1\bin -Dfile.encoding=UTF-8 -classpath D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\charsets.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\access-bridge-64.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\cldrdata.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\dnsns.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\jaccess.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\localedata.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\nashorn.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\sunec.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\sunjce_provider.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\sunmscapi.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\sunpkcs11.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\ext\zipfs.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\jce.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\jsse.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\management-agent.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\resources.jar;D:\001_Programs\001_Android\004_AndroidStudio_4.1\jre\jre\lib\rt.jar;D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-tools\build\classes\kotlin\main;D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-tools\build\libs\multiple-dex-tools.jar;C:\Users\octop\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk7\1.3.61\70dffc5f8ac5ea7c34f30deac5b9d8b1d48af066\kotlin-stdlib-jdk7-1.3.61.jar;C:\Users\octop\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib\1.3.61\4702105e97f7396ae41b113fdbdc180ec1eb1e36\kotlin-stdlib-1.3.61.jar;C:\Users\octop\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-common\1.3.61\65abb71d5afb850b68be03987b08e2c864ca3110\kotlin-stdlib-common-1.3.61.jar;C:\Users\octop\.gradle\caches\modules-2\files-2.1\org.jetbrains\annotations\13.0\919f0dfe192fb4e063e7dacadee7f8bb9a2672a9\annotations-13.0.jar kim.hsl.multiple_dex_tools.AESKt 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 执行成功 Process finished with exit code 0
aar 文件解压及 dx 转换 :
下图中的 aarUnzip 是解压的结果 ; ( 蓝色矩形框 )
classes.dex 是将 aar 解压后的 classes.jar 转为 dex 的结果 , ( 红色矩形框 ) , 执行的命令是
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