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

使用yGuard混淆Gradle中的Java~如何排除方法?,java,gradle,obfuscation,yguard,Java,Gradle,Obfuscation,Yguard,我想用yGuard混淆Gradle中的Java代码。到目前为止,我已经通过以下方法成功地实现了模糊处理: dependencies { compile 'com.yworks:yguard:2.9.2' } task yGuardObfuscate { group 'yGuard' description 'Obfuscates existing archives.' dependsOn "installDist" doLast { a

我想用yGuard混淆Gradle中的Java代码。到目前为止,我已经通过以下方法成功地实现了模糊处理:

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模块_obf.jar
(它与未模糊的jar一起工作)运行它

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

首先,我尝试使用文档()中描述的@Obfuscate注释,如下所示:

  @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);
    }
  }
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)")
                }
            }
        }
    }
}
package com.company.project.module.annotations;

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

      boolean applyToMembers() default true;
}
import com.company.project.module.annotations.*;

[...]

  @Obfuscation( exclude = true, applyToMembers = false)
  public static void main(String[] args) {
    [...]
  }
            rename(logFile: "./build/install/module/rename.log", annotationClass: "com.company.project.module.annotations.Obfuscation") {
                property(name: "naming-scheme", value: "mix")
            }
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")
            }
        }
    }
}
在我的IDE(Eclipse2019-14)中,这一行显示为有效。但是,当尝试使用我创建的gradle任务编译它时,我得到了以下错误:

...\Start.java:22: error: package com.yworks.util.annotation does not exist
  @com.yworks.util.annotation.Obfuscation( exclude = true, applyToMembers = false)
                             ^
我尝试了很多方法来实现这一点,但没有找到有效的解决方案

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

  @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);
    }
  }
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)")
                }
            }
        }
    }
}
package com.company.project.module.annotations;

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

      boolean applyToMembers() default true;
}
import com.company.project.module.annotations.*;

[...]

  @Obfuscation( exclude = true, applyToMembers = false)
  public static void main(String[] args) {
    [...]
  }
            rename(logFile: "./build/install/module/rename.log", annotationClass: "com.company.project.module.annotations.Obfuscation") {
                property(name: "naming-scheme", value: "mix")
            }
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")
            }
        }
    }
}
这导致Gradle生成失败,出现以下异常:

: 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混淆
主功能呢?

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

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

注释类如下所示:

  @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);
    }
  }
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)")
                }
            }
        }
    }
}
package com.company.project.module.annotations;

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

      boolean applyToMembers() default true;
}
import com.company.project.module.annotations.*;

[...]

  @Obfuscation( exclude = true, applyToMembers = false)
  public static void main(String[] args) {
    [...]
  }
            rename(logFile: "./build/install/module/rename.log", annotationClass: "com.company.project.module.annotations.Obfuscation") {
                property(name: "naming-scheme", value: "mix")
            }
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")
            }
        }
    }
}
我在入门课上使用它,如下所示:

  @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);
    }
  }
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)")
                }
            }
        }
    }
}
package com.company.project.module.annotations;

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

      boolean applyToMembers() default true;
}
import com.company.project.module.annotations.*;

[...]

  @Obfuscation( exclude = true, applyToMembers = false)
  public static void main(String[] args) {
    [...]
  }
            rename(logFile: "./build/install/module/rename.log", annotationClass: "com.company.project.module.annotations.Obfuscation") {
                property(name: "naming-scheme", value: "mix")
            }
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")
            }
        }
    }
}
最后,我将这个自定义注释类添加到任务的
rename
元素中,如下所示:

  @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);
    }
  }
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)")
                }
            }
        }
    }
}
package com.company.project.module.annotations;

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

      boolean applyToMembers() default true;
}
import com.company.project.module.annotations.*;

[...]

  @Obfuscation( exclude = true, applyToMembers = false)
  public static void main(String[] args) {
    [...]
  }
            rename(logFile: "./build/install/module/rename.log", annotationClass: "com.company.project.module.annotations.Obfuscation") {
                property(name: "naming-scheme", value: "mix")
            }
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")
            }
        }
    }
}
所以整个gradle任务现在看起来是这样的:

  @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);
    }
  }
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)")
                }
            }
        }
    }
}
package com.company.project.module.annotations;

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

      boolean applyToMembers() default true;
}
import com.company.project.module.annotations.*;

[...]

  @Obfuscation( exclude = true, applyToMembers = false)
  public static void main(String[] args) {
    [...]
  }
            rename(logFile: "./build/install/module/rename.log", annotationClass: "com.company.project.module.annotations.Obfuscation") {
                property(name: "naming-scheme", value: "mix")
            }
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模块\u obf.jar
成功地运行我的程序