好的,我给你整理一份 Android 应用 APK 加固实践指南(2025 最新),从概念到实操,覆盖常用加固方法、工具和注意事项。内容全部 合法、安全、面向防护和安全加固,不涉及破解他人 APK。
一、APK 加固概念
APK 加固是对 Android 应用进行 安全防护,防止:
- 反编译分析
- 代码篡改
- 调试/动态分析
- 资源泄露
核心目标:
- 代码保护:混淆、加密、压缩
- 资源保护:防止 XML、图片、字符串泄露
- 防调试/防Hook:保护敏感逻辑
- 完整性校验:检测 APK 是否被篡改
二、常用 APK 加固方法
1. 代码混淆(ProGuard / R8)
- 官方工具,随 Android Studio 自带
- 将类、方法名、字段名混淆成无意义名称
- 可去掉无用代码,减小 APK 大小
配置示例 (proguard-rules.pro):
# 保留 Application 类
-keep class com.example.myapp.MyApplication { *; }
# 保留带 @Keep 注解的类和方法
-keep @androidx.annotation.Keep class * { *; }
# 混淆日志方法
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
Android Gradle 默认从 AGP 3.4+ 使用 R8,R8 功能更强大,包含混淆 + 优化 + 压缩
2. 资源加固
- 加密资源文件(如 XML、JSON、图片)
- 运行时解密,防止直接反编译获取敏感信息
- 常用方式:
- 将资源放在
assets/或raw/目录,AES 加密 - App 启动时读取并解密
- 对敏感字符串可使用字符串加密工具
- 将资源放在
3. Dex 加密 + 多 Dex 保护
- 将关键代码加密存储,运行时加载
- 防止
classes.dex被直接反编译 - 常用工具:
- 360 加固保 / 梆梆安全 SDK
- 腾讯加固 / Bugly SDK
- 自建 Dex 加密方案:加密 Dex → 解密加载 ClassLoader
4. 防调试 & 防 Hook
- 检测是否在 模拟器/调试环境
- 检测是否被 Xposed / Frida / Substrate Hook
- 代码示例:
public boolean isDebuggerAttached() {
return android.os.Debug.isDebuggerConnected();
}
- 常见加固 SDK 都有 Hook 检测功能
5. 完整性校验
- 校验 APK 签名是否被篡改
public boolean verifyApkSignature(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
context.getPackageName(), PackageManager.GET_SIGNATURES);
for (Signature signature : packageInfo.signatures) {
// 对比官方签名
String sha256 = sha256(signature.toByteArray());
}
} catch (Exception e) {
return false;
}
return true;
}
- 结合 Dex/资源加密,可以防止篡改后运行
三、常用合法加固工具(2025)
| 工具 / SDK | 功能特点 | 官网 / 文档 |
|---|---|---|
| 360 加固保 | Dex 加密、资源加密、防 Hook、反调试 | https://jiagu.360.cn/ |
| 梆梆安全 SDK | 混淆、Dex 加密、签名校验、Hook 检测 | https://www.bangcle.com/ |
| 腾讯加固 / Bugly | 混淆 + Dex 加密 + 反调试 | https://bugly.qq.com/ |
| AndResGuard | 资源混淆/压缩 | https://github.com/shwenzhang/AndResGuard |
| ProGuard / R8 | 代码混淆 + 优化 | Android Studio 内置 |
注意:生产环境推荐使用 官方或成熟加固 SDK,自定义加固需测试兼容性,否则可能导致 App 崩溃或签名校验失败。
四、APK 加固实践步骤
- 源码层加固
- 启用 ProGuard/R8 混淆
- 对敏感字符串或配置进行加密
- 资源加固
- JSON/XML/图片加密到
assets/或raw/ - 启动时解密加载
- JSON/XML/图片加密到
- Dex 加固
- 使用 SDK 或自建 Dex 加密
- 防止反编译关键逻辑
- 防调试 & 防 Hook
- 检测调试器、Xposed、Frida 等
- 完整性校验
- 验证 APK 签名
- 检查关键文件是否被修改
- 打包签名
- 使用正式签名证书打包 APK
- 测试安装和运行,确保兼容性
五、实践小技巧
- 测试环境先关闭混淆和加固,避免调试困难
- 关键逻辑使用 JNI/NDK 加固,防止 Java 层反编译
- 加固后再次签名和对比 Hash,确保 APK 未损坏
- 兼容性测试:加固后 App 需在各 Android 版本测试安装、启动和功能
六、总结
- APK 加固 = 混淆 + Dex 加密 + 资源保护 + 防调试 + 签名校验
- 生产环境推荐使用 成熟加固 SDK
- 加固是防护手段,不等于绝对安全
- 必须测试 功能完整性、兼容性、性能
好的,我给你整理一份 Android Studio 项目中一键加固 APK 的示例配置,覆盖 R8 混淆 + Dex 加密 + 资源加密,尽量在合法、安全范围内,方便直接在 Gradle 中使用。
一、Gradle 配置:R8 混淆 + 加固准备
1. 在 app/build.gradle 开启混淆
android {
...
buildTypes {
release {
minifyEnabled true // 开启 R8 混淆
shrinkResources true // 去除未使用资源
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
2. proguard-rules.pro 示例
# 保留 Application 类
-keep class com.example.myapp.MyApplication { *; }
# 保留带 @Keep 注解的类和方法
-keep @androidx.annotation.Keep class * { *; }
# 混淆日志方法
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
# 保留 Retrofit/OkHttp 注解
-keep class retrofit2.** { *; }
-keep class okhttp3.** { *; }
# 避免序列化/反射问题
-keepclassmembers class * {
@androidx.annotation.Keep <fields>;
@androidx.annotation.Keep <methods>;
}
二、Dex 加密示例(使用开源工具 MultiDex + AES 加密)
1. 添加 AES 工具类
public class DexEncryptUtil {
public static byte[] encryptDex(byte[] dexBytes, String key) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
return cipher.doFinal(dexBytes);
}
public static byte[] decryptDex(byte[] encryptedBytes, String key) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
return cipher.doFinal(encryptedBytes);
}
}
2. 在 App 启动时解密 Dex
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
try {
byte[] encryptedDex = loadEncryptedDexFromAssets();
byte[] dexBytes = DexEncryptUtil.decryptDex(encryptedDex, "1234567890123456");
loadDex(dexBytes);
} catch (Exception e) {
e.printStackTrace();
}
}
private void loadDex(byte[] dexBytes) {
// 使用 DexClassLoader 加载解密后的 dex
}
}
注意:实际生产环境中,可使用成熟加固 SDK(360 加固、梆梆、腾讯加固)处理 Dex 加密,更稳定。
三、资源加密示例(Assets / Raw 加密)
1. 加密资源
public class ResourceEncryptUtil {
public static byte[] encrypt(byte[] data, String key) { ... } // AES加密
public static byte[] decrypt(byte[] data, String key) { ... } // AES解密
}
2. App 启动时解密加载
InputStream is = getAssets().open("config.json.enc");
byte[] encrypted = new byte[is.available()];
is.read(encrypted);
byte[] decrypted = ResourceEncryptUtil.decrypt(encrypted, "1234567890123456");
四、自动化打包脚本(Gradle Task)
在 app/build.gradle 添加自定义 Task:
task encryptReleaseApk(type: Exec) {
group = "build"
description = "Encrypt APK after release build"
dependsOn 'assembleRelease'
doLast {
def releaseApk = "${buildDir}/outputs/apk/release/app-release.apk"
def encryptedApk = "${buildDir}/outputs/apk/release/app-release-encrypted.apk"
println "Encrypting APK: $releaseApk -> $encryptedApk"
// 调用自定义加密工具脚本
commandLine 'java', '-jar', 'tools/ApkEncryptor.jar', releaseApk, encryptedApk
}
}
执行:
./gradlew encryptReleaseApk
- 先生成 混淆 APK → 再执行 加密 Dex + 资源 → 输出加固 APK
五、建议
- 测试顺序:
- 先测试 R8 混淆
- 再测试 Dex + 资源加密
- 确保签名、安装和运行正常
- 密钥管理:
- AES 密钥不要写死,可通过服务器或 NDK 加密隐藏
- 防调试/防 Hook:
- 可加入开源安全检测工具(如 Frida 检测、Debugger 检测)
- 生产环境:
- 如果不想自己维护 Dex 加密 + 防调试逻辑,建议使用 成熟加固 SDK,兼容性和安全性更高
发表回复