首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ProGuard?

如何使用ProGuard?
EN

Stack Overflow用户
提问于 2012-08-25 01:30:35
回答 3查看 19.2K关注 0票数 8

我试着学习如何使用ProGuard,但这并不像我想的那么简单。首先,我找到了一个简单的Java代码来尝试它,一个简单的two class Swing calculator

代码可以通过这个链接找到,但我发现它太冗长了,不能在这里发布。无论如何,这是一个在Calc.main()上有入口点的普通应用程序,没有包。

然后我用以下命令编译了这两个源代码:

代码语言:javascript
复制
$ javac *.java

并创建了.jar文件(因为ProGuard似乎只适用于jars):

代码语言:javascript
复制
$ 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文件

代码语言:javascript
复制
-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:

代码语言:javascript
复制
$ ~/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选项,但都没有成功。我在文档中找到的所有与我的问题相关的东西都不能帮助我。那我就求助于你。怎么啦?怎样做才是正确的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-25 02:39:22

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

代码语言:javascript
复制
-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

票数 6
EN

Stack Overflow用户

发布于 2014-02-05 03:15:26

我也遇到过类似的问题,都是通过去掉Java修饰符解决的。

在ProGuard配置文件-keep选项(以及相关选项-keepclassmembers等)中,诸如可见性修饰符之类的Java修饰符是可选的。

来自manual:-keep,modifier,...class_specification

因此,除非有其他特定原因,否则可以省略它们。

票数 1
EN

Stack Overflow用户

发布于 2020-10-16 00:01:41

下面是gradle的解决方案

  1. 创建一个可运行的jar,并将所有依赖库复制到"dependencies“目录中,然后在清单中添加类路径。

任务createJar(类型: Jar) {println(“清理...”)清除清单{ attributes('Main-Class':'com.abc.gradle.hello.App','Class-Path':configurations.default.collect { 'dependencies/‘+ it.getName() }.join(’') )}来自{ configurations.compile.collect { it.isDirectory()?it : zipTree(it) }}带有jar println "${outputJar} created“}

  1. 复制依赖项

任务copyDepends(类型:复制){从configurations.default复制到${dependsDir} }

  1. 使用Proguard对库进行模糊化

任务保护(类型: proguard.gradle.ProGuardTask) {println(“执行混淆..”)configuration 'proguard.conf‘injars "${outputJar}“优于"${buildDir}/libs/${rootProject.name}_proguard.jar”库injars "${System.getProperty('java.home')}/lib/rt.jar“库injars "${dependsDir}”}

下面是完整的build.gradle

代码语言:javascript
复制
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

代码语言:javascript
复制
-keep public class * {
   public * ;
 }

Gradle命令以进行模糊处理

代码语言:javascript
复制
gradle createJar
gradle copyDepends
gradle proguard
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12114096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档