关于使用Eclipse打包签名后APP出现不能正常运行
2016-03-03 10:35
417 查看
最近,忙完公司的一个版本。打包签名过后,发现App不能够正常运行使用,在网上查找了许多方法无果。
先贴上Log:03-02 18:54:11.460: E/TestinAgent(3754): ****************************************
03-02 18:54:12.285: E/AndroidRuntime(3754): FATAL EXCEPTION: main
03-02 18:54:12.285: E/AndroidRuntime(3754): java.lang.NoSuchFieldError: PUBLIC_ONLY
03-02 18:54:12.285: E/AndroidRuntime(3754): at java.lang.Class.getDeclaredAnnotation(Native Method)
03-02 18:54:12.285: E/AndroidRuntime(3754): at java.lang.Class.getAnnotation(Class.java:243)
03-02 18:54:12.285: E/AndroidRuntime(3754): at org.codehaus.jackson.map.introspect.VisibilityChecker$Std.<clinit>(VisibilityChecker.java:178)
03-02 18:54:12.285: E/AndroidRuntime(3754): at org.codehaus.jackson.map.ObjectMapper.<clinit>(ObjectMapper.java:196)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.app.util.JacksonParser.readValue(JacksonParser.java:22)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.app.util.ArticleCollection.onResponse(ArticleCollection.java:60)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.app.util.ArticleCollection.onResponse(ArticleCollection.java:1)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
03-02 18:54:12.285: E/AndroidRuntime(3754): at android.os.Handler.handleCallback(Handler.java:730)
03-02 18:54:12.285: E/AndroidRuntime(3754): at android.os.Handler.dispatchMessage(Handler.java:92)
03-02 18:54:12.285: E/AndroidRuntime(3754): at android.os.Looper.loop(Looper.java:137)
03-02 18:54:12.285: E/AndroidRuntime(3754): at android.app.ActivityThread.main(ActivityThread.java:5493)
03-02 18:54:12.285: E/AndroidRuntime(3754): at java.lang.reflect.Method.invokeNative(Native Method)
03-02 18:54:12.285: E/AndroidRuntime(3754): at java.lang.reflect.Method.invoke(Method.java:525)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
03-02 18:54:12.285: E/AndroidRuntime(3754): at dalvik.system.NativeStart.main(Native Method)可以看到的是,出现了NoSuchFieldError错误。
百思不得其解,后来终于找到了一个靠谱的说法:
是因为我在代码中解析JSON数据的时候,使用Jackson将JSON数据变成了JavaBean对象,导致代码在打包签名、混淆代码后,找不到原来对象的属性了。
故报错。
解决方法:
在proguard-project.txt中,加入不需要混淆的JavaBean对象和对Jackson的不需要混淆代码的语句
-libraryjars libs/jackson-core-asl-1.9.7.jar
-libraryjars libs/jackson-mapper-asl-1.9.7.jar
-keep public class org.codehaus.**{*;}
-keepclassmembers public class org.codehaus.**{*;}
-dontwarn org.codehaus.jackson.**
-keep class org.codehaus.**
-keepnames class org.codehaus.jackson.** { *; }
重新打包签名,问题解决。
参考资料:http://stackoverflow.com/questions/25284562/proguard-aws-s3-issue
先贴上Log:03-02 18:54:11.460: E/TestinAgent(3754): ****************************************
03-02 18:54:12.285: E/AndroidRuntime(3754): FATAL EXCEPTION: main
03-02 18:54:12.285: E/AndroidRuntime(3754): java.lang.NoSuchFieldError: PUBLIC_ONLY
03-02 18:54:12.285: E/AndroidRuntime(3754): at java.lang.Class.getDeclaredAnnotation(Native Method)
03-02 18:54:12.285: E/AndroidRuntime(3754): at java.lang.Class.getAnnotation(Class.java:243)
03-02 18:54:12.285: E/AndroidRuntime(3754): at org.codehaus.jackson.map.introspect.VisibilityChecker$Std.<clinit>(VisibilityChecker.java:178)
03-02 18:54:12.285: E/AndroidRuntime(3754): at org.codehaus.jackson.map.ObjectMapper.<clinit>(ObjectMapper.java:196)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.app.util.JacksonParser.readValue(JacksonParser.java:22)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.app.util.ArticleCollection.onResponse(ArticleCollection.java:60)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.app.util.ArticleCollection.onResponse(ArticleCollection.java:1)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
03-02 18:54:12.285: E/AndroidRuntime(3754): at android.os.Handler.handleCallback(Handler.java:730)
03-02 18:54:12.285: E/AndroidRuntime(3754): at android.os.Handler.dispatchMessage(Handler.java:92)
03-02 18:54:12.285: E/AndroidRuntime(3754): at android.os.Looper.loop(Looper.java:137)
03-02 18:54:12.285: E/AndroidRuntime(3754): at android.app.ActivityThread.main(ActivityThread.java:5493)
03-02 18:54:12.285: E/AndroidRuntime(3754): at java.lang.reflect.Method.invokeNative(Native Method)
03-02 18:54:12.285: E/AndroidRuntime(3754): at java.lang.reflect.Method.invoke(Method.java:525)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
03-02 18:54:12.285: E/AndroidRuntime(3754): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
03-02 18:54:12.285: E/AndroidRuntime(3754): at dalvik.system.NativeStart.main(Native Method)可以看到的是,出现了NoSuchFieldError错误。
百思不得其解,后来终于找到了一个靠谱的说法:
是因为我在代码中解析JSON数据的时候,使用Jackson将JSON数据变成了JavaBean对象,导致代码在打包签名、混淆代码后,找不到原来对象的属性了。
故报错。
解决方法:
在proguard-project.txt中,加入不需要混淆的JavaBean对象和对Jackson的不需要混淆代码的语句
-libraryjars libs/jackson-core-asl-1.9.7.jar
-libraryjars libs/jackson-mapper-asl-1.9.7.jar
-keep public class org.codehaus.**{*;}
-keepclassmembers public class org.codehaus.**{*;}
-dontwarn org.codehaus.jackson.**
-keep class org.codehaus.**
-keepnames class org.codehaus.jackson.** { *; }
重新打包签名,问题解决。
参考资料:http://stackoverflow.com/questions/25284562/proguard-aws-s3-issue
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories