Search code examples
javajava-native-interfaceobfuscationyguard

How can I keep native (JNI) method names when obfuscating with yGuard?


I'm trying to obfuscate the jar file of my application using yGuard.

Native (JNI) methods and the classes that contain them should not be renamed, because then the application does not work anymore.

How can I do this without specifying the methods one by one?

My configuration is currently like this:

<yguard>
    <inoutpair in="target/package/protoedit-0.7+.jar" out="target/package/protoedit-0.7+o.jar" />
    <rename mainclass="appgui.MainKt">
    </rename>
</yguard>

When I run the obfuscation, I get warnings about native methods being renamed, but I could not find how to prevent this. Here the relevant part of the Maven output:

[INFO] --- maven-antrun-plugin:3.1.0:run (obfuscate) @ protoedit ---
[INFO] Executing tasks
[INFO]    [rename] yGuard Obfuscator v4.0.0 - https://www.yworks.com/products/yguard
[INFO] Parsing jar C:\Users\Paul\Documents\protoedit\app\target\package\protoedit-0.7+.jar
[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.
[WARNING]    [rename] WARNING: Method canCollapseChildren_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method collapseOthers_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method expandRecursively_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method delayLayout_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method collapseChildren_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method canExpand_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method initialize_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method collapseChildrenRecursively_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method collapseParents_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method show_native___int64_bool is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method canCollapseOthers_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method collapseOthersRecursively_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method updated_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method expand_native is native but nodemodel/NodeTreeGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method updated_native is native but nodemodel/NodeTreeGenerated$ConcreteWrapper is not kept/exposed.
[WARNING]    [rename] WARNING: Method createCppObject is native but nodemodel/Node is not kept/exposed.
[WARNING]    [rename] WARNING: Method initialize_native is native but nodemodel/NodeModelGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method index_native_int_int_cref_QModelIndex_constfct is native but nodemodel/NodeModelGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method replace_native___int64___int64 is native but nodemodel/NodeModelGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method parent_native_cref_QModelIndex_constfct is native but nodemodel/NodeModelGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method nodeCount_native is native but nodemodel/NodeModelGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method rowCount_native_cref_QModelIndex_constfct is native but nodemodel/NodeModelGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method hasChildren_native_cref_QModelIndex_constfct is native but nodemodel/NodeModelGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method columnCount_native_cref_QModelIndex_constfct is native but nodemodel/NodeModelGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method data_native_cref_QModelIndex_int_constfct is native but nodemodel/NodeModelGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method setNodeCount_native_int is native but nodemodel/NodeModelGenerated is not kept/exposed.
[WARNING]    [rename] WARNING: Method removeChildren is native but nodemodel/NodeKt is not kept/exposed.
[WARNING]    [rename] WARNING: Method moveChildren is native but nodemodel/NodeKt is not kept/exposed.
[WARNING]    [rename] WARNING: Method getJavaObject is native but nodemodel/NodeKt is not kept/exposed.
[WARNING]    [rename] WARNING: Method insertChildren is native but nodemodel/NodeKt is not kept/exposed.
[WARNING]    [rename] WARNING: Method deleteCppObject is native but nodemodel/NodeKt is not kept/exposed.
[WARNING]    [rename] WARNING: Method internalAccess is native but nodemodel/QtJambi_LibraryUtilities is not kept/exposed.
[WARNING]    [rename] WARNING: Method getVisible is native but nodemodel/NodetreeKt is not kept/exposed.
[WARNING]    [rename] WARNING: Method cleanUp is native but nodemodel/NodetreeKt is not kept/exposed.
[WARNING]    [rename] WARNING: Method getSelected is native but nodemodel/NodetreeKt is not kept/exposed.
[INFO] Obfuscating Jar C:\Users\Paul\Documents\protoedit\app\target\package\protoedit-0.7+.jar to protoedit-0.7+o.jar
[INFO] Executed tasks

Solution

  • Okay, it's not as bad as I thought. yGuard does automatically prevent native methods from being renamed. You only have to specify the classes manually. So in my case the configuration becomes:

    <yguard>
        <inoutpair in="target/package/protoedit-0.7+.jar" out="target/package/protoedit-0.7+o.jar" />
        <rename mainclass="appgui.MainKt">
            <keep>
                <class name="nodemodel.Node" />
                <class name="nodemodel.NodeKt" />
                <class name="nodemodel.NodeModelGenerated" />
                <class name="nodemodel.NodeTreeGenerated" />
                <class name="nodemodel.NodeTreeGenerated$ConcreteWrapper" />
                <class name="nodemodel.NodetreeKt" />
                <class name="nodemodel.QtJambi_LibraryUtilities" />
            </keep>
        </rename>
    </yguard>