1. 程式人生 > >Android 混淆配置及Bug處理

Android 混淆配置及Bug處理

//**為了防止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%是因為你混淆了不該混淆的類