Gradle 使用 Proguard 混淆 java 应用程序的任务

Gradle task to obfuscate java application with Proguard

我需要混淆一个 Java 应用程序,它依赖于许多外部 jar。该应用程序由许多模块组成,每个模块包含 API 和实现 jar。基本上我需要创建一个 gradle 任务来混淆所有这些罐子,这些罐子稍后可以在 Jenkins 的构建过程中使用。有很多关于 Proguard 的文档,但大部分都包含在 Android 应用程序中。

已在此处引用官方 Proguard 文档:Proguard Gradle Plugin

我可以通过以下 gradle 配置实现此目的

  • 复制所有依赖的jar到一个目录

    def dependsDir = "${System.getProperty('user.dir')}/dependencies/"
    task copyDepends(type: Copy) {
      from configurations.compile
      into "${dependsDir}"
    }
    
  • 创建类型为 proguard.gradle.ProGuardTask 的 gradle 任务。injars 列表在目录中可用,并在 gradle 任务中迭代名称。

    buildscript {
    repositories {
      mavenCentral()
    }
    dependencies {
      classpath 'net.sf.proguard:proguard-gradle:6.0.3'
      classpath 'net.sf.proguard:proguard-base:6.0.3'
    }
    }
     task proguard(type: proguard.gradle.ProGuardTask) {
        configuration 'proguard.conf'
        def inputDir = new File("${System.getProperty('user.dir')}/inputJars")
       def  outputDir = "${System.getProperty('user.dir')}/inputJars"
        println ("List of jars for obfuscation : ")
        inputDir.eachFileRecurse (FileType.FILES) { file ->
              println(file.getName())
              injars file
              outjars "${outputDir}/${file.getName()}"
          }
    
       libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
       libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
       libraryjars "${System.getProperty('user.dir')}/dependencies/"
     }