如何使用proguard?

irtuqstp  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(373)

我试着学习如何使用proguard,但这并不像我想的那么容易。起初我找到了一个简单的java代码来尝试它,一个简单的两类swing计算器。
这个代码可以通过下面的链接找到,但是我发现它太冗长了,无法在这里发布。不管怎样,它是一个简单的应用程序,入口点是打开的 Calc.main() ,没有包。
然后我编译了两个源代码:

$ javac *.java

创造了 .jar 文件(因为proguard似乎只处理jar):

$ jar cvef Calc calc.jar *.class
added manifest
adding: Calc.class(in = 3869) (out= 2126)(deflated 45%)
adding: Calc$ClearListener.class(in = 468) (out= 327)(deflated 30%)
adding: CalcLogic.class(in = 1004) (out= 515)(deflated 48%)
adding: Calc$NumListener.class(in = 1005) (out= 598)(deflated 40%)
adding: Calc$OpListener.class(in = 1788) (out= 1005)(deflated 43%)

编写了名为 obfuscate.pro :

-injars       calc.jar
-outjars      calc_obf.jar
-libraryjars  <java.home>/lib/rt.jar

-keep public class Calc extends javax.swing.JFrame {
public static void main(java.lang.String[]);
}

最后运行proguard:

$ ~/progs/proguard/proguard4.8/bin/proguard.sh @obfuscate.pro
ProGuard, version 4.8
Reading program jar [/home/lucas/tmp/calc.jar]
Reading library jar [/usr/lib/jvm/java-7-openjdk-i386/jre/lib/rt.jar]
Error: The output jar is empty. Did you specify the proper '-keep' options?

好吧,显然没用。我厌倦了和prograard参数打交道,尤其是那个 -keep 选择,没有成功。我在文件中找到的所有与我的问题有关的东西都帮不了我。那我就求助于你。。。怎么了?如何做好?

8ulbf1ek

8ulbf1ek1#

我使用以下配置文件使其工作:

-injars       calc.jar
-outjars      calc_obf.jar
-libraryjars  <java.home>/lib/rt.jar
-keep class Calc {
  public static void main(java.lang.String[]);
}

最值得注意的是,我抛弃了 public 在前面 class Calc .

z18hc3ub

z18hc3ub2#

我也遇到过类似的问题,可以通过去掉java修饰符来解决。
java修饰符(如可见性修饰符)在proguard配置文件-keep选项(以及相关选项-keepclassmembers等)中是可选的
来自手册:-保持[,修饰符,…]等级规范
所以除非有特别的原因,否则你可以把它们排除在外。

tgabmvqs

tgabmvqs3#

这是gradle的解决方案
创建一个可运行的jar,将所有依赖库复制到“dependencies”目录,并在清单中添加类路径。

task createJar(type: Jar) {
   println("Cleaning...")
   clean
   manifest {
   attributes('Main-Class': 'com.abc.gradle.hello.App',
     'Class-Path': configurations.default.collect { 'dependencies/' + 
      it.getName() }.join(' ')
      )
   }
   from {
      configurations.compile.collect { it.isDirectory() ? it : zipTree(it) 
      }
   } with jar
   println "${outputJar} created"
   }

复制依赖项

task copyDepends(type: Copy) {
  from configurations.default
  into "${dependsDir}"
}

用proguard混淆图书馆

task proguard(type: proguard.gradle.ProGuardTask) {
   println("Performing obfuscation..")
   configuration 'proguard.conf'
   injars "${outputJar}"
   outjars "${buildDir}/libs/${rootProject.name}_proguard.jar"
   libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
   libraryjars "${dependsDir}"
 }

这是完整的构建.gradle

buildscript {
 repositories {
    mavenCentral()
 }
 dependencies {
    classpath 'net.sf.proguard:proguard-gradle:6.0.3'
    classpath 'net.sf.proguard:proguard-base:6.0.3'
 }
}

plugins {
 id 'java'
 id 'application'
}

repositories {
  mavenCentral()
}

dependencies {
   implementation 'org.slf4j:slf4j-api:1.7.30'
   implementation 'ch.qos.logback:logback-classic:1.2.3'
   implementation 'ch.qos.logback:logback-core:1.2.3'
   testImplementation 'junit:junit:4.13'
}

def outputJar = "${buildDir}/libs/${rootProject.name}.jar"
def dependsDir = "${buildDir}/libs/dependencies/"
def runnableJar = "${rootProject.name}_fat.jar";

task copyDepends(type: Copy) {
 from configurations.default
 into "${dependsDir}"
}

task createJar(type: Jar) {
 println("Cleaning...")
 clean
 manifest {
    attributes('Main-Class': 'com.abc.gradle.hello.App',
            'Class-Path': configurations.default.collect { 'dependencies/' + 
   it.getName() }.join(' ')
    )
  }
  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
   } with jar
   println "${outputJar} created"
  }

task proguard(type: proguard.gradle.ProGuardTask) {
   println("Performing obfuscation..")
   configuration 'proguard.conf'
   injars "${outputJar}"
   outjars "${buildDir}/libs/${rootProject.name}_proguard.jar"

   libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
   libraryjars "${dependsDir}"

  }

proguard.conf文件

-keep public class * {
   public * ;
 }

用于混淆的gradle命令

gradle createJar
gradle copyDepends
gradle proguard

相关问题