Android解决混淆打包之后注解被去掉的问题

xiaoxiao2025-04-30  56

一、实验环境(蓝色粗体字为特别注意内容)

1,环境:Eclipse+ADT

2,参考文献:

①https://blog.csdn.net/yhtppp/article/details/44059519?utm_source=blogxgwz0②http://liucanwen.iteye.com/blog/2026400③https://www.jianshu.com/p/bc70d5d71a61

我们都知道Android中是通过findViewById()这个方法来绑定xml中的控件的。但是当控件较多时,findViewById()的代码行数也会随之增多,而且这些findViewById函数并没有表示其他特殊的含义。因此,activity中大量重复的findViewById()方法就导致了整个代码看起来很臃肿。于是在一个项目中,按照参考文献③的方式,使用注解代替findViewById方法,于是问题随之而来,在Eclipse中直接点运行,下载到手机中的时候一切正常,但是导出签名之后的apk则运行闪退,甚是奇怪。

查看日志发现,是使用ViewInject注解的控件全爆空指针。即如下方式的控件都有问题

@ViewInject(R.id.btn_login) /**登录按钮*/ private Button btn_login;

多方查找原因,最后定位到是导出APK代码混淆的时候配置不当所致。

为了验证这个猜想,我把混淆前的反编译代码跟混淆后的反编译代码进行对比,这一对比就发现了问题所在:

未混淆前:

混淆之后:

可以看到混淆打包之后注解全都被去掉了!!!

于是按照参考文献①②的思想,在proguard-project.txt中加入下面的代码问题解决

# 不混淆使用了注解的类及类成员 -keep @com.pang.view.base.annotation.ViewInject class * {*;} # 如果类中有使用了注解的方法,则不混淆类和类成员 -keepclasseswithmembers class * { @com.pang.view.base.annotation.ViewInject <methods>; } # 如果类中有使用了注解的字段,则不混淆类和类成员 -keepclasseswithmembers class * { @com.pang.view.base.annotation.ViewInject <fields>; } # 如果类中有使用了注解的构造函数,则不混淆类和类成员 -keepclasseswithmembers class * { @com.pang.view.base.annotation.ViewInject <init>(...); } # The "Signature" attribute is required to be able to access generic types whencompiling in JDK 5.0 and higher. -keepattributes Signature # processing Annotations -keepattributes *Annotation*

其中,“com.pang.view.base.annotation.ViewInject”是我自定义的注解类。

其他注解应该也是一样的, 混淆代码生成apk时,一直无法正常打开,出现问题,这时候,可以试试以上方法。混淆之后,一切正常,效果如下:

转载请注明原文地址: https://www.6miu.com/read-5029528.html

最新回复(0)