使用yGuard混淆时如何保留Native(JNI)方法名称?
如何用yGuard批量保留含Native(JNI)方法的类与方法不被混淆?
我正在用yGuard混淆应用Jar包,但含Native(JNI)方法的类和方法绝对不能被重命名,否则应用直接跑不起来。现在不想逐个指定每个方法,有没有批量处理的办法?
当前我的yGuard配置是这样的:
<yguard> <inoutpair in="target/package/protoedit-0.7+.jar" out="target/package/protoedit-0.7+o.jar" /> <rename mainclass="appgui.MainKt"> </rename> </yguard>
执行混淆时收到一堆警告,都是说Native方法所在的类没被保留,比如:
[WARNING] [rename] WARNING: Method selectionChanged_native_cref_QItemSelection_cref_QItemSelection is native but nodemodel/NodeTreeGenerated is not kept/exposed. [WARNING] [rename] WARNING: Method canCollapseParents_native is native but nodemodel/NodeTreeGenerated is not kept/exposed. ...(其余警告省略)
解决方案:批量匹配保留Native相关类与方法
yGuard支持通过规则匹配批量处理,不用逐个列举方法。直接在<rename>标签里添加<keep>规则,利用内置条件筛选所有Native方法及其所在类即可。
修改后的完整配置
<yguard> <inoutpair in="target/package/protoedit-0.7+.jar" out="target/package/protoedit-0.7+o.jar" /> <rename mainclass="appgui.MainKt"> <!-- 批量保留所有含Native方法的类,以及类中的Native方法 --> <keep> <!-- 匹配所有包含Native方法的类,同时保留类名 --> <class name="*"> <method name="*" native="true" /> </class> <!-- 可选:如果类中的字段也需要和JNI交互,保留所有字段 --> <!-- <class name="*"> <field name="*" /> </class> --> </keep> </rename> </yguard>
配置说明
<class name="*">:用通配符*匹配所有类<method name="*" native="true">:筛选所有标记为native的方法,只要类里有这类方法,整个类的名称和这些方法都会被保留,不会被混淆重命名
进阶:按方法名规律匹配
如果你的Native方法有统一命名规律(比如都以_native结尾),还可以用正则表达式精准匹配:
<keep> <class name="*"> <method name=".*_native.*" /> </class> </keep>
这种方式同样能批量锁定符合命名规则的Native方法,自动保留它们所在的类。
内容的提问来源于stack exchange,提问作者user42723
相关产品推荐
相关产品推荐

