【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件对齐 )



参考博客 :


【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 文件 ;

【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 ) 博客中介绍 使用 SDK 中的 dx 工具生成 dex 文件 ;


【Android 安全】DEX 加密 ( Java 工具开发 | 解压 apk 文件 | 加密生成 dex 文件 | 打包未签名 apk 文件 | 文件解压缩相关代码 ) 博客中讲解 将 app 主应用的 apk 文件解压 , 加密其中的 classes.dex 文件 , 并将代理 Application 依赖库中的 classes.dex 打包到未签名的 apk 文件中 ;


本博客中讲解 apk 文件对齐操作 ;





一、apk 对齐操作



参考 【Android 安全】DEX 加密 ( DEX 加密使用到的相关工具 | dx 工具 | zipalign 对齐工具 | apksigner 签名工具 ) 中的 zipalign 对齐工具 ,


zipalign 工具位置 D:\001_Programs\001_Android\002_Sdk\Sdk\build-tools\30.0.2\zipalign.bat ;


zipalign 命令参考 :

zipalign 4 -v -f in.apk out.apk

zipalign 对齐工具参数设置 :

Usage: zipalign [-f] [-p] [-v] [-z] <align> infile.zip outfile.zip
       zipalign -c [-p] [-v] <align> infile.zip

  <align>: alignment in bytes, e.g. '4' provides 32-bit alignment
  -c: check alignment only (does not modify file)
  -f: overwrite existing outfile.zip
  -p: memory page alignment for stored shared object files
  -v: verbose output
  -z: recompress using Zopfli
  • <align> : 4 4 4 , 表示 32 32 32 位 对齐 ;
  • -c : 只检查对齐 , 不修改文件 ;
  • -f : 如果输出文件已经存在 , 覆盖该文件 ;
  • -v : 输出相关信息
  • -z : 使用 Zopfli 重新压缩文件 ;

一般使用 -f 参数配置 ;

注意上述参数的使用顺序 , 必须按照 [-f] [-p] [-v] [-z] <align> 顺序使用参数 ;





二、apk 对齐命令



完整绝对路径执行的命令 ( 仅做参考 ) :

D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/zipalign -f 4 D:\002_Project\002_Android_Learn\DexEncryption\app\build\outputs\apk\debug\app-unsigned.apk D:\002_Project\002_Android_Learn\DexEncryption\app\build\outputs\apk\debug\app-unsigned-aligned.apk

参数说明 :

D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/zipalign 是 zipalign.exe 工具的完整绝对路径 ;

-f 参数代表 , 如果存在输出文件 , 则覆盖该文件 ;

4 表示 32 位对齐 ;

D:\002_Project\002_Android_Learn\DexEncryption\app\build\outputs\apk\debug\app-unsigned.apk 表示被对齐的 apk 文件 的 绝对路径 ;

D:\002_Project\002_Android_Learn\DexEncryption\app\build\outputs\apk\debug\app-unsigned-aligned.apk 表示对齐后的输出文件的 绝对路径 ;





三、apk 对齐操作代码示例



对齐操作代码示例 :

    /*
        4 . 对齐操作
     */
    // 对齐操作的输出结果, 将 app-unsigned.apk 对齐, 对齐后的文件输出到 app-unsigned-aligned.apk 中
    var unSignedAlignApk = File("app/build/outputs/apk/debug/app-unsigned-aligned.apk")

    // 打印要执行的命令
    println("cmd /c D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/zipalign -f 4 ${unSignedApk.absolutePath} ${unSignedAlignApk.absolutePath}")

    /*
        将 app-unsigned.apk 对齐
        使用 zipalign 工具命令

        注意 : Windows 命令行命令之前需要加上 "cmd /c " 信息 , Linux 与 MAC 命令行不用添加
     */
    process = Runtime.getRuntime().exec("cmd /c D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/zipalign -f 4 ${unSignedApk.absolutePath} ${unSignedAlignApk.absolutePath}")
    // 等待上述命令执行完毕
    process.waitFor()

    // 执行结果提示
    if(process.exitValue() == 0){
        println("对齐操作 执行成功");
    } else {
        println("对齐操作 执行失败");
    }




四、apk 对齐执行结果



执行结果 : 红色矩形框就是对齐后生成的 app-unsigned-aligned.apk 文件 ;

在这里插入图片描述

命令行输出 :

cmd /c D:/001_Programs/001_Android/002_Sdk/Sdk/build-tools/30.0.2/zipalign -f 4 D:\002_Project\002_Android_Learn\DexEncryption\app\build\outputs\apk\debug\app-unsigned.apk D:\002_Project\002_Android_Learn\DexEncryption\app\build\outputs\apk\debug\app-unsigned-aligned.apk
对齐操作 执行成功
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页