開啟混淆后打包巾钉,程序出現(xiàn)json解析出錯
原因:沒有配置忽略要解析的model预麸。(已經(jīng)配置了gson忽略文件和泛型)
解決方案
# 自己項目配置:使用Gson時需要配置Gson的解析對象及變量都不混淆滔驶。不然Gson會找不到變量夜郁。
# 注意:替換成自己工程下指定目錄即可什燕。比如com.test.bean
-keep public class xxx.xxx.xxx.** {public private protected *;}
-keep public class tom.test.bean.** {public private protected *;}
問題產(chǎn)生原因
項目開啟混淆后,按照網(wǎng)上的忽略配置了一通后竞端,以為配置gson忽略就好了屎即,結(jié)果還是出了問題。gson忽略如下:
# 保護代碼中的Annotation不被混淆
# 這在JSON實體映射時非常重要事富,比如fastJson
-keepattributes *Annotation*
# 避免混淆泛型
# 這在JSON實體映射時非常重要技俐,比如fastJson
-keepattributes Signature
#gson
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
本來以為按照網(wǎng)上的忽略模板就能愉快的運行起來,結(jié)果還是會遇到各種坑统台,最后查看了各種博客后才解決雕擂。
參考博客:http://blog.csdn.net/shanshan_blog/article/details/53169315
最后附上一些常用的忽略配置
#==================================【基本配置】==================================
# 代碼混淆壓縮比,在0~7之間贱勃,默認為5,一般不下需要修改
-optimizationpasses 5
## 混淆時不使用大小寫混合井赌,混淆后的類名為小寫
## windows下的同學還是加入這個選項吧(windows大小寫不敏感)
-dontusemixedcaseclassnames
#
## 指定不去忽略非公共的庫的類
## 默認跳過,有些情況下編寫的代碼與類庫中的類在同一個包下贵扰,并且持有包中內(nèi)容的引用仇穗,此時就需要加入此條聲明
-dontskipnonpubliclibraryclasses
#
## 指定不去忽略非公共的庫的類的成員
-dontskipnonpubliclibraryclassmembers
# 不做預檢驗,preverify是proguard的四個步驟之一
# Android不需要preverify戚绕,去掉這一步可以加快混淆速度
-dontpreverify
# 有了verbose這句話纹坐,混淆后就會生成映射文件
-verbose
#apk 包內(nèi)所有 class 的內(nèi)部結(jié)構(gòu)
-dump class_files.txt
#未混淆的類和成員
-printseeds seeds.txt
#列出從 apk 中刪除的代碼
-printusage unused.txt
#混淆前后的映射
-printmapping mapping.txt
# 指定混淆時采用的算法,后面的參數(shù)是一個過濾器
# 這個過濾器是谷歌推薦的算法舞丛,一般不改變
-optimizations !code/simplification/artithmetic,!field/*,!class/merging/*
# 保護代碼中的Annotation不被混淆
# 這在JSON實體映射時非常重要耘子,比如fastJson
-keepattributes *Annotation*
# 避免混淆泛型
# 這在JSON實體映射時非常重要果漾,比如fastJson
-keepattributes Signature
# 拋出異常時保留代碼行號
-keepattributes SourceFile,LineNumberTable
#忽略警告
-ignorewarning
#==================================【項目配置】==================================
# 保留所有的本地native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留support下的所有類及其內(nèi)部類
-keep class android.support.** {*;}
# 保留R下面的資源
-keep class **.R$* {*;}
# 保留在Activity中的方法參數(shù)是view的方法,
# 這樣以來我們在layout中寫的onClick就不會被影響
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
# 保留枚舉類不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 這句話會忽略所有文件谷誓,慎用跨晴!
-keepclasseswithmembers class *{
public *;
}
# 保留Parcelable序列化類不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 保留Serializable序列化的類不被混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
#-----------處理第三方依賴庫---------
# For retrolambda
-dontwarn java.lang.invoke.*
#Rxjava and RxAndroid
-dontwarn org.mockito.**
-dontwarn org.junit.**
-dontwarn org.robolectric.**
-keep class rx.** { *; }
-keep interface rx.** { *; }
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-dontwarn okio.**
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**
-dontwarn rx.**
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
@retrofit.http.* <methods>;
}
-keep class sun.misc.Unsafe { *; }
-dontwarn java.lang.invoke.*
-keep class rx.schedulers.Schedulers {
public static <methods>;
}
-keep class rx.schedulers.ImmediateScheduler {
public <methods>;
}
-keep class rx.schedulers.TestScheduler {
public <methods>;
}
-keep class rx.schedulers.Schedulers {
public static ** test();
}
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
long producerNode;
long consumerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
-dontwarn rx.internal.util.unsafe.**
# Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
# Okio
-dontwarn com.squareup.**
-dontwarn okio.**
-keep public class org.codehaus.* { *; }
-keep public class java.nio.* { *; }
#okhttp
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn com.squareup.okhttp.**
#RxLifeCycle
-keep class com.trello.rxlifecycle.** { *; }
-keep interface com.trello.rxlifecycle.** { *; }
#EventBus
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
#butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
#gson
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep class com.bumptech.glide.** { *; }
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
記錄下踩坑,希望有所幫助