Android Studio中如何配置代码混淆仅混淆自有业务代码
核心原因
你配置完混淆反编译还是能看到完整原始代码,是因为AGP(Android Gradle插件)7.x版本对debug构建变体默认注入了-dontobfuscate规则,强制关闭混淆,就算你手动开了minifyEnabled true也不生效。另外你之前的混淆规则没有明确划分自有代码和三方库的混淆边界,也缺了Realm这类依赖必须的保留规则。
具体配置步骤
- 修改模块级
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签名可用 } } - 修改
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 - 配置完执行一次clean操作再重新构建debug包,构建完成后打开生成的
full-r8-config.txt,搜索-dontobfuscate关键字,找不到这行就说明混淆规则已经正常加载。 - 验证效果:打开输出的
mapping.txt,查找自有包名下的类,能看到类名、方法名被映射成a/b/c这类短名,就说明自有代码已经被正常混淆,反编译后看不到原始业务逻辑。
注意事项
- 不需要把debug构建的
debuggable设为false,加了上述保留行号的规则后,断点调试、崩溃日志定位都不会受影响。 - 如果自有代码里有通过反射调用的类、四大组件、自定义View、路由类,记得单独加keep规则保留,否则会出现运行时类找不到的错误。
内容的提问来源于stack exchange,提问作者Sujith S Manjavana
相关产品推荐
相关产品推荐

