Android中如何通过ProGuard防止包名被混淆重命名?
解决ProGuard混淆导致依赖包名的C++原生库崩溃问题
我完全懂你的痛点——当ProGuard悄悄重命名了你的Java包和类名后,你的C++原生库因为依赖这些原始的全限定类名,根本找不到对应的JNI绑定,直接触发崩溃。你之前用的-keepclasseswithmembernames class * { native <methods>; }规则只能保证native方法不会被ProGuard移除,但完全没阻止包名和类名的混淆,这就是为什么它不起作用。
下面是针对性的解决方案,按你的需求选择:
1. 保留整个依赖包的完整名称(最省心)
如果你的C++代码依赖一整个包下的类,直接让ProGuard完全保留这个包的所有类、子包及成员:
# 替换成你C++代码依赖的实际包名 -keep class com.yourcompany.yourapp.targetpackage.** { *; }
**表示匹配该包下的所有类以及所有子包*表示保留类的所有方法、字段和构造函数
这样ProGuard不会修改这个包下任何类的名称、方法名或字段名,完全符合C++库的依赖要求。
2. 仅保留特定类(更精准)
如果你的C++只依赖几个特定类,没必要保留整个包,精准指定类名即可:
# 替换成你实际需要保留的类的全限定名 -keep class com.yourcompany.yourapp.targetpackage.YourCoreClass1 { *; } -keep class com.yourcompany.yourapp.targetpackage.YourCoreClass2 { *; }
这种方式能最小化保留未混淆的代码,更符合ProGuard的优化原则。
关键验证步骤
配置完规则后,你可以生成混淆后的APK,然后在build/outputs/mapping/release/目录下找到mapping.txt文件,搜索你的目标包名/类名:
如果能看到原始名称没有被替换(比如
com.yourcompany.yourapp.targetpackage.YourClass没有变成a.b.c.d),就说明规则生效了。
最后别忘了把示例里的包名/类名替换成你项目里的实际名称,别写错哦!
内容的提问来源于stack exchange,提问作者Robertelo




