日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 安全】DEX 加密 ( 代理 Application 开发 | multiple-dex-core 依赖库开发 | 配置元数据 | 获取 apk 文件并准备相关目录 )

發布時間:2025/6/17 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 安全】DEX 加密 ( 代理 Application 开发 | multiple-dex-core 依赖库开发 | 配置元数据 | 获取 apk 文件并准备相关目录 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、multiple-dex-core 依賴庫作用
  • 二、配置目錄元數據
  • 三、multiple-dex-core 代理 Application
  • 四、獲取 apk 文件并準備相關目錄
  • 五、相關代碼


參考博客 :

  • 【Android 安全】DEX 加密 ( 常用 Android 反編譯工具 | apktool | dex2jar | enjarify | jd-gui | jadx )

在 【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 進行簽名 ;

本博客中開始講解 multiple-dex-core 依賴庫開發 ;





一、multiple-dex-core 依賴庫作用



在該依賴庫中 , 最主要的是開發一個 代理 Application , 其主要作用有兩個 :

  • 作用一 : 解密并加載多個 DEX 文件 ;

  • 作用二 : 將真實的 Application 替換成應用的主 Application ;





二、配置目錄元數據



此處配置的元數據是開發者配置的 , 解壓 dex 文件的 目的文件夾路徑 ;

該路徑在后面開發時會用到 ;


在 app 的 AndroidManifest.xml 的 application 標簽中配置如下元數據 ,

<!-- app_name 值是該應用的 Application 的真實全類名 --><meta-data android:name="app_name" android:value="kim.hsl.multipledex.ProxyApplication"/><!-- DEX 解密之后的目錄名稱 --><meta-data android:name="app_version" android:value="\1.0"/>

配置后完整的配置文件內容如下 :

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.dex"><applicationandroid:name="kim.hsl.multipledex.ProxyApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><!-- app_name 值是該應用的 Application 的真實全類名真實 Application : kim.hsl.dex.MyApplication代理 Application : kim.hsl.multipledex.ProxyApplication --><meta-data android:name="app_name" android:value="kim.hsl.dex.MyApplication"/><!-- DEX 解密之后的目錄名稱版本號 , 完整目錄名稱為 :kim.hsl.dex.MyApplication_1.0 --><meta-data android:name="app_version" android:value="\1.0"/><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>



三、multiple-dex-core 代理 Application



在 multiple-dex-core 中 , 主要是開發其 代理 Application ,

在 Application 在 ActivityThread 中被創建之后 , 第一個調用的方法是 attachBaseContext 函數 ,

該函數是 Application 中最先執行的函數 ;

因此在 代理 Application 中 , 主要代碼邏輯都是在 attachBaseContext 函數中開發的 ;

public class ProxyApplication extends Application {/*** 在 Application 在 ActivityThread 中被創建之后,* 第一個調用的方法是 attachBaseContext 函數.* 該函數是 Application 中最先執行的函數.*/@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);}}



四、獲取 apk 文件并準備相關目錄



解密與加載多 dex 文件 , 首先要 解密 dex 文件 , 然后 加載解密后的 dex 文件 ;

加密的 dex 文件都在 apk 文件中 , 首先將 apk 文件解壓 , 放到一個指定的目錄中 ;


獲取 apk 文件 : 獲取當前的 APK 文件, 下面的 getApplicationInfo().sourceDir 就是本應用 APK 安裝文件的全路徑 ;

// 獲取當前的 APK 文件, 下面的 getApplicationInfo().sourceDir 就是本應用 APK 安裝文件的全路徑File apkFile = new File(getApplicationInfo().sourceDir);

獲取在 app Module 下的 AndroidManifest.xml 中配置的 元數據 ,

  • ① 應用真實的 Application 全類名
  • ② 解密后的 dex 文件存放目錄

首先獲取應用信息 ApplicationInfo ,

然后獲取應用信息中的元數據 , 該元數據是 Bundle 類型的 ,

最后從 Bundle 元數據中獲取 app_name 和 app_version 對應的值 , 如果有 , 取出并存入成員變量中 ;

// 獲取在 app Module 下的 AndroidManifest.xml 中配置的元數據,// 應用真實的 Application 全類名// 解密后的 dex 文件存放目錄ApplicationInfo applicationInfo = null;applicationInfo = getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);Bundle metaData = applicationInfo.metaData;if (metaData != null) {// 檢查是否存在 app_name 元數據if (metaData.containsKey("app_name")) {app_name = metaData.getString("app_name").toString();}// 檢查是否存在 app_version 元數據if (metaData.containsKey("app_version")) {app_version = metaData.getString("app_version").toString();}}

創建相關的目錄 :


創建用戶的私有目錄 : 將 apk 文件解壓到該目錄中 privateDir 路徑是 : /data/data/kim.hsl.multipledex/kim.hsl.multipledex.ProxyApplication_1.0

其中 /data/data/kim.hsl.multipledex/ 是返回的格式目錄 ,

kim.hsl.multipledex.ProxyApplication_1.0 是從元數據中獲取的目錄 ;

// 創建用戶的私有目錄 , 將 apk 文件解壓到該目錄中File privateDir = getDir(app_name + "_" + app_version, MODE_PRIVATE);

創建解壓后的 apk 文件目錄 : 上述目錄下創建 app 目錄 , 創建該目錄的目的是 存放 解壓后的 apk 文件的 ;

// 在上述目錄下創建 app 目錄// 創建該目錄的目的是存放解壓后的 apk 文件的File appDir = new File(privateDir, "app");

創建 dex 文件目錄 : app 中存放的是解壓后的所有的 apk 文件 , app 下創建 dexDir 目錄 , 將所有的 dex 目錄移動到該 deDir 目錄中 , dexDir 目錄存放應用的所有 dex 文件 , 這些 dex 文件都需要進行解密 ;

// app 中存放的是解壓后的所有的 apk 文件// app 下創建 dexDir 目錄 , 將所有的 dex 目錄移動到該 dexDir 目錄中// dexDir 目錄存放應用的所有 dex 文件// 這些 dex 文件都需要進行解密File dexDir = new File(appDir, "dexDir"); // 創建用戶的私有目錄 , 將 apk 文件解壓到該目錄中File privateDir = getDir(app_name + "_" + app_version, MODE_PRIVATE);Log.i(TAG, "attachBaseContext 創建用戶的私有目錄 : " + privateDir.getAbsolutePath());// 在上述目錄下創建 app 目錄// 創建該目錄的目的是存放解壓后的 apk 文件的File appDir = new File(privateDir, "app");// app 中存放的是解壓后的所有的 apk 文件// app 下創建 dexDir 目錄 , 將所有的 dex 目錄移動到該 dexDir 目錄中// dexDir 目錄存放應用的所有 dex 文件// 這些 dex 文件都需要進行解密File dexDir = new File(appDir, "dexDir");



五、相關代碼



完整相關代碼 :

public class ProxyApplication extends Application {public static final String TAG = "ProxyApplication";/*** 應用真實的 Application 全類名*/String app_name;/*** DEX 解密之后的目錄名稱*/String app_version;/*** 在 Application 在 ActivityThread 中被創建之后,* 第一個調用的方法是 attachBaseContext 函數.* 該函數是 Application 中最先執行的函數.*/@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);try {Log.i(TAG, "attachBaseContext");/*在該 Application 中主要進行兩個操作 :1 . 解密并加載多個 DEX 文件2 . 將真實的 Application 替換成應用的主 Application*//*I . 解密與加載多 DEX 文件先進行解密, 然后再加載解密之后的 DEX 文件1. 先獲取當前的 APK 文件2. 然后解壓該 APK 文件*/// 獲取當前的 APK 文件, 下面的 getApplicationInfo().sourceDir 就是本應用 APK 安裝文件的全路徑File apkFile = new File(getApplicationInfo().sourceDir);// 獲取在 app Module 下的 AndroidManifest.xml 中配置的元數據,// 應用真實的 Application 全類名// 解密后的 dex 文件存放目錄ApplicationInfo applicationInfo = null;applicationInfo = getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);Bundle metaData = applicationInfo.metaData;if (metaData != null) {// 檢查是否存在 app_name 元數據if (metaData.containsKey("app_name")) {app_name = metaData.getString("app_name").toString();}// 檢查是否存在 app_version 元數據if (metaData.containsKey("app_version")) {app_version = metaData.getString("app_version").toString();}}// 創建用戶的私有目錄 , 將 apk 文件解壓到該目錄中File privateDir = getDir(app_name + "_" + app_version, MODE_PRIVATE);Log.i(TAG, "attachBaseContext 創建用戶的私有目錄 : " + privateDir.getAbsolutePath());// 在上述目錄下創建 app 目錄// 創建該目錄的目的是存放解壓后的 apk 文件的File appDir = new File(privateDir, "app");// app 中存放的是解壓后的所有的 apk 文件// app 下創建 dexDir 目錄 , 將所有的 dex 目錄移動到該 dexDir 目錄中// dexDir 目錄存放應用的所有 dex 文件// 這些 dex 文件都需要進行解密File dexDir = new File(appDir, "dexDir");}}

總結

以上是生活随笔為你收集整理的【Android 安全】DEX 加密 ( 代理 Application 开发 | multiple-dex-core 依赖库开发 | 配置元数据 | 获取 apk 文件并准备相关目录 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。