首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用yGuard混淆Gradle中的Java ~如何排除方法?

使用yGuard混淆Gradle中的Java ~如何排除方法?
EN

Stack Overflow用户
提问于 2020-05-07 14:49:39
回答 1查看 777关注 0票数 1

我想在Gradle中使用yGuard混淆Java代码。到目前为止,我已经成功地使用以下命令实现了混淆:

代码语言:javascript
复制
dependencies {
    compile 'com.yworks:yguard:2.9.2'
}

task yGuardObfuscate {
    group 'yGuard'
    description 'Obfuscates existing archives.'
    dependsOn "installDist"

    doLast {
        ant.taskdef(
            name: 'yguard',
            classname: 'com.yworks.yguard.YGuardTask',
                classpath: sourceSets.main.runtimeClasspath.asPath
            )

        ant.yguard {
            inoutpairs {
                fileset(dir: "./build/install/module") {
                    include(name: "module*.jar")
                    exclude(name: "*_obf.jar")
                }
            }

            rename(logFile: "./build/install/module/rename.log") {
                property(name: "naming-scheme", value: "mix")
            }
        }
    }
}

但是,这有一个问题,即main函数变得模糊,并且我不能再使用java -jar module_obf.jar (它与未混淆的jar一起工作)来运行它。

我尝试了几种从混淆中排除main函数的方法。

首先,我尝试使用文档(https://yworks.github.io/yGuard/task_documentation/#controlling-obfuscation-exclusion-with-annotations)中描述的@Obfuscate注释,如下所示:

代码语言:javascript
复制
  @com.yworks.util.annotation.Obfuscation( exclude = true, applyToMembers = false)
  public static void main(String[] args) {
    try {
      new Start();
    } catch (SQLException e) {
      LOGGER.error(e, e);
    }
  }

在我的IDE (Eclipse 2019-14)中,这一行显示为有效。但是,当尝试使用我创建的gradle任务编译它时,我得到了以下错误:

代码语言:javascript
复制
...\Start.java:22: error: package com.yworks.util.annotation does not exist
  @com.yworks.util.annotation.Obfuscation( exclude = true, applyToMembers = false)
                             ^

我尝试了很多方法来解决这个问题,但是没有找到一个可行的解决方案。

因此,接下来,我尝试在yGuardObfuscate任务中使用keep > method元素来显式保留Start类的main函数,如下所示:

代码语言:javascript
复制
task yGuardObfuscate {
    group 'yGuard'
    description 'Obfuscates existing archives.'
    dependsOn "installDist"

    doLast {
        ant.taskdef(
            name: 'yguard',
            classname: 'com.yworks.yguard.YGuardTask',
                classpath: sourceSets.main.runtimeClasspath.asPath
            )

        ant.yguard {
            inoutpairs {
                fileset(dir: "./build/install/module") {
                    include(name: "module*.jar")
                    exclude(name: "*_obf.jar")
                }
            }

            rename(logFile: "./build/install/module/rename.log") {
                property(name: "naming-scheme", value: "mix")
                keep {
                    method("class": "com.company.project.module.Start", name: "public static void main(String[] args)")
                }
            }
        }
    }
}

这导致Gradle构建失败,出现以下异常:

代码语言:javascript
复制
: java.lang.IllegalArgumentException: '(' expected but found void
[...]
Caused by: java.lang.IllegalArgumentException: '(' expected but found void
    at com.yworks.yguard.ObfuscatorTask.toNativeMethod(ObfuscatorTask.java:188)
    at com.yworks.yguard.ant.MethodSection.addEntries(MethodSection.java:35)
    at com.yworks.yguard.ant.ExposeSection.createEntries(ExposeSection.java:170)
    at com.yworks.yguard.ObfuscatorTask.execute(ObfuscatorTask.java:745)
    at com.yworks.yguard.YGuardTask.execute(YGuardTask.java:116)
[...]
Root cause: java.lang.IllegalArgumentException: '(' expected but found void
    at com.yworks.yguard.ObfuscatorTask.toNativeMethod(ObfuscatorTask.java:188)
    at com.yworks.yguard.ant.MethodSection.addEntries(MethodSection.java:35)
    at com.yworks.yguard.ant.ExposeSection.createEntries(ExposeSection.java:170)
    at com.yworks.yguard.ObfuscatorTask.execute(ObfuscatorTask.java:745)
    at com.yworks.yguard.YGuardTask.execute(YGuardTask.java:116)

再一次,我在这里尝试了几种方法,比如编写不带"“的"class”,添加额外的{},但都没有帮助。

所以这里的问题是:我做错了什么?如何防止yGuard混淆main函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-07 15:08:44

我现在想出了一种让它工作的方法,尽管它感觉更像是一种变通而不是一个适当的解决方案,所以如果有人知道我在“官方”解决方案中做错了什么,请告诉我。

为此,我使用了annotation方法,并且没有使用默认的注释,而是创建了一个与我的项目中的注释几乎完全相同的自定义注释。

注释类如下所示:

代码语言:javascript
复制
package com.company.project.module.annotations;

public @interface Obfuscation {
      boolean exclude() default true;

      boolean applyToMembers() default true;
}

我在Start类中使用它,如下所示:

代码语言:javascript
复制
import com.company.project.module.annotations.*;

[...]

  @Obfuscation( exclude = true, applyToMembers = false)
  public static void main(String[] args) {
    [...]
  }

最后,我将这个自定义注释类添加到任务的rename元素中,如下所示:

代码语言:javascript
复制
            rename(logFile: "./build/install/module/rename.log", annotationClass: "com.company.project.module.annotations.Obfuscation") {
                property(name: "naming-scheme", value: "mix")
            }

因此,整个gradle任务现在看起来像这样:

代码语言:javascript
复制
task yGuardObfuscate {
    group 'yGuard'
    description 'Obfuscates existing archives.'
    dependsOn "installDist"

    doLast {
        ant.taskdef(
            name: 'yguard',
            classname: 'com.yworks.yguard.YGuardTask',
                classpath: sourceSets.main.runtimeClasspath.asPath
            )

        ant.yguard {
            inoutpairs {
                fileset(dir: "./build/install/module") {
                    include(name: "module*.jar")
                    exclude(name: "*_obf.jar")
                }
            }

            rename(logFile: "./build/install/module/rename.log", annotationClass: "com.company.project.module.annotations.Obfuscation") {
                property(name: "naming-scheme", value: "mix")
            }
        }
    }
}

这样,构建就可以工作了,我可以使用java -jar module_obf.jar成功地运行我的程序了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61651538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档