Ant 到 Gradle 的转换:混淆和 Jar

Ant to Gradle conversion: Obfuscation and Jar

我正在将 ant 迁移到 gradle。我认为我被困在一些相当基本的事情上。我有一个执行以下操作的 .xml 脚本:

<target name="ANTtarget">
   <proguard
     ...
     <libraryjar dir="otherfiles/here" />
     <outjar name="some.jar"/>
     ...
   </proguard>

   <jar destfile="some.jar" update="yes" >
       <manifest>
         <attribute  name="Main-Class" value="some.package.here" />
       </manifest>
       <zipgroupfileset dir="otherfiles/here" includes="**/*.jar" />
   </jar>
 </target>

因此,使用 proguard,类 被混淆然后打包。我能够完成相同的混淆,但我无法完成 jar-ing。我怀疑这是因为 gradle 的 jar 任务中没有 'update="yes"' 功能。

Gradle代码:

task GRADLEtask(type: proguard.gradle.ProGuardTask) {
   ...
   outjar: "some.jar"
   ...
}

更新 jar 有任何解决方案或解决方法吗?也许在我处于混淆状态时编辑清单? (这里的想法是 task/target 输出是相同的。)

编辑:

普通的 jar 类型任务工作正常;在 jar 任务中错误地引用了 "otherfiles/here"。

参考代码:

[你可能不会遇到同样的问题,因为你很聪明。]

task JARitUP (type: Jar, dependsOn: 'GRADLEtask') {
    baseName = "some2"

    from zipTree('some.jar')
    //get all the library jars
    def MYjars =  fileTree(jarPlace).filter { it.name.endsWith('.jar') }.files.path
    MYjars.each { THISjar -> from zipTree("$THISjar") }

    manifest {
        attributes 'Main-Class': 'some.package.here'
    }
}

这只是一个猜测,但可能是您直接调用了混淆代码的 GRADLEtask

尝试使用 dependsOn 以确保 jar 任务之前调用了您的混淆任务,例如您的 build.gradle

jar.dependsOn(obfuscate)

然后调用gradle jar

类似于:

apply plugin: 'java'

configurations {
   proguard
}

dependencies {
   "com.foo:proguard:1.2.3"
}

jar {
   manifest {
      attributes('Main-Class': 'some.package.here')
   }
}

task proguard {
   inputs.file jar.archivePath
   outputs.file jar.archivePath // is this correct?
   doLast {
      ant.taskdef(name: 'proguard', classname: 'foo.bar.ProguardTask', classpath: configurations.proguard.asPath)
      ant.proguard {
         libraryjar(dir: 'otherfiles/here') // not sure what this does
         outjar(name: jar.archivePath)
      }
   }
}
assemble.dependsOn proguard
proguard.dependsOn jar