最近做项目用到了第三方登录和分享,于是就集成了友盟,具体功能是QQ、微信、新浪微博的登录和分享,测试阶段并没有出现很多的问题,和是混淆打包以后,问题就出来了,搞了两个小时,终于搞定了这些bug。
1:java.lang.RuntimeException Stub!
2:java.lang.ClassCastException com...MainApplication cannot be cast to android.app.Activity
起初有点奇怪为什么会出现ClassCastException,似乎并没有哪个地方用到了MainApplication,后来去研究友盟sdk,发现 UMShareAPI是单例模式,初始化方法是public static UMShareAPI get(Context context);这个方法参数类型是Context, 所以传入的参数可以是Activity, 也可以是Applicaion的Context。
但在SDK内部使用的时候,有的地方做了Context到Activity的强转,如果UMShareAPI初始化方法里传的参数是Applicaion的Context, 就会出问题。这尼玛,传入的一定要是activity你为什么参数是context,就算传入的是activity,这尼玛是严重的内存泄漏啊。。。先不管了,搞定bug再说,初始化的时候传入activity,果真就没问题了;
另一个bug就显得毫无头绪了,只有从混淆入手了,一路追踪,居然发现在引入的环信module中有一个org.apache.http.legacy.jar包,找的好辛苦啊,一想是不是这个包混淆的原因,于是在proguard-rules.pro中加入配置:
-dontwarn android.net.compatibility.**
-dontwarn android.net.http.**
-dontwarn com.android.internal.http.multipart.**
-dontwarn org.apache.commons.**
-dontwarn org.apache.http.**
-keep class android.net.compatibility.**{*;}
-keep class android.net.http.**{*;}
-keep class com.android.internal.http.multipart.**{*;}
-keep class org.apache.commons.**{*;}
-keep class org.apache.http.**{*;}
然后重新打包,果然就没有问题了。