今天測試人員提了一個bug,說使用咱們的app出現了閃退的bug,後來經過debug斷點調試,發現咱們的app轉換服務器發送過來的json數據後,都是爲null。而以前已經提測快一個月的功能,一直都是穩定的,爲何如今會報java.lang.NullPointerException。css
原來我提測了一個月的APP版本一直沒有打開混淆開關,而出問題的這個APP版本在即將要發佈出去的時候打開了混淆開關。這樣的話,我那些要經過轉換json數據爲bean實體類,由於沒有在proguard-rules.pro混淆文件聲明不混淆,而致使json轉換的時候,轉換後的數據都是爲nulll。html
在proguard-rules.pro混淆文件中全部jackson對應實體類都要聲明不能混淆
例如:java
#全部jackson對應實體類不能混淆
-keep class com.oyp.model.** {*;}
只要是Json數據轉換後的實體類,都要在混淆文件中保持不混淆linux
不然開啓混淆後,轉換後的數據都會爲null,這個坑稍不注意的話會跌得很慘!android
# 指定代碼的壓縮級別
#-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 *;
#}
-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} 設置源文件中給定的字符串常量
通配符匹配規則
-apache
更詳細的語法請戳:http://proguard.sourceforge.net/manual/usage.html#classspecificationjson
ProGuard的輸出文件說明segmentfault
混淆後,會在/build/proguard/目錄下輸出下面的文件api
dump.txt 描述apk文件中全部類文件間的內部結構。
mapping.txt 列出了原始的類,方法,和字段名與混淆後代碼之間的映射。
seeds.txt 列出了未被混淆的類和成員
usage.txt 列出了從apk中刪除的代碼ruby
當咱們須要處理crash log的時候,就能夠經過mapping.txt的映射關係找到對應的類,方法,字段等。方法以下:
sdk\tools\proguard\bin 目錄下有個retrace工具能夠將混淆後的報錯堆棧解碼成正常的類名
window下爲retrace.bat,linux和mac爲retrace.sh,
使用方法以下:
一、 將crash log保存爲yourfilename.txt
二、 拿到版本發佈時生成的mapping.txt
三、 執行命令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"
}
}
}
}
}
......
}
}
Android ProGuard 混淆 詳解
http://blog.csdn.net/chen930724/article/details/49687067
android 代碼 混淆- 原來如此簡單
使用proguard混淆android代碼
http://my.oschina.net/sammy1990/blog/271306
Android分享:代碼混淆那些事
http://www.javashuo.com/article/p-oojcvjax-r.html
Proguard Square文檔
https://www.guardsquare.com/en/proguard
Proguard Square常見錯誤文檔
https://www.guardsquare.com/en/proguard/manual/troubleshooting
【個人Android進階之旅】Android 混淆文件資源分類整理
http://blog.csdn.net/ouyang_peng/article/details/73088090
做者:歐陽鵬 歡迎轉載,與人分享是進步的源泉!
轉載請保留原文地址:http://blog.csdn.net/ouyang_peng