Android 关于引用jackson的jar包混淆报错或打包后运行报错崩溃
2015-08-03 18:20
661 查看
json是个好东西, 现在CS架构的数据传递方式主要是XML 和 json. 两者都有各自的类似的解析方法. 而Android的开发环境已经内置了支持json和XML的解析, 而且给力! 但用得多了肯定不少人在想有没有解析json更加快捷有效的方法呢? 于是, fastjson, Jackson等等这些第三方也成了不少开发者的选择. 但是相应的, 引入第三方jar就意味着更多在混淆代码报错的几率, 而如果你用了Jackson的jar , 在混淆代码或者打包成功后运行报以下错误
碰到在项目中有用了这两个包 jackson-core-asl-1.9.13.jar , jackson-mapper-asl-1.9.13.jar
报以下的错
java.lang.ExceptionInInitializerError … …
… …
at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ExceptionInInitializerError at com.fasterxml.jackson.databind.ObjectMapper.(Unknown Source)
more Caused by: java.lang.NullPointerException at com.fasterxml.jackson.databind.introspect.VisibilityCheckerStd.(UnknownSource)…atcom.fasterxml.jackson.databind.introspect.VisibilityCheckerStd.(Unknown Source)…
at com.fasterxml.jackson.databind.introspect.VisibilityCheckerStd.(Unknown Source)
… 15 more
java.lang.ExceptionInInitializerError at com.fasterxml.jackson.databind.ObjectMapper.(Unknown Source)
… …
特别是你在adt上测试运行没问题, 然后混淆打包后一运行, 就报以上错的, 相当大机会是Jackson这个jar导致的问题.
那么, 请试试在你的混淆文件 proguard.cfg 中加入以下注解:
上面的作用, 一般用json封装好的第三方jar, 比如Jackson, 都使用到泛型(就是类型转换, 提前建立一个对象类, 然后将对象的属性和所接收的json数据的key-value 去对应的映射, 最终转换成特定类型).而-keepattributes Signature 是滤过泛型的 (keepattributes是啥意思都懂的), 如果不加这句会容易导致实例化出错. -keepattributes Annotation 过滤所有的Annotation, 否则会报空指针NullPointerException异常, 而Jackson是使用了注解的, 而且默认NULL可参与序列化的, 所以就要过滤注解!
Moreever, 补充下: Jackson转json实体类空或者NULL不参加序列化的方法, 就是将新建的ObjectMapper对象改为Include.NON_NULL这个属性.EX,
[java] view plaincopy
ObjectMapper oMapper = new ObjectMapper();
oMapper.setSerializationInclusion(Include.NON_NULL);
//通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
//Include.Include.ALWAYS 默认
//Include.NON_DEFAULT 属性为默认值不序列化
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//Include.NON_NULL 属性为NULL 不序列化
碰到在项目中有用了这两个包 jackson-core-asl-1.9.13.jar , jackson-mapper-asl-1.9.13.jar
报以下的错
java.lang.ExceptionInInitializerError … …
… …
at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ExceptionInInitializerError at com.fasterxml.jackson.databind.ObjectMapper.(Unknown Source)
more Caused by: java.lang.NullPointerException at com.fasterxml.jackson.databind.introspect.VisibilityCheckerStd.(UnknownSource)…atcom.fasterxml.jackson.databind.introspect.VisibilityCheckerStd.(Unknown Source)…
at com.fasterxml.jackson.databind.introspect.VisibilityCheckerStd.(Unknown Source)
… 15 more
java.lang.ExceptionInInitializerError at com.fasterxml.jackson.databind.ObjectMapper.(Unknown Source)
… …
特别是你在adt上测试运行没问题, 然后混淆打包后一运行, 就报以上错的, 相当大机会是Jackson这个jar导致的问题.
那么, 请试试在你的混淆文件 proguard.cfg 中加入以下注解:
-dontpreverify -dontwarn -dontnote -verbose -keepattributes Signature,*Annotation*,*EnclosingMethod* -keep class org.codehaus.** { *; } -keepnames class com.fasterxml.jackson.** { *; } -keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility { public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; }
上面的作用, 一般用json封装好的第三方jar, 比如Jackson, 都使用到泛型(就是类型转换, 提前建立一个对象类, 然后将对象的属性和所接收的json数据的key-value 去对应的映射, 最终转换成特定类型).而-keepattributes Signature 是滤过泛型的 (keepattributes是啥意思都懂的), 如果不加这句会容易导致实例化出错. -keepattributes Annotation 过滤所有的Annotation, 否则会报空指针NullPointerException异常, 而Jackson是使用了注解的, 而且默认NULL可参与序列化的, 所以就要过滤注解!
Moreever, 补充下: Jackson转json实体类空或者NULL不参加序列化的方法, 就是将新建的ObjectMapper对象改为Include.NON_NULL这个属性.EX,
[java] view plaincopy
ObjectMapper oMapper = new ObjectMapper();
oMapper.setSerializationInclusion(Include.NON_NULL);
//通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
//Include.Include.ALWAYS 默认
//Include.NON_DEFAULT 属性为默认值不序列化
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//Include.NON_NULL 属性为NULL 不序列化
相关文章推荐
- Android发送短信
- Android复习笔记(7) -发送广播
- Android复习笔记(6) -BrodCastReceiver (广播接收者
- Actvity的启动模式相关(转)
- android控件的事件传播机制
- Android复习笔记(5)-数据库操作 sqllite
- Android复习笔记(4) - 文件读取相关
- Android复习笔记(3)-android下的junit
- Android图片缩放库 Photoview 和 Gif 控件GifView 的使用
- Android拨号
- Android复习笔记(2) - Intent介绍
- android复习笔记(1) - Activity相关
- AndroidStudio com.android.dex.dexException
- Android 自定义ViewGroup布局控件,垂直滚动引导
- Android:OptionMenu
- Android 系统Settings概要
- android根据姓名首字母字符顺序读取通信录
- android 内存泄露之jni local reference table overflow (max=512)
- android退出机制方法
- android 状态栏颜色的改变