Proguard keep static Inner Class

本文介绍如何使用ProGuard保留特定静态内部类的方法,避免混淆过程中丢失这些类。通过配置-keepclass语句,可以精确指定需要保留的内部类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在使用Proguard keep一个 静态内部类的时候,混淆完之后一直找不到那个静态内部类,内心抓狂啊。

最后在stackoverflow上找到了答案:

-keepattributes Exceptions,InnerClasses,...
-keep class [packagename].A{
    *;
}
-keep class [packagename].A$* {
    *;
}


其中 A$* 表示所有A的内部类都保留下来,也可以如下使用:

-keepattributes Exceptions,InnerClasses,...
-keep class com.xxx.A{ *; }
-keep class com.xxx.A$B { *; }
-keep class com.xxx.A$C { *; }


这样可以根据需要只保留A的某一个内部类


以下是proguard文件一部分

#-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keepattributes Exceptions,InnerClasses,...
-keep class com.yulore.reverselookup.api.YuloreWindowConfiguration{ *; }
-keep class com.yulore.reverselookup.api.YuloreWindowConfiguration$Builder{ *; }


注意:第一行和第二行都可以解决问题











### Spring Boot 使用 Maven-Assembly-Plugin 和 ProGuard 进行打包和混淆 #### 配置 `pom.xml` 为了实现Spring Boot项目的ProGuard混淆并使用`maven-assembly-plugin`进行打包,需调整`pom.xml`文件中的配置如下: ```xml <build> <plugins> <!-- ProGuard Plugin --> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.0.14</version> <executions> <execution> <phase>package</phase> <goals><goal>proguard</goal></goals> </execution> </executions> <configuration> <injar>${project.build.finalName}.jar</injar> <outjar>${project.artifactId}-${project.version}-obf.jar</outjar> <outputDirectory>${project.build.directory}</outputDirectory> <options> <option>-dontshrink</option> <option>-dontoptimize</option> <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option> <option>-keep public class * extends org.springframework.boot.SpringApplication { public static void main(java.lang.String[]); }</option> <option>-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF</option> </options> <libs> <lib>${java.home}/lib/rt.jar</lib> <lib>${java.home}/lib/jce.jar</lib> </libs> </configuration> <dependencies> <dependency> <groupId>net.sf.proguard</groupId> <artifactId>proguard-base</artifactId> <version>6.2.2</version> <scope>runtime</scope> </dependency> </dependencies> </plugin> <!-- Assembly Plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>fully.qualified.MainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <!-- Spring Boot Maven Plugin to ensure the final JAR is built correctly after obfuscation --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.5</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 上述配置中,先利用`proguard-maven-plugin`对应用程序及其依赖项进行了混淆处理[^2]。接着,通过设置`maven-assembly-plugin`创建包含所有必要库的单一JAR文件,并指定了入口类以便可以直接执行该JAR文件。 值得注意的是,在实际操作前应确保已安装了适当版本的Java JDK环境以及正确设置了`JAVA_HOME`变量。此外,还需注意替换示例代码里的`fully.qualified.MainClass`为具体的应用程序主类路径。 对于某些特殊情况,可能需要进一步微调ProGuard选项以适应具体的业务逻辑或第三方库的要求。例如,如果项目中有特殊的反射机制或者其他动态加载方式,则应在ProGuard配置里加入相应的保留规则来防止这些部分被错误地移除或重命名。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值