混淆时,编译器优化导致通过反射赋值的类被清空问题

文章讲述了作者在使用Proguard混淆时,由于混淆导致依赖反射的类内容被清除,通过在初始化时预设默认值解决该问题。同时列举了一些无效的Proguard规则示例。
摘要由CSDN通过智能技术生成

有几个反射赋值的类,之前一直是 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 {*;}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值