技术文档
Android 应用加固推荐方案(APK / AAB)
Android 应用包(APK / AAB)的 Dex 加密、反调试、反注入与 Root 检测组合,含 SO 保护、重签名、流水线与测试矩阵。
最后更新于 2025-06-06预计阅读 6 分钟
本文针对 Android 应用包(APK / AAB) 的整体加固,覆盖 Dex、资源、签名与包结构。只需要保护 JNI
.so时,请阅读 Android Native ELF 加固推荐方案(JNI .so)。
1. 适用范围
| 项目 | 范围 |
|---|---|
| 包格式 | APK、AAB(App Bundle) |
| 系统版本 | Android 5.0 及以上(建议以应用自身 minSdk 为准) |
| ABI | arm64-v8a(必测)、armeabi-v7a、x86_64(模拟器 / 平板) |
| 开发框架 | 原生 Android、Flutter、React Native、Unity(Android 构建) |
2. 攻击面与保护点
| 攻击面 | 风险 | 对应能力 |
|---|---|---|
classes*.dex | 反编译、改包、注入逻辑 | Dex 加密 |
| 资源与配置 | 替换图标、接口地址、密钥 | 资源保护(按版本能力) |
lib/*/lib*.so | 逆向核心算法、Hook | .so 符号移除 / 混淆 / 虚拟化 |
| 运行时 | 调试器附加、Frida 注入 | 反调试、反注入 |
| 设备环境 | Root、模拟器、多开 | Root 检测、模拟器检测 |
| 界面 | 截屏、录屏泄露 | 反截屏 |
| 签名 | 二次打包、重签名分发 | 签名校验 + 服务端校验 |
3. 保护选项
| 选项 | 作用 | 默认 | 建议 |
|---|---|---|---|
| Dex 加密 | 加密 classes.dex,运行时解密加载 | 开 | 保持开启 |
| 反调试 | 检测调试器与调试端口 | 关 | 发布版开启 |
| 反注入 | 检测 Frida、Xposed 等注入框架 | 关 | 金融、游戏开启 |
| Root 检测 | 检测设备是否已 Root | 关 | 金融、支付开启;工具类谨慎 |
| 模拟器检测 | 检测模拟器 / 云手机 | 关 | 游戏、风控开启;开发包关闭 |
| 反截屏 | 阻止截屏与录屏 | 关 | 内容、金融开启 |
环境检测类选项可能影响无障碍工具、远程协助、部分厂商系统和自动化测试。上线前务必在真实设备上验证。
4. 推荐配置
4.1 工具 / 内容类
| 选项 | 设置 |
|---|---|
| Dex 加密 | 开 |
| 反调试 | 开 |
| 反注入 | 视风险 |
| Root 检测 | 关(避免误伤) |
| 模拟器检测 | 关 |
| 反截屏 | 视内容敏感度 |
目标:防止直接反编译和改包,同时保持最大兼容性。
4.2 金融 / 支付类
| 选项 | 设置 |
|---|---|
| Dex 加密 | 开 |
| 反调试 | 开 |
| 反注入 | 开 |
| Root 检测 | 开 |
| 模拟器检测 | 开 |
| 反截屏 | 开 |
.so 保护 | 关键风控、签名库开启 |
配套要求:
- 关键判断放服务端,客户端检测只作为风险信号。
- Root / 模拟器检测提供降级策略,避免直接拒绝导致客诉。
- 保留白名单机制,便于客服排查。
4.3 游戏类
| 选项 | 设置 |
|---|---|
| Dex 加密 | 开 |
| 反调试 | 开 |
| 反注入 | 开 |
| Root 检测 | 视外挂风险 |
| 模拟器检测 | 开(按运营策略) |
.so 保护 | 核心战斗、加密、反作弊模块 |
游戏还需要关注:
- IL2CPP 的
libil2cpp.so与global-metadata.dat。 - 资源包与热更新校验。
- 多平台渠道包的签名差异。
5. Native SO 加固
APK 中的 .so 是标准 ELF,可以按 Android Native ELF 加固推荐方案(JNI .so)处理:
- 解包 APK,取出
lib/<abi>/lib*.so。 - 使用 Native ELF 方案做符号移除、函数混淆或虚拟化。
- 替换回原 ABI 目录,保持目录结构和文件名不变。
- 重新打包、对齐、签名。
- 在真机验证 JNI 加载和核心功能。
需要重点验证:
JNI_OnLoad、Java_*导出符号是否仍可解析。System.loadLibrary的加载顺序与依赖.so。- 不同 ABI 是否都处理,尤其是 64 位设备加载
arm64-v8a。 - 崩溃栈是否还能映射到符号(保留未 strip 版本)。
只保护
.so而不保护 Dex,攻击者仍可修改 Java / Kotlin 层逻辑。建议 Dex 与.so组合使用。
6. 签名与分发
6.1 签名方案
- 使用 APK Signature Scheme v2 / v3,保留 v1 仅用于兼容极旧系统。
- 加固改变包内容后,必须使用原签名证书重新签名,否则无法覆盖安装。
- 证书和密钥存放在受控的密钥管理系统中,不要提交到代码仓库。
6.2 重签名流程
# 1. 对齐(在签名之前)
zipalign -p -f 4 app-protected-unsigned.apk app-protected-aligned.apk
# 2. 签名
apksigner sign \
--ks release.jks \
--ks-key-alias release \
--out app-protected.apk \
app-protected-aligned.apk
# 3. 校验
apksigner verify --print-certs app-protected.apk
6.3 AAB
AAB 不能直接安装到设备。测试流程:
# 生成 APKS
bundletool build-apks \
--bundle=app-protected.aab \
--output=app-protected.apks \
--ks=release.jks \
--ks-key-alias=release
# 安装到已连接设备
bundletool install-apks --apks=app-protected.apks
注意:
- Google Play 会使用上传密钥重新签名分发包,本地测试签名与商店签名可能不同。
- 如果使用 Play App Signing,确保加固流程不影响上传密钥签名。
- 分渠道包需要分别验证。
7. 构建流水线
Gradle assembleRelease / bundleRelease
↓
原始包冒烟测试
↓
Sugo 保护(Dex 加密 + 环境检测)
↓
zipalign
↓
apksigner(原证书)
↓
真机回归
↓
分发 / 上架
流水线建议:
- 把加固步骤放在
assembleRelease之后、签名之前。 - 每次构建使用独立的输出目录,避免旧包覆盖。
- 记录输入包、输出包的 SHA-256 和使用的保护配置。
- 对保护后的包执行自动化 UI 冒烟测试,不要只校验签名。
- 保留 mapping 文件与未加固包,便于崩溃还原和回滚。
8. 测试矩阵
| 维度 | 覆盖建议 |
|---|---|
| 系统版本 | minSdk、Android 10、12、14、最新版本 |
| ABI | arm64-v8a、armeabi-v7a、x86_64 |
| 设备类型 | 主流厂商真机、折叠屏、平板、低内存设备 |
| 安装方式 | 全新安装、覆盖安装、卸载重装 |
| 签名 | 正式证书、Play App Signing |
| 网络 | Wi-Fi、移动网络、弱网、代理 |
| 场景 | 冷启动、登录、支付、推送、分享、升级 |
| 安全环境 | Root、模拟器、多开、Frida(验证检测策略) |
9. 常见问题
9.1 保护后安装失败
- 签名不一致:确认使用原证书,且 v2 / v3 签名有效。
- 未对齐:签名前执行
zipalign。 - 包结构被破坏:确认加固工具输出的是完整 APK,而不是仅替换了部分文件。
- 覆盖安装失败:先卸载旧版本再试,确认是否签名证书变化。
9.2 启动崩溃
- 检查 Dex 加密与多 Dex、动态加载、插件框架是否兼容。
- 检查
.so是否与 ABI 匹配,是否遗漏某个 ABI。 - 关闭反调试、Root 检测、模拟器检测,缩小范围。
- 用
adb logcat抓取崩溃栈,保留原始包对比。
9.3 加固后无法上架 Google Play
- 确认上传的是 AAB,且签名配置正确。
- 检查是否包含动态代码下发、权限或隐私违规。
- 检查 64 位支持与目标 API 级别要求。
- 环境检测不能用于规避审核或隐藏功能。
9.4 Root 检测误报
- 部分定制系统、开发版系统、企业设备会命中。
- 提供降级策略:提示风险但允许继续使用。
- 保留客服白名单或远程配置开关。
- 在真实用户设备上收集误报样本。
9.5 性能下降
- Dex 加密会增加启动时的解密与加载时间。
- 反注入、内存扫描类能力会带来运行时开销。
- 在低端机上重点测试冷启动和首屏渲染。
- 如果开销不可接受,优先保留 Dex 加密与反调试,调整环境检测频率。
9.6 多渠道包如何保护
- 先保护基础包,再按渠道写入渠道信息并重新签名。
- 或每个渠道独立保护,确保渠道信息写入后再签名。
- 不要复用已签名包直接改渠道信息,会破坏签名。
10. 相关文档
这份文档有帮助吗?欢迎反馈文档问题或补充场景。提交文档反馈