【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 )(二)

简介: 【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 )(二)

二、生成 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


目录
相关文章
|
人工智能 前端开发 Java
2025年WebStorm高效Java开发全指南:从配置到实战
WebStorm 2025不仅是一款强大的JavaScript IDE,也全面支持Java开发。本文详解其AI辅助编程、Java特性增强及性能优化,并提供环境配置、高效开发技巧与实战案例,助你打造流畅的全栈开发体验。
979 4
|
前端开发 JavaScript Java
Java 开发中 Swing 界面嵌入浏览器实现方法详解
摘要:Java中嵌入浏览器可通过多种技术实现:1) JCEF框架利用Chromium内核,适合复杂网页;2) JEditorPane组件支持简单HTML显示,但功能有限;3) DJNativeSwing-SWT可内嵌浏览器,需特定内核支持;4) JavaFX WebView结合Swing可完美支持现代网页技术。每种方案各有特点,开发者需根据项目需求选择合适方法,如JCEF适合高性能要求,JEditorPane适合简单展示。(149字)
1472 1
|
10月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
安全 Java 领域建模
Java 17 探秘:不容错过的现代开发利器
Java 17 探秘:不容错过的现代开发利器
1292 0
|
11月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
504 3
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
521 2
|
11月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
412 0

热门文章

最新文章