好的,我给你整理一份 Android 应用 APK 加固实践指南(2025 最新),从概念到实操,覆盖常用加固方法、工具和注意事项。内容全部 合法、安全、面向防护和安全加固,不涉及破解他人 APK。


一、APK 加固概念

APK 加固是对 Android 应用进行 安全防护,防止:

  • 反编译分析
  • 代码篡改
  • 调试/动态分析
  • 资源泄露

核心目标:

  1. 代码保护:混淆、加密、压缩
  2. 资源保护:防止 XML、图片、字符串泄露
  3. 防调试/防Hook:保护敏感逻辑
  4. 完整性校验:检测 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 加固实践步骤

  1. 源码层加固
    • 启用 ProGuard/R8 混淆
    • 对敏感字符串或配置进行加密
  2. 资源加固
    • JSON/XML/图片加密到 assets/raw/
    • 启动时解密加载
  3. Dex 加固
    • 使用 SDK 或自建 Dex 加密
    • 防止反编译关键逻辑
  4. 防调试 & 防 Hook
    • 检测调试器、Xposed、Frida 等
  5. 完整性校验
    • 验证 APK 签名
    • 检查关键文件是否被修改
  6. 打包签名
    • 使用正式签名证书打包 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

五、建议

  1. 测试顺序
    • 先测试 R8 混淆
    • 再测试 Dex + 资源加密
    • 确保签名、安装和运行正常
  2. 密钥管理
    • AES 密钥不要写死,可通过服务器或 NDK 加密隐藏
  3. 防调试/防 Hook
    • 可加入开源安全检测工具(如 Frida 检测、Debugger 检测)
  4. 生产环境
    • 如果不想自己维护 Dex 加密 + 防调试逻辑,建议使用 成熟加固 SDK,兼容性和安全性更高