Proguard技术疑问:如何保留参数含自定义注解的构造方法?
嘿,这个需求我刚好在项目里处理过,用ProGuard的规则就能精准实现,下面给你一步步拆解:
1. 先确保自定义注解不被混淆
首先得让ProGuard“认识”你的自定义注解,不然它连注解都找不到,更别说匹配带注解的构造方法了。所以先加这条规则,把注解本身完整保留:
-keep @interface com.yourpackage.YourCustomAnnotation { *; }
记得把com.yourpackage.YourCustomAnnotation替换成你实际的注解全类名。
2. 核心规则:保留参数含自定义注解的构造方法
接下来就是关键的匹配规则了,用-keepclassmembers来定位目标构造方法,语法如下:
-keepclassmembers class * { <init>(** @com.yourpackage.YourCustomAnnotation *); }
我给你解释下这里的每个部分:
<init>是ProGuard里专门指代构造方法的关键字**表示任意数量的前置参数(可以是0个或多个)@com.yourpackage.YourCustomAnnotation *表示某个参数被你的自定义注解标记
如果你的需求是只针对特定类,而不是所有类,把class *换成具体的类全类名就行,比如class com.yourpackage.TargetClass。
举个实际例子
假设你的自定义注解是@MyInject,目标类是com.example.User,它有个构造方法public User(@MyInject String username, int age),那完整的规则就是:
# 保留自定义注解 -keep @interface com.example.MyInject { *; } # 保留User类中参数带@MyInject的构造方法 -keepclassmembers class com.example.User { <init>(** @com.example.MyInject *); }
重要注意事项
别忘了你的自定义注解的RetentionPolicy至少要设为CLASS,因为ProGuard是在字节码层面处理的,如果注解是SOURCE级别,编译时就会被丢弃,ProGuard根本看不到它。注解的定义应该像这样:
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.CLASS) public @interface MyInject { // 注解的属性(如果有的话) }
如果需要运行时也能获取到这个注解,就用RetentionPolicy.RUNTIME,但CLASS是满足这个需求的最低要求。
内容的提问来源于stack exchange,提问作者user4003256
相关产品推荐
相关产品推荐

