Android 关于引用jackson的jar包混淆报错或打包后运行报错崩溃
2014-09-05 23:25
393 查看
json是个好东西, 现在CS架构的数据传递方式主要是XML 和 json. 两者都有各自的类似的解析方法. 而Android的开发环境已经内置了支持json和XML的解析, 而且给力! 但用得多了肯定不少人在想有没有解析json更加快捷有效的方法呢? 于是, fastjson, Jackson等等这些第三方也成了不少开发者的选择. 但是相应的, 引入第三方jar就意味着更多在混淆代码报错的几率,
而如果你用了Jackson的jar , 在混淆代码或者打包成功后运行报以下错误
碰到在项目中有用了这三个包 jackson-annotation-2.0.6.jar , jackson-core-2.1.4.jar , jackson-databind-2.0.6.jar
![](http://img.blog.csdn.net/20140905233708734?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3R6eTAw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
报以下的错
java.lang.ExceptionInInitializerError ... ...
... ...
at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ExceptionInInitializerError at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(Unknown Source)
more Caused by: java.lang.NullPointerException at com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<init>(Unknown Source)...
at com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<clinit>(Unknown Source)
... 15 more
java.lang.ExceptionInInitializerError at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(Unknown Source)
... ...
特别是你在adt上测试运行没问题, 然后混淆打包后一运行, 就报以上错的, 相当大机会是Jackson这个jar导致的问题.
那么, 请试试在你的混淆文件
proguard.cfg 中加入以下三行注解:
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
上面3句的作用, 一般用json封装好的第三方jar, 比如Jackson, 都使用到泛型(就是类型转换, 提前建立一个对象类, 然后将对象的属性和所接收的json数据的key-value 去对应的映射, 最终转换成特定类型).而-keepattributes
Signature 是滤过泛型的 (keepattributes是啥意思都懂的), 如果不加这句会容易导致实例化出错. -keepattributes *Annotation*
过滤所有的Annotation, 否则会报空指针NullPointerException异常, 而Jackson是使用了注解的, 而且默认NULL可参与序列化的, 所以就要过滤注解! sun.misc.Unsafe , 提供给Java一个方式去接触硬件级别的操作系统底层的东西, 大多是内存管理神马的, 默认要设置.
Moreever,
补充下: Jackson转json实体类空或者NULL不参加序列化的方法, 就是将新建的ObjectMapper对象改为Include.NON_NULL这个属性.EX,
参考文章:
ANDROID开发PROGUARD混淆与反射--PROGUARD与
java bean
使用proguard混淆android代码
sun.misc.unsafe类的使用
sun.misc.Unsafe
而如果你用了Jackson的jar , 在混淆代码或者打包成功后运行报以下错误
碰到在项目中有用了这三个包 jackson-annotation-2.0.6.jar , jackson-core-2.1.4.jar , jackson-databind-2.0.6.jar
报以下的错
java.lang.ExceptionInInitializerError ... ...
... ...
at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ExceptionInInitializerError at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(Unknown Source)
more Caused by: java.lang.NullPointerException at com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<init>(Unknown Source)...
at com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<clinit>(Unknown Source)
... 15 more
java.lang.ExceptionInInitializerError at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(Unknown Source)
... ...
特别是你在adt上测试运行没问题, 然后混淆打包后一运行, 就报以上错的, 相当大机会是Jackson这个jar导致的问题.
那么, 请试试在你的混淆文件
proguard.cfg 中加入以下三行注解:
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
上面3句的作用, 一般用json封装好的第三方jar, 比如Jackson, 都使用到泛型(就是类型转换, 提前建立一个对象类, 然后将对象的属性和所接收的json数据的key-value 去对应的映射, 最终转换成特定类型).而-keepattributes
Signature 是滤过泛型的 (keepattributes是啥意思都懂的), 如果不加这句会容易导致实例化出错. -keepattributes *Annotation*
过滤所有的Annotation, 否则会报空指针NullPointerException异常, 而Jackson是使用了注解的, 而且默认NULL可参与序列化的, 所以就要过滤注解! sun.misc.Unsafe , 提供给Java一个方式去接触硬件级别的操作系统底层的东西, 大多是内存管理神马的, 默认要设置.
Moreever,
补充下: Jackson转json实体类空或者NULL不参加序列化的方法, 就是将新建的ObjectMapper对象改为Include.NON_NULL这个属性.EX,
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开发PROGUARD混淆与反射--PROGUARD与java bean
使用proguard混淆android代码
sun.misc.unsafe类的使用
sun.misc.Unsafe
相关文章推荐
- Android 关于引用jackson的jar包混淆报错或打包后运行报错崩溃
- 【Android开发经验】关于主题引用混乱导致程序运行崩溃的问题
- 【Android开发经验】关于主题引用混乱导致程序运行崩溃的问题
- android打包准备:混淆第三方jar包(Gson, greenDao,sharesdk,UIL,高德地图, unity,pinyin4j,async http,JPush,EventBus等)
- android打包准备:混淆第三方jar包(Gson, greenDao,sharesdk,UIL,高德地图, unity,pinyin4j,async http,JPush,EventBus等)
- Android打包混淆报The same input jar [*.jar] is specified twice 的错误
- 关于在编译或运行时如何批量引用jar包
- Android打包出的jar包混淆
- android打包准备:混淆第三方jar包(Gson, greenDao,sharesdk,UIL,高德地图, unity,pinyin4j,async http,JPush,EventBus等)
- Android程序引用外部jar时,build.xml打包脚本配置
- 关于把android项目打包成jar的尝试
- 解决android应用引用第三方jar包混淆打包报错
- 关于Eclipse的Android项目,在直接运行可以,打包安装就报错,说某个类不存在的解决
- 关于 android 混淆 怎么去掉 混淆过依赖的jar包(混淆过的jar包不做二次混淆)
- 关于maven打包时出现jar包版本的多重引用导致最终war包里的版本不是最新的
- Android混淆打包及混淆后运行错误
- 关于jar打包双击运行的问题
- Android - 百度地图打包混淆代码后地图崩溃的解决方法
- android打包准备:混淆第三方jar包(Gson, greenDao,sharesdk,UIL,高德地图, unity,pinyin4j,async http,JPush,EventBus等)
- 求教关于ant引用android第三方工程打包的问题