You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:43:19