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

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

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时,一直无法正常打开,出现问题,这时候,可以试试以上方法。混淆之后,一切正常,效果如下:

猜你喜欢

转载自blog.csdn.net/pang9998/article/details/83505980