You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Studio 4.1.2 Debug构建混淆配置后类名未混淆问题求助

排查Debug模式下Android混淆不生效的问题

我之前也碰到过类似的坑,Debug模式明明开了minifyEnabled true,但类名还是没被混淆,给你一步步梳理排查和解决方法:

1. 确认当前构建变体确实是Debug

先看Android Studio顶部Run按钮旁边的构建变体下拉框,确保选中的是Debug——有时候不小心切到了Release,或者Gradle配置同步后没切换回来,会导致白忙活。

2. 检查ProGuard/R8规则是否意外保留了类名

打开你的proguard-rules.pro文件,排查有没有以下会保留类名的规则:

  • 全局保留包下所有类的规则:-keep class com.your.app.package.** { *; }(这种会完全保留类和方法,不会混淆)
  • 只保留类名的规则:-keepnames class com.your.app.package.**(类名不变,但方法会被混淆)
  • 有没有开启-dontobfuscate?这个指令会直接禁用混淆功能,一定要删掉。

另外,默认的proguard-android-optimize.txt里不会保留你的业务类,所以重点看自己添加的规则。

3. 检查目标类是否带有@Keep注解

如果你的myObj对应的类(或者父类)加了androidx.annotation.Keep或者自定义的@Keep注解,R8/ProGuard会强制保留这个类的完整名称,不会混淆。去检查对应的类文件,去掉不必要的@Keep即可。

4. 确认混淆任务是否实际执行

打开Android Studio的Build窗口(底部栏的Build),搜索minify或者R8,看Debug构建过程中有没有执行MinifyDebugWithR8(Android Studio 4.1.2默认用R8替代ProGuard)任务。如果没看到这个任务:

  • 先执行File -> Sync Project with Gradle Files同步配置
  • 然后执行Build -> Clean Project + Build -> Rebuild Project,强制重新构建

5. 关闭Instant Run(关键!)

Android Studio的Instant Run会跳过部分构建步骤来加快运行速度,其中就包括混淆。如果开了Instant Run,即使你配置了混淆,运行时也会用未混淆的代码。关闭方法:
File -> Settings -> Build, Execution, Deployment -> Instant Run,取消勾选所有Instant Run相关选项,然后Rebuild项目。

6. 验证APK内的类是否真的被混淆

用Android Studio的Build -> Analyze APK功能,选择Debug构建生成的APK(一般在app/build/outputs/apk/debug/目录下),查看classes.dex里的类名。如果APK里的类已经是a.f.c这种混淆后的名字,但运行时simpleName还是原始名,那大概率是Instant Run的残留问题,Clean后再Rebuild就能解决。

最后补充

Debug模式下开启混淆后,调试会变得困难(比如断点找不到、日志类名混乱),如果只是测试混淆效果,也可以直接构建Release包来验证——Release模式下默认的配置通常会更严格,混淆效果更明显。

内容的提问来源于stack exchange,提问作者Lavan

火山引擎 最新活动