在这篇博客中,http://blog.csdn.net/marshalchen/article/details/9928801有更多的关于混淆的一些注意事项;下面是使用过程中碰到的一些问题:
1、 在使用总线事件(以OTTO Event为例)时,混淆后发现总线事件无法工作了;主要有下面几个原因。
1) 总线事件注解混淆过程中被删除了,需要增加下面的代码处理。
//保留注解
-keepattributes *Annotation*
2) 接收事件的方案在混淆过程中被删除了;总线事件是以注解方式再通过反射调用的,而这些方法或函数在代码中被显式调用过, 会被proguard给删除了;需要设置保证这些方法不被删除:
① 可以为总线事件的接收方法定义一个通用的前缀,如“onOTTOEventxxx(Eventxx data)”;在proguard配置中就保留该类型的方法(推荐方式)。
-keepclasseswithmembers class * {
public void onOTTOEvent*(…);
}
② 直接参数方式保留该方法;一般使用到的事件类型会比较多,就不适合使用这种方式了,只适合只有少数的事件的工程;如事件的bean定义为EventTest1.
-keepclassmembers class * {
public void *(package. EventTest1);
}
③ 一般总线接收事件方法都定义在activity或fragment或dialog中;而这些类的方法基本都不适合混淆,可以直接将该类型的类的方法都定义成不混淆。
-keep public class * extends android.app.Activity{*;}
2、 在xml中设置onClick事件,被混淆问题。
在xml中设置onClick事件,系统最后是以反射方式进行调用的,这些的设置的方法在代码中可能就没有显式调用过,混淆后会被proguard给删除了;解决方案:
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}