文章目录
一、DEX 加密简介
二、APK 文件分析
三、DEX 分割
一、DEX 加密简介
Proguard 混淆弊端 : 之前使用 Proguard 混淆 后的代码 , 虽然降低了代码的可读性 , 但是如果多花点时间和精力 , 还是可以读懂的 , 因此这里继续进行下一个操作 , DEX 加密 , 经过加密后的 DEX 文件 , 就 无法被反编译工具反编译出来了 ;
DEX 加密 : 经过加密后的 DEX 文件 , 就是被破坏了原有格式的 DEX 文件 , 该 DEX 文件不是标准的 DEX 文件 ;
Android 启动从 Application 开始 , 然后会查找主 Activity 界面 启动 ;
DEX 加密的情况下 Android 的工程结构 :
应用主工程 , 该工程中有一个开发者开发的 Application , MyApplication ;
依赖的库 Library , 在该工程中有一个代理 Application , ProxyApplication ;
主工程中 , 不需要进入加密解密先关的库 , 应用主工程的开发流程不变 ,
二、APK 文件分析
Android 安装文件 APK 分析 : APK 文件本质是一个 ZIP 包 , 包含如下内容 ;
AndroidManifest.xml : 应用/组件配置文件 ;
resource.arsc
classes.dex : 封装 Java / Kotlin 代码 ;
三、DEX 分割
classes.dex 可以进行分割 :
不分割的情况 : 一般情况下 所有代码都在一个 DEX 下 ;
分割的情况 : 该 DEX 可以分割成两部分 , 其中 一个只包含启动 Application , 另一个 DEX 包含其他代码 ;
DEX 加密解密 :
分割后加密 : 分割后的 DEX , 只包含启动 Application 保持不变 , 另一个 DEX 可以拿去加密 ;
启动时解密 : 启动时 , 主 DEX 执行 Application 时 , 会解密另外一个被加密的 DEX , 并加载到 ClassLoader 中 ;
DEX 分割的必要性 : 如果在 主 DEX 中的 Application 中 , 引用了很多类 , 此时就必须将引用的类放在主 DEX 中 , 这样就使得加密的类变少了 ;
上述问题解决方案 : 编写一个额外的代理 Application , 该 Application 专门用于解密 DEX , 将该代理 Application 制作成主 DEX , 其它的所有代码都放在另外一个 DEX 中 , 进行加密 ;
DEX 加密的优势 : 这样就可以将所有的功能性代码放在加密后的 DEX 中 , 只有代理 Application 暴露在外面 , 反编译该应用 , 只能看到用于解密的 代理 Application 类 , 其它的代码都在加密的 DEX 中 ;