Как использовать 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 (см. мой вызов). Я описал все шаги по сборке jar-файла, но вот он: 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, такие как модификаторы видимости, являются необязательными в параметре -keep файла конфигурации ProGuard (и в связанных параметрах -keepclassmembers и т. д.).

Из руководства: -keep [,modifier,...] class_specification

Поэтому, если нет особой причины, вы можете их не использовать.

person user3272245    schedule 04.02.2014

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

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

    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