【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件对齐 )
文章目錄
- 一、apk 對齊操作
- 二、apk 對齊命令
- 三、apk 對齊操作代碼示例
- 四、apk 對齊執行結果
參考博客 :
- 【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 加密 ( Java 工具開發 | 生成 dex 文件 | Java 命令行執行 )
- 【Android 安全】DEX 加密 ( Java 工具開發 | 解壓 apk 文件 | 加密生成 dex 文件 | 打包未簽名 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.apkzipalign 對齊工具參數設置 :
Usage: zipalign [-f] [-p] [-v] [-z] <align> infile.zip outfile.zipzipalign -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> : 444 , 表示 323232 位 對齊 ;
- -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 對齊操作 執行成功總結
以上是生活随笔為你收集整理的【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件对齐 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 安全】DEX 加密 (
- 下一篇: 【Android 安全】DEX 加密 (