[英]How do I use ProGuard for Eclipse Java desktop applications?
[英]How do I use ProGuard?
我正在嘗試學習如何使用ProGuard ,它並不像我想象的那么容易。 一開始找了個簡單的Java代碼試了一下,一個簡單的二類Swing計算器。
可以通過該鏈接找到代碼,但我發現它太冗長了,無法在此處發布。 無論如何,它是一個簡單的應用程序,入口點在Calc.main()
,沒有包。
然后我編譯了兩個來源:
$ javac *.java
並創建了.jar
文件(因為 ProGuard 似乎只適用於 jars):
$ 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
的 ProGuard 文件:
-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
選項,但沒有成功。 我在與我的問題相關的文檔中找到的所有內容都無法幫助我。 那我就求助於你了……怎么了? 怎么做才對?
我使用以下配置文件讓它工作:
-injars calc.jar
-outjars calc_obf.jar
-libraryjars <java.home>/lib/rt.jar
-keep class Calc {
public static void main(java.lang.String[]);
}
最值得注意的是,我在class Calc
面前拋棄了public
。
我遇到過類似的問題,通過去掉 Java 修飾符解決了。
Java 修飾符如可見性修飾符在 ProGuard 配置文件 -keep 選項(以及相關選項 -keepclassmembers 等)中是可選的
來自手冊:-keep [,modifier,...] class_specification
因此,除非有特殊原因,否則您可以將它們排除在外。
這是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}" }
這是完整的 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}"
}
配置文件
-keep public class * {
public * ;
}
用於混淆的 Gradle 命令
gradle createJar
gradle copyDepends
gradle proguard
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.