Как да използвам ProGuard?

Опитвах се да науча как да използвам ProGuard и не е толкова лесно, колкото си мислех. Отначало намерих прост Java код, за да го пробвам, прост две клас Swing калкулатор.

Кодът може да бъде намерен, като следвате тази връзка, но ми се стори твърде подробен, за да го публикувам тук. Както и да е, това е обикновено приложение с входна точка на Calc.main(), няма пакети.

След това компилирах и двата източника с:

$ javac *.java

и създаде файла .jar (защото изглежда, че ProGuard работи само с буркани):

$ 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%)

Написа файла ProGuard с име 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?

Е, очевидно не проработи. Уморих се да се забърквам с параметрите на ProGruard, особено с тези -keep опции, без успех. Всичко, което намерих в документите, свързани с моя проблем, не можа да ми помогне. Тогава прибягвам до вас... Какво не е наред? Как да го направя правилно?


person lvella    schedule 24.08.2012    source източник
comment
Вашият main метод е с главни букви, което почти сигурно не трябва да бъде.   -  person Louis Wasserman    schedule 24.08.2012
comment
@LouisWasserman Точно така, коригирано. Все още имам същия проблем.   -  person lvella    schedule 24.08.2012
comment
Това ми изглежда добре. Можете ли да качите своя буркан и конфигурацията на ProGuard някъде, за да можем да тестваме решения, вместо просто да гадаем какво може да не е наред на вашия компютър?   -  person Louis Wasserman    schedule 24.08.2012
comment
Нямам конфигурация на ProGuard, просто разопаковам и използвам веднага от директорията bin (вижте извикването ми). Дадох всички стъпки за създаване на буркана, но ето го: 4shared .com/file/xekHfRyx/calc.html?refurl=d1url   -  person lvella    schedule 24.08.2012
comment
Ето един пример с gradle ‹br› stackoverflow.com/questions/64355998/   -  person Jafar Karuthedath    schedule 15.10.2020


Отговори (3)


Накарах го да работи с помощта на следния конфигурационен файл:

-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.

person Louis Wasserman    schedule 24.08.2012

Имал съм подобни проблеми, решени чрез премахване на Java модификатори.

Модификаторите на Java, като модификаторите за видимост, не са задължителни в опцията за запазване на конфигурационния файл на ProGuard (и в свързаните опции -запазване на членове на класа и т.н.)

От ръководството: -запазете [,модификатор,...] спецификация_на клас

Така че, освен ако няма конкретна причина, можете да ги пропуснете.

person user3272245    schedule 04.02.2014

Ето решение с gradle

  1. Създайте изпълняваем буркан с всички зависими библиотеки, копирани в зависимости на директория, и добавете пътя на класа в манифеста.

    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"
       }
    
  2. Копирайте зависимостите

    task copyDepends(type: Copy) {
      from configurations.default
      into "${dependsDir}"
    }
    
  3. Объркайте библиотеката с 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}"
     }
    

Ето пълния build.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
person Jafar Karuthedath    schedule 15.10.2020