1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > android打包成apk会屏蔽注解 Android解决混淆打包之后注解被去掉的问题-Go语言中文社区...

android打包成apk会屏蔽注解 Android解决混淆打包之后注解被去掉的问题-Go语言中文社区...

时间:2018-06-29 08:46:38

相关推荐

android打包成apk会屏蔽注解 Android解决混淆打包之后注解被去掉的问题-Go语言中文社区...

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

1,环境:Eclipse+ADT

2,参考文献:

我们都知道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 ;

}

# 如果类中有使用了注解的字段,则不混淆类和类成员

-keepclasseswithmembers class * {

@com.pang.view.base.annotation.ViewInject ;

}

# 如果类中有使用了注解的构造函数,则不混淆类和类成员

-keepclasseswithmembers class * {

@com.pang.view.base.annotation.ViewInject (...);

}

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。