有几个反射赋值的类,之前一直是 keep 整个class的,现在要求对class的路径进行混淆。
当我启用混淆后,发现整个类的内容被清空了。
// 原始的类内容
public class BaseLoadData {
@property("config_data1")
public static String data1;
@property("config_data2")
public static String data2;
@property("config_data3")
public static String data3;
}
启用混淆后,该类的内容惨遭清空。
原先引用 data1 的部分,直接变成 null
原因是 BaseLoadData 是靠反射另一个模块的配置来赋值的,编译器认为这个 data1 没有被赋值,所以直接用 null 来替代了所有引用的地方。
测试了很多 proguard-rules.pro 的方案,期望是保留注解,混淆路径以及 data1,data2 等变量名,发现一直解决不了。后续实在没办法,在反射前尝试直接给变量先赋值一次。问题解决。
public void init {
// 避免编译器因为类中的值没有被引用过,直接将类清空,里面的值在引用到的地方直接设置为 null
// 这里赋值不能是 "" ,因为编译器会找其他同值的内容替代,所以要用 " "
data1 = data2 = data3 = " ";
}
// 然后外部调用
BaseLoadData.init();
当然这个解决方法很烂,会在代码里留下一堆垃圾。算是留下一个坑,希望后期能填上。
以下是无效的proguard-rules.pro 方案
# 1
#-keep,allowobfuscation class com.xxx.xxx.BaseLoadData
# 2
#-keepattributes property
# 3
#-keepclassmembers class * {
# @*Property <fields>;
#}
# 4
#-keep class com.xxx.xxx.property {*;}