Android 混淆配置及Bug處理
阿新 • • 發佈:2019-01-07
//**為了防止apk反編譯後原始碼洩漏,我們需要對釋出的應用進行混淆打包。**
好東西要分享:
本專案的proguard-rules.pro檔案
#==================================【基本配置】==================================
# 程式碼混淆壓縮比,在0~7之間,預設為5,一般不下需要修改
-optimizationpasses 5
# 混淆時不使用大小寫混合,混淆後的類名為小寫
# windows下的同學還是加入這個選項吧(windows大小寫不敏感)
-dontusemixedcaseclassnames
# 指定不去忽略非公共的庫的類
# 預設跳過,有些情況下編寫的程式碼與類庫中的類在同一個包下,並且持有包中內容的引用,此時就需要加入此條宣告
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共的庫的類的成員
-dontskipnonpubliclibraryclassmembers
# 不做預檢驗,preverify是proguard的四個步驟之一
# Android不需要preverify,去掉這一步可以加快混淆速度
-dontpreverify
# 有了verbose這句話,混淆後就會生成對映檔案
-verbose
#apk 包內所有 class 的內部結構
-dump class_files.txt
#未混淆的類和成員
-printseeds seeds.txt
#列出從 apk 中刪除的程式碼
-printusage unused.txt
#混淆前後的對映
-printmapping mapping.txt
# 指定混淆時採用的演算法,後面的引數是一個過濾器
# 這個過濾器是谷歌推薦的演算法,一般不改變
-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>;
}
# 保留了繼承自Activity、Application這些類的子類
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class * extends android.database.sqlite.SQLiteOpenHelper{*;}
# 如果有引用android-support-v4.jar包,可以新增下面這行
-keep public class com.null.test.ui.fragment.** {*;}
#如果引用了v4或者v7包
-dontwarn android.support.**
# 保留Activity中的方法引數是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);
}
# 保留自定義控制元件(繼承自View)不能被混淆
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(***);
*** get* ();
}
# 保留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 void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 對R檔案下的所有類及其方法,都不能被混淆
-keepclassmembers class **.R$* {
*;
}
# 對於帶有回撥函式onXXEvent的,不能混淆
-keepclassmembers class * {
void *(**On*Event);
}
#==================================【三方配置】==================================
#高德地圖
-keep class com.amap.api.location.**{*;}
-keep class com.amap.api.fence.**{*;}
-keep class com.autonavi.aps.amapapi.model.**{*;}
#arcgis地圖
-dontwarn com.esri.**
-keep class com.esri.** {*;}
-dontwarn org.codehaus.jackson.**
-keep class org.codehaus.jackson.** {*;}
-dontwarn org.codehaus.jackson.**
-keep class org.codehaus.jackson.** {*;}
-dontwarn jcifs.**
-keep class jcifs.** {*;}
#butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
常見Bug:
No1:
一堆警告,編譯失敗,MD。。
解決方法:
新增以下程式碼
#忽略警告
-ignorewarning
No2:
終於編譯成功,點選直接閃退,MD。。
解決方法:
看下日誌,開啟專案目錄\app\build\outputs\mapping\release檔案,開啟對映檔案,找到錯因,原來又是少宣告SQLiteOpenHelper類,然後進行更改
-keep public class * extends android.database.sqlite.SQLiteOpenHelper{*;}
No3:
成功編譯並且進去應用後,當點到某個頁面時突然閃退,MD。。
解決方法:
檢視頁面程式碼,因為常用的類已經宣告防止混淆過了,所以看看這個頁面有沒有用到一些三方包,果然又少配置了,繼續新增宣告防止混淆
-dontwarn org.codehaus.jackson.**
-keep class org.codehaus.jackson.** {*;}
總結:
混淆出錯80%是因為你混淆了不該混淆的類