gradle kotlin-script 中公共库 (JAR) 的 yGuard 配置

问题描述 投票:0回答:1

我正在用 kotlin 构建一个库(JAR),应该对其进行混淆。 (目前)有一个类和一个方法应该能够从外部调用。

为了混淆,我想使用 yGuard 和 gradle (kotlin)

我的 build.gradle.kts yGuard 配置如下所示:

...

configurations {
    create("yguard")
}

...

dependencies {
...
    "yguard"("com.yworks:yguard:4.1.1") // obfuscation
...
}


tasks.register("obfuscate") {
    dependsOn(tasks.jar)
    group = "yGuard"
    description = "Obfuscates the java archive."

    doLast {
        val archivePath = tasks.jar.get().archiveFile.get().asFile.path
        val unobfJar = archivePath.replace(".jar", "_unobf.jar")

        ant.withGroovyBuilder {
            "move"("file" to archivePath, "tofile" to unobfJar, "verbose" to true)

            "taskdef"(
                "name" to "yguard",
                "classname" to "com.yworks.yguard.YGuardTask",
                "classpath" to configurations["yguard"].asPath
            )

            "yguard" {
                "inoutpair"("in" to unobfJar, "out" to archivePath)

                // Prevent yGuard from removing "Deprecated" attributes from .class files.
                "attribute"("name" to "Deprecated")

                "rename"("logfile" to "${projectDir}/build/${rootProject.name}_renamelog.xml") {
                    // Obfuscation settings
                    "keep" {
                        "method"(
                            "name" to "boolean doProcess()",
                            "class" to "my.x.y.ProcessUtil"
                        )
                    }
                }
//                "shrink"("logfile" to "${projectDir}/build/${rootProject.name}_shrinklog.xml") {
//                }
            }
        }
    }

班级:

package my.x.y

class ProcessUtil(
    private val param1: Object,
    private val param2: Object,
) {

    fun doProcess(
       private val paramX: Object
    ) {
       ...
    }
}

此配置运行成功,但所有内容都被混淆为 A.A.A 等包名称。
我陷入了如何在“重命名”和/或“收缩”部分中定义类和方法以混淆所有代码除了一个类和方法。

不幸的是无法从 yGuard 的文档中获得理解。 任何提示和帮助将不胜感激!

kotlin gradle jar obfuscation yguard
1个回答
0
投票

我找到了一种解决方案,如何配置 yGuard 以排除类中的一个方法:

            ...
            "rename"("logfile" to "${projectDir}/build/${rootProject.name}_renamelog.xml") {
                "keep" {
                    "class"(
                        "name" to "my.x.y.ProcessUtil",
                    )
                    "method"(
                        "name" to "boolean doProcess()",
                        "class" to "my.x.y.ProcessUtil"
                    )
                }

            }
            ...
© www.soinside.com 2019 - 2024. All rights reserved.