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

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

火山引擎 最新活动