我正在用 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 的文档中获得理解。 任何提示和帮助将不胜感激!
我找到了一种解决方案,如何配置 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"
)
}
}
...