1、错误描述

今天测试人员提了一个bug,说使用我们的app出现了闪退的bug,后来通过debug断点调试,发现我们的app转换服务器发送过来的json数据后,都是为null。而之前已经提测快一个月的功能,一直都是稳定的,为什么现在会报java.lang.NullPointerException。

2、错误原因

原来我提测了一个月的APP版本一直没有打开混淆开关,而出问题的这个APP版本在即将要发布出去的时候打开了混淆开关。这样的话,我那些要通过转换json数据为bean实体类,因为没有在proguard-rules.pro混淆文件声明不混淆,而导致json转换的时候,转换后的数据都是为nulll。

3、解决方法

在proguard-rules.pro混淆文件中所有jackson对应实体类都要声明不能混淆

例如:

  1. #所有jackson对应实体类不能混淆
  2. -keep class com.oyp.model.** {*;}

4、注意事项

只要是Json数据转换后的实体类,都要在混淆文件中保持不混淆

否则开启混淆后,转换后的数据都会为null,这个坑稍不注意的话会跌得很惨!

5、部分混淆文件

  1. # 指定代码的压缩级别
  2. #-optimizationpasses 5
  3. # 混淆时是否记录日志
  4. -verbose
  5. -dontpreverify # 不预校验
  6. -dontoptimize #不优化输入的类文件
  7. -dontshrink #该选项 表示 不启用压缩
  8. -dontusemixedcaseclassnames # 混淆时不会产生形形色色的类名
  9. -dontskipnonpubliclibraryclasses #不跳过(混淆) jars中的 非public classes 默认选项
  10. #-dontwarn # 去掉警告
  11. #-dontskipnonpubliclibraryclassmembers #不跳过 jars中的非public classes的members
  12. # 优化
  13. #-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
  14. #-allowaccessmodification #优化时允许访问并修改有修饰符的类和类的成员
  15. #-renamesourcefileattribute SourceFile
  16. #-keepattributes SourceFile,LineNumberTable
  17. #-repackageclasses ''
  18. -keepclassmembers class **.R$* {
  19. public static <fields>;
  20. }
  21. -keepattributes Exceptions,InnerClasses,...
  22. #过滤泛型
  23. -keepattributes Signature
  24. #过滤注解
  25. -keepattributes *Annotation*
  26. #过滤js
  27. -keepattributes *JavascriptInterface*
  28. # 保持 native 方法不被混淆
  29. -keepclasseswithmembernames class * {
  30. native <methods>;
  31. }
  32. # keep setters in Views so that animations can still work.
  33. # see http://proguard.sourceforge.net/manual/examples.html#beans
  34. -keepclassmembers public class * extends android.view.View {
  35. void set*(***);
  36. *** get*();
  37. }
  38. # 保持自定义控件类不被混淆
  39. #-keepclasseswithmembers class * {
  40. # public <init>(android.content.Context, android.util.AttributeSet);
  41. #}
  42. #-keepclasseswithmembers class * {
  43. # public <init>(android.content.Context, android.util.AttributeSet, int);
  44. #}
  45. -keepclassmembers class * extends android.app.Activity {
  46. public void *(android.view.View);
  47. }
  48. # 保持枚举 enum 类不被混淆
  49. -keepclassmembers enum * {
  50. public static **[] values();
  51. public static ** valueOf(java.lang.String);
  52. }
  53. # 保持 Parcelable 不被混淆
  54. -keep class * implements android.os.Parcelable {
  55. public static final android.os.Parcelable$Creator *;
  56. }
  57. #-keep public class * {
  58. # public protected *;
  59. #}
  60. -keep public class * implements java.io.Serializable {
  61. public *;
  62. }
  63. -keepclassmembers class * implements java.io.Serializable {
  64. static final long serialVersionUID;
  65. private static final java.io.ObjectStreamField[] serialPersistentFields;
  66. private void writeObject(java.io.ObjectOutputStream);
  67. private void readObject(java.io.ObjectInputStream);
  68. java.lang.Object writeReplace();
  69. java.lang.Object readResolve();
  70. }
  71. -keep class sun.misc.Unsafe { *; }
  72. -dontwarn com.amap.api.**
  73. -dontwarn com.a.a.**
  74. -dontwarn com.autonavi.**
  75. -dontwarn org.apache.http.**
  76. -dontwarn com.fasterxml.jackson.databind.**
  77. -dontwarn com.google.zxing.client.android.**
  78. -dontwarn com.tencent.weibo.sdk.android.**
  79. -dontwarn com.bbk.secureunisignon.**
  80. -dontwarn com.qiniu.android.**
  81. -dontwarn com.umeng.socialize.**
  82. -dontwarn net.sf.json.**
  83. -keep class com.amap.api.** {*;}
  84. -keep class com.autonavi.** {*;}
  85. -keep class com.a.a.** {*;}
  86. -keep class android.support.** {*;}
  87. -keep class org.** {*;}
  88. -keep class com.fasterxml.jackson.core.** {*;}
  89. -keep interface com.fasterxml.jackson.core { *; }
  90. -keep public class * extends com.fasterxml.jackson.core.**
  91. -keep class com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<clinit>
  92. -keep class com.fasterxml.jackson.databind.ObjectMapper.<clinit>
  93. -keep class com.fasterxml.jackson.databind.** {*;}
  94. -keep class com.fasterxml.jackson.databind.introspect.VisibilityChecker$*{*;}
  95. -keep interface com.fasterxml.jackson.databind { *; }
  96. -keep public class * extends com.fasterxml.jackson.databind.**
  97. -keep class net.sf.json.** {*;}
  98. -keep class com.qiniu.android.** {*;}
  99. -keep class com.bbk.secureunisignon.** {*;}
  100. -keep class com.tencent.weibo.sdk.android.** {*;}
  101. -keep class com.umeng.socialize.** {*;}
  102. -keep class com.google.zxing.client.android.** {*;}
  103. -keep class com.j256.ormlite.** {*;}
  104. -keep class com.org.simple.eventbus.**{*;}
  105. -keep class com.android.**{*;}
  106. #-assumenosideeffects class_specification
  107. # 下面两条为EventBus
  108. -keepclassmembers class ** {
  109. public void onEvent*(**);
  110. }
  111. # Only required if you use AsyncExecutor
  112. -keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
  113. <init>(java.lang.Throwable);
  114. }
  115. # for squareup picasso
  116. -dontwarn com.squareup.okhttp.**
  117. # for butterknife
  118. -dontwarn butterknife.internal.**
  119. -keep class **$$ViewInjector { *; }
  120. -keepnames class * { @butterknife.InjectView *;}
  121. #所有jackson对应实体类不能混淆
  122. -keep class com.oyp.model.** {*;}
  123. -keep class com.oyp.dao.**{*;}
  124. -keep class com.oyp.net.bean.** {*;}
  125. -keep class com.oyp.entity.**{*;}
  126. -keep class com.oyp.service.location.PushBean{*;}
  127. -keep class com.oyp.service.umeng.UmengShareInfo{*;}
  128. -keep class com.oyp.service.umeng.UmengShareInfoKV{*;}
  129. ##友盟推送混淆
  130. -dontwarn com.umeng.message.proguard.**
  131. #-dontwarn com.ut.mini.**
  132. -dontwarn okio.**
  133. #-dontwarn com.xiaomi.**
  134. #-dontwarn com.squareup.wire.**
  135. #-dontwarn android.support.v4.**
  136. #
  137. #-keepattributes *Annotation*
  138. #
  139. #-keep class android.support.v4.** { *; }
  140. #-keep interface android.support.v4.app.** { *; }
  141. #
  142. -keep class okio.** {*;}
  143. #-keep class com.squareup.wire.** {*;}
  144. #
  145. #-keep class com.umeng.message.protobuffer.* {
  146. # public <fields>;
  147. # public <methods>;
  148. #}
  149. #
  150. #-keep class com.umeng.message.* {
  151. # public <fields>;
  152. # public <methods>;
  153. #}
  154. #
  155. #-keep class org.android.agoo.impl.* {
  156. # public <fields>;
  157. # public <methods>;
  158. #}
  159. #
  160. #-keep class org.android.agoo.service.* {*;}
  161. #
  162. #-keep class org.android.spdy.**{*;}
  163. #
  164. #-keep public class com.oyp.R$*{
  165. # public static final int *;
  166. #}

6、混淆知识点

  • 保留
  1. -keep {Modifier} {class_specification} 保护指定的类文件和类的成员
  2. -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好
  3. -keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。
  4. -keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
  5. -keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
  6. -keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
  7. -printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件
  • 压缩
  1. -dontshrink 不压缩输入的类文件
  2. -printusage {filename}
  3. -whyareyoukeeping {class_specification}
  • 优化
  1. -dontoptimize 不优化输入的类文件
  2. -assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用
  3. -allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员
  • 混淆
  1. -dontobfuscate 不混淆输入的类文件
  2. -obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称
  3. -overloadaggressively 混淆时应用侵入式重载
  4. -useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆
  5. -flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中
  6. -repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中
  7. -dontusemixedcaseclassnames 混淆时不会产生形形色色的类名
  8. -keepattributes {attribute_name,…} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
  9. -renamesourcefileattribute {string} 设置源文件中给定的字符串常量

混淆后,会在/build/proguard/目录下输出下面的文件

dump.txt 描述apk文件中所有类文件间的内部结构。

mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。

seeds.txt 列出了未被混淆的类和成员

usage.txt 列出了从apk中删除的代码

当我们需要处理crash log的时候,就可以通过mapping.txt的映射关系找到对应的类,方法,字段等。方法如下:

sdk\tools\proguard\bin 目录下有个retrace工具可以将混淆后的报错堆栈解码成正常的类名

window下为retrace.bat,linux和mac为retrace.sh,

使用方法如下:

1、 将crash log保存为yourfilename.txt

2、 拿到版本发布时生成的mapping.txt

3、 执行命令retrace.bat -verbose mapping.txt yourfilename.txt

  所以我们每次打包版本都需要保存最新的mapping.txt文件。如果要使用到第三方的crash统计平台,比如bugly,还需要我们上传APP版本对应的mapping.txt.每次都要保存最新的mapping文件,那不就很麻烦?放心,gradle会帮到你,只需要在bulid.gradle加入下面的一句。每次我们编译的时候,都会自动帮你保存mapping文件到本地的。

  1. android {
  2. applicationVariants.all { variant ->
  3. variant.outputs.each { output ->
  4. if (variant.getBuildType().isMinifyEnabled()) {
  5. variant.assemble.doLast{
  6. copy {
  7. from variant.mappingFile
  8. into "${projectDir}/mappings"
  9. rename { String fileName ->
  10. "mapping-${variant.name}.txt"
  11. }
  12. }
  13. }
  14. }
  15. }
  16. ......
  17. }
  18. }

更多关于混淆的相关内容的参考文章:

作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!

转载请保留原文地址:http://blog.csdn.net/ouyang_peng

我的Android进阶之旅------>解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug的更多相关文章

  1. 我的Android进阶之旅------>解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

    1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: ...

  2. 我的Android进阶之旅------>解决:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.

    错误描述 今天在Android Studio项目中加入了jackson的开发包,编译运行时候,引发了如下的错误: Error:Execution failed for task ':app:trans ...

  3. 我的Android进阶之旅------>解决Error:Could not find property 'compile' on org.gradle.api.internal.artifacts.

    1错误描述 解决方法 1错误原因 2解决方法 1.错误描述 刚刚,Android Studio突然编译不了了,报了如下错误: Error:Could not find property 'compil ...

  4. 我的Android进阶之旅------>解决DownloadManager报错java.lang.SecurityException: Invalid value for visibility: 2

    1.问题描述 今天使用Android系统的DownloadManager进行下载操作时,爆了如下所示的错误: java.lang.RuntimeException: Unable to start s ...

  5. 我的Android进阶之旅------>解决Error: specified for property 'mergedManifest' does not exist.

    错误描述 刚运行从Github上面下载而来的代码时,爆了如下所示的bug,错误描述如下所示: Error:A problem was found with the configuration of t ...

  6. 我的Android进阶之旅------>解决Error:Unable to find method 'org.gradle.api.internal.project.ProjectInternal.g

    错误描述 今天在Github上面下载了一份代码,然后导入到Android Studio中直接报了如下图所示的错误: 错误描述如下: Error: Unable to find method 'org. ...

  7. 我的Android进阶之旅------>解决Android Studio报错:DefaultAndroidProject : Unsupported major.minor version 52.0

    问题描述 今天使用Android Studio 2.0打开我之前的项目时,编译报了如下错误: Error:Cause: com/android/build/gradle/internal/model/ ...

  8. 我的Android进阶之旅------>解决错误:You need to use a Theme.AppCompat theme (or descendant) with this activity.

    #1.错误描述 今天,想实现Activity不显示标题栏的效果,在项目的AndroidManifest.xml文件,对相应的Activity添加属性 android:theme="@andr ...

  9. 我的Android进阶之旅------>解决Android Studio编译后安装apk报错:The APK file does not exist on disk

    1.错误描述 今天用Android Studio编译应用后安装APK的时候,报错了,错误如下所示: The APK file build\outputs\apk\OYP_2.3.4_I2Base_64 ...

随机推荐

  1. OSGi规范概要

    目前最新的OSGi规范是2012年7月发布的Release 5,Version5.0(后文简称为R5.0)版本,该规范定义了Java模块化系统所涉及的各种场景(开发.打包.部署.更新和交互等),以及其 ...

  2. ThinkPHP分页实例

    ThinkPHP分页实例 (2014-09-20 15:34:36)   很多人初学thinkphp时,不太熟悉thinkphp的分页使用方法,现在将自己整理的分页方法分享下,有需要的朋友可以看看. ...

  3. 0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚

    @Transactianal注解有一些属性,见Spring-Framework-Reference Table17.3 Transactional-settings @Transactional(pr ...

  4. lseek,fcntl,ioctl函数

    函数说明:每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾. 当read()或write()时 ...

  5. Qt之模式、非模式对话框

    关于“模式”和“非模式”对话框,相信大家都比较熟悉,但其中有一个可能很多人都比较陌生,介于两者之间的状态,我们称之为“半模式“. 模式对话框 描述 阻塞同一应用程序中其它可视窗口输入的对话框.模式对话 ...

  6. yii save model return id null

    /** * Creates a new model. * If creation is successful, the browser will be redirected to the 'view' ...

  7. kettle的job中使用循环

     job中使用循环 在一个不稳定的网络环境下作文件传输.偶尔会有超时或连接重置.这时须要稍等片刻再重试.在重试10次之后放弃并结束该job.类似使用循环解决这类问题.  该演示样例job演示了这样 ...

  8. 玩转Win10的45个快捷键

    1Win10快捷键大全(第一部分) Win10发布已经快两个星期了,各项新功能也让小伙伴们兴奋不已.和之前系统一样,Win10也加入了很多经典的快捷键,同时还加入了全新触控手势.今天小编就将所有的Wi ...

  9. 参考 generate-parentheses

    分析: 关键:当前位置左括号不少于右括号 图是什么?        节点:目前位置左括号和右括号数(x,y)(x>=y)        边:从(x,y)到(x+1,y)和(x,y+1)     ...

  10. Adversarial Training

    原于2018年1月在实验室组会上做的分享,今天分享给大家,希望对大家科研有所帮助. 今天给大家分享一下对抗训练(Adversarial Training,AT). 为何要选择这个主题呢? 我们从上图的 ...