使用友盟组件,android混淆后程序报错解决方案
2014-04-21 11:18
183 查看
这几天在对程序进行混淆处理测试时,在程序中使用了友盟组件的地方会报错,比如自动更新,报错异常如:
使用了混淆, 请添加
这是由于SDK中的部分代码使用反射来调用构造函数, 如果被混淆掉, 在运行时会提示"NoSuchMethod"错误。 另外,由于SDK需要引用导入工程的资源文件,通过了反射机制得到资源引用文件R.java,但是在开发者通过proguard等混淆/优化工具处理apk时,proguard可能会将R.java删除,如果遇到这个问题,请在proguard配置文件中添加keep命令如:
把[您的应用包名] 替换成您自己的包名,如com.yourcompany.example。 如果您使用了双向反馈功能,还需要添加下面代码,以免我们自定义的UI被混淆:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.umeng.update.UpdateDialogActivity}: java.lang.IllegalArgumentException: ResClass is not initialized. Please make sure you have added neccessary resources. Also make sure you have com.example.R$* configured in obfuscation. field=umeng_update_dialog at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) at android.app.ActivityThread.access$600(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalArgumentException: ResClass is not initialized. Please make sure you have added neccessary resources. Also make sure you have com.example.R$* configured in obfuscation. field=umeng_update_dialog at com.umeng.common.Res.a(Unknown Source) at com.umeng.common.Res.d(Unknown Source) at com.umeng.update.UpdateDialogActivity.onCreate(Unknown Source) at android.app.Activity.performCreate(Activity.java:5008) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)解决思路:
使用了混淆, 请添加
-keepclassmembers class * { public <init>(org.json.JSONObject); }
这是由于SDK中的部分代码使用反射来调用构造函数, 如果被混淆掉, 在运行时会提示"NoSuchMethod"错误。 另外,由于SDK需要引用导入工程的资源文件,通过了反射机制得到资源引用文件R.java,但是在开发者通过proguard等混淆/优化工具处理apk时,proguard可能会将R.java删除,如果遇到这个问题,请在proguard配置文件中添加keep命令如:
-keep public class [您的应用包名].R$*{ public static final int *; }
把[您的应用包名] 替换成您自己的包名,如com.yourcompany.example。 如果您使用了双向反馈功能,还需要添加下面代码,以免我们自定义的UI被混淆:
-keep public class com.umeng.fb.ui.ThreadView { }在proguadr-android.txt文件中,添加如下代码:
-keepclassmembers class * { public <init>(org.json.JSONObject); }至此,问题解决
-keep public class com.example.R$*{
public static final int *;
}
相关文章推荐
- 如何使用友盟 Cocos2d-x 分享组件实现 Android/iOS 分享功能
- 命令行编译android程序,欢迎探讨命令行如何使用proguard混淆优化代码
- Android报表解决方案 使用开源组件iChartjs(二)
- Android程序——使用GridView组件实现如下图所示的效果
- Cocos2d-x游戏在Android平台使用友盟社会化组件进行截图分享的实现
- Android报表解决方案 使用开源组件iChartjs(一)
- 使用Mac版Eclipse开发Android程序混淆签名打包的一个报错解决方法
- Android 使用JNI的项目通过Proguard混淆后程序异常的问题
- 【LruCache完全解析】Android高效加载大图、多图解决方案,有效避免程序OOM (AdapterView使用LruCache图片缓存)
- android使用include调用内部组件报空指针异常解决方案
- android 分享------使用友盟社会化组件
- Android高效加载大图、多图解决方案,有效避免程序OOM(使用LruCache 强引缓存图片用取代软引用)
- 如何使用友盟 Cocos2d-x 分享组件实现 Android/iOS 分享功能
- Android使用系统调用相册的时候打开了云相册出现CRASH或者找不到截图程序的解决方案
- 【LruCache完全解析】Android高效加载大图、多图解决方案,有效避免程序OOM (AdapterView使用LruCache图片缓存)
- Android 使用友盟等分享出现乱码的解决方案
- Android应用中使用Fragment组件的一些问题及解决方案总结
- 微信小程序测试:navigator组件使用flex布局不兼容问题及解决方案
- 【微信小程序常见问题】使用picker组件显示年份解决方案
- 如何使用友盟 Cocos2d-x 分享组件实现 Android/iOS 分享功能