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对应实体类都要声明不能混淆

例如:

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

4、注意事项

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

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

5、部分混淆文件

# 指定代码的压缩级别
#-optimizationpasses 5 # 混淆时是否记录日志
-verbose
-dontpreverify # 不预校验
-dontoptimize #不优化输入的类文件
-dontshrink #该选项 表示 不启用压缩 -dontusemixedcaseclassnames # 混淆时不会产生形形色色的类名
-dontskipnonpubliclibraryclasses #不跳过(混淆) jars中的 非public classes 默认选项 #-dontwarn # 去掉警告
#-dontskipnonpubliclibraryclassmembers #不跳过 jars中的非public classes的members # 优化
#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #-allowaccessmodification #优化时允许访问并修改有修饰符的类和类的成员
#-renamesourcefileattribute SourceFile
#-keepattributes SourceFile,LineNumberTable
#-repackageclasses '' -keepclassmembers class **.R$* {
public static <fields>;
} -keepattributes Exceptions,InnerClasses,...
#过滤泛型
-keepattributes Signature
#过滤注解
-keepattributes *Annotation*
#过滤js
-keepattributes *JavascriptInterface* # 保持 native 方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
} # keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
} # 保持自定义控件类不被混淆
#-keepclasseswithmembers class * {
# public <init>(android.content.Context, android.util.AttributeSet);
#} #-keepclasseswithmembers class * {
# public <init>(android.content.Context, android.util.AttributeSet, int);
#} -keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
} # 保持枚举 enum 类不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
} # 保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
} #-keep public class * {
# public protected *;
#} -keep public class * implements java.io.Serializable {
public *;
} -keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
} -keep class sun.misc.Unsafe { *; } -dontwarn com.amap.api.**
-dontwarn com.a.a.**
-dontwarn com.autonavi.** -dontwarn org.apache.http.**
-dontwarn com.fasterxml.jackson.databind.** -dontwarn com.google.zxing.client.android.**
-dontwarn com.tencent.weibo.sdk.android.**
-dontwarn com.bbk.secureunisignon.**
-dontwarn com.qiniu.android.**
-dontwarn com.umeng.socialize.**
-dontwarn net.sf.json.** -keep class com.amap.api.** {*;}
-keep class com.autonavi.** {*;}
-keep class com.a.a.** {*;} -keep class android.support.** {*;}
-keep class org.** {*;}
-keep class com.fasterxml.jackson.core.** {*;}
-keep interface com.fasterxml.jackson.core { *; }
-keep public class * extends com.fasterxml.jackson.core.**
-keep class com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.<clinit>
-keep class com.fasterxml.jackson.databind.ObjectMapper.<clinit>
-keep class com.fasterxml.jackson.databind.** {*;}
-keep class com.fasterxml.jackson.databind.introspect.VisibilityChecker$*{*;}
-keep interface com.fasterxml.jackson.databind { *; }
-keep public class * extends com.fasterxml.jackson.databind.**
-keep class net.sf.json.** {*;}
-keep class com.qiniu.android.** {*;}
-keep class com.bbk.secureunisignon.** {*;}
-keep class com.tencent.weibo.sdk.android.** {*;}
-keep class com.umeng.socialize.** {*;}
-keep class com.google.zxing.client.android.** {*;}
-keep class com.j256.ormlite.** {*;}
-keep class com.org.simple.eventbus.**{*;} -keep class com.android.**{*;}
#-assumenosideeffects class_specification # 下面两条为EventBus
-keepclassmembers class ** {
public void onEvent*(**);
} # Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
} # for squareup picasso
-dontwarn com.squareup.okhttp.** # for butterknife
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector { *; }
-keepnames class * { @butterknife.InjectView *;} #所有jackson对应实体类不能混淆
-keep class com.oyp.model.** {*;}
-keep class com.oyp.dao.**{*;}
-keep class com.oyp.net.bean.** {*;}
-keep class com.oyp.entity.**{*;}
-keep class com.oyp.service.location.PushBean{*;}
-keep class com.oyp.service.umeng.UmengShareInfo{*;}
-keep class com.oyp.service.umeng.UmengShareInfoKV{*;} ##友盟推送混淆
-dontwarn com.umeng.message.proguard.** #-dontwarn com.ut.mini.**
-dontwarn okio.**
#-dontwarn com.xiaomi.**
#-dontwarn com.squareup.wire.**
#-dontwarn android.support.v4.**
#
#-keepattributes *Annotation*
#
#-keep class android.support.v4.** { *; }
#-keep interface android.support.v4.app.** { *; }
#
-keep class okio.** {*;}
#-keep class com.squareup.wire.** {*;}
#
#-keep class com.umeng.message.protobuffer.* {
# public <fields>;
# public <methods>;
#}
#
#-keep class com.umeng.message.* {
# public <fields>;
# public <methods>;
#}
#
#-keep class org.android.agoo.impl.* {
# public <fields>;
# public <methods>;
#}
#
#-keep class org.android.agoo.service.* {*;}
#
#-keep class org.android.spdy.**{*;}
#
#-keep public class com.oyp.R$*{
# public static final int *;
#}

6、混淆知识点

  • 保留
-keep {Modifier} {class_specification} 保护指定的类文件和类的成员

    -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好

    -keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

    -keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)

    -keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)

    -keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)

    -printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件
  • 压缩
     -dontshrink 不压缩输入的类文件

    -printusage {filename}

    -whyareyoukeeping {class_specification}
  • 优化
   -dontoptimize 不优化输入的类文件

    -assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用

    -allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员
  • 混淆
-dontobfuscate 不混淆输入的类文件

    -obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称

    -overloadaggressively 混淆时应用侵入式重载

    -useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆

    -flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中

    -repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中

    -dontusemixedcaseclassnames 混淆时不会产生形形色色的类名

    -keepattributes {attribute_name,…} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.

    -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文件到本地的。

android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
if (variant.getBuildType().isMinifyEnabled()) {
variant.assemble.doLast{
copy {
from variant.mappingFile
into "${projectDir}/mappings"
rename { String fileName ->
"mapping-${variant.name}.txt"
}
}
}
}
}
......
}
}

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

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

转载请保留原文地址: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. make之eval函数

    函数原型: $(eval text) 它的意思是 text 的内容将作为makefile的一部分而被make解析和执行. 需要注意的是该函数在执行时会对它的参数进行两次展开,第一次展开是由函数本身完成 ...

  2. 0057 Spring MVC如何获取HTTP请求头信息--URL中的动态参数--@RequestHeader--@CookieValue--@PathVariable

    获取HTTP请求头信息 一个HTTP请求除了有参数和实体内容外还有HTTP请求头信息,Spring MVC也可以获取这部分信息 @RequestHeader解可以将请求头信息映射到处理方法的形参上 @ ...

  3. string 大小写转换

      STL的algorithm库确实给我们提供了这样的便利,使用模板函数transform可以轻松解决这个问题,开发人员只需要提供一个函数对象,例如将char转成大写的toupper函数或者小写的函数 ...

  4. linux学习笔记33--命令netstat和ss

    我们以前接触过了vmstat,iostat了,这次是netstat.route,traceroute,ping,netstat这些命令与计算机网络相关性很强,最好是能先了解下TCP/IP协议. net ...

  5. TCP/IP各层协议数据格式

    ISO规范里定义了7层网络模型,实际常用的仍为TCPIP四层网络模型. 注:本文章插图均来自<图解TCP/IP>. 数据链路层帧格式 经常说的帧格式为以太网帧格式,由于类型和帧长度字段不重 ...

  6. hihoCoder #1291 : Building in Sandbox 逆向处理+并查集维护

    /** 题目:#1291 : Building in Sandbox 链接:https://hihocoder.com/problemset/problem/1291 题意:就是一个三维的空间里,按照 ...

  7. php 路由实现

    因为有小的业务逻辑比较复杂,orm用起来很麻烦,但是多入口又不好控制,每个页面都去包含,多了就迷了,所以就只写了个路由,加了个防注入 封装增删改查好无聊,直接封装业务逻辑,为业务而开发,业务逻辑里是面 ...

  8. EJB包含哪3种bean

    EJB包含哪3种bean 解答:session bean(会话bean), entity bean(实体bean), message bean(消息bean)

  9. 为什么需要标准IO缓冲?

    (转)标准I/O缓冲:全缓冲.行缓冲.无缓冲 标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数.它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的 ...

  10. C语言中文网

    网址:http://c.biancheng.net/cpp/ 涵盖如下: