You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中如何配置代码混淆仅混淆自有业务代码

核心原因

你配置完混淆反编译还是能看到完整原始代码,是因为AGP(Android Gradle插件)7.x版本对debug构建变体默认注入了-dontobfuscate规则,强制关闭混淆,就算你手动开了minifyEnabled true也不生效。另外你之前的混淆规则没有明确划分自有代码和三方库的混淆边界,也缺了Realm这类依赖必须的保留规则。

具体配置步骤

  1. 修改模块级build.gradle的buildTypes配置,替换成以下内容:
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources true // 可选,开启资源缩减减小包体积
            // 关键:显式指定混淆规则,覆盖debug默认的不混淆配置
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            testCoverageEnabled false // 关闭测试覆盖率,否则会强制禁用混淆
            signingConfig signingConfigs.debug // 保持debug签名可用
        }
    }
    
  2. 修改proguard-rules.pro规则文件,替换原有规则,注意把com.mypackagename换成你项目真实的根包名:
    # 基础混淆配置
    -optimizationpasses 5
    -dontusemixedcaseclassnames
    -dontskipnonpubliclibraryclasses
    -dontpreverify
    -verbose
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
    -allowaccessmodification
    
    # 保留行号信息,不影响调试和崩溃定位
    -keepattributes SourceFile,LineNumberTable
    -renamesourcefileattribute SourceFile
    
    # 核心规则:保留所有非自有包路径的代码,所有第三方库全部不混淆、不裁剪
    -keep class !com.mypackagename.**,** { *; }
    -keep interface !com.mypackagename.**,** { *; }
    -keep enum !com.mypackagename.**,** { *; }
    
    # 保留自有代码中不能混淆的特殊类
    -keepclassmembers class com.mypackagename.helpers.JavascriptInterface {
       public *;
    }
    
    # Realm数据库必须的保留规则,缺失会导致运行崩溃
    -keep class io.realm.annotations.RealmModule
    -keep @io.realm.annotations.RealmModule class *
    -keep class io.realm.internal.Keep
    -keep @io.realm.internal.Keep class * { *; }
    -dontwarn io.realm.**
    
    # uCrop库保留规则
    -dontwarn com.yalantis.ucrop**
    -keep class com.yalantis.ucrop** { *; }
    -keep interface com.yalantis.ucrop** { *; }
    
    # 输出完整R8配置,方便排查规则问题
    -printconfiguration /Users/sujith/Desktop/R8/full-r8-config.txt
    
  3. 配置完执行一次clean操作再重新构建debug包,构建完成后打开生成的full-r8-config.txt,搜索-dontobfuscate关键字,找不到这行就说明混淆规则已经正常加载。
  4. 验证效果:打开输出的mapping.txt,查找自有包名下的类,能看到类名、方法名被映射成a/b/c这类短名,就说明自有代码已经被正常混淆,反编译后看不到原始业务逻辑。

注意事项

  • 不需要把debug构建的debuggable设为false,加了上述保留行号的规则后,断点调试、崩溃日志定位都不会受影响。
  • 如果自有代码里有通过反射调用的类、四大组件、自定义View、路由类,记得单独加keep规则保留,否则会出现运行时类找不到的错误。

内容的提问来源于stack exchange,提问作者Sujith S Manjavana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:42:15