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代码混淆的时候配置不当所致。

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

未混淆前:

8ed8e9b1f92a9df29d33b8ae54286d65.png

混淆之后:

c532d751abfeb3d2861c592b02f170ac.png

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

于是按照参考文献①②的思想,在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时,一直无法正常打开,出现问题,这时候,可以试试以上方法。混淆之后,一切正常,效果如下:

67a36bf6fe7d89e1468d630171537408.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值