常用混淆配置

我們的APK發(fā)布之前都需要混淆簽名,打包,發(fā)布。最近接觸混淆,所以寫個(gè)文章記錄一下自己的學(xué)習(xí)路徑,以后用的時(shí)候也好回顧一下,善于總結(jié),變成我自己的知識(shí)。
混淆是的官網(wǎng)地址:http://proguard.sourceforge.net/。

AndroidStudiobuild.gradle中配置相應(yīng)的混淆項(xiàng),首先build.gradle里面默認(rèn)有如下一段代碼:

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

默認(rèn)不開啟混淆,如果需要開啟混淆,則將minifyEnabled改成true.

常見庫(kù)的混淆配置:
在Android中有默認(rèn)的混淆配置,但是可能不滿足你的所有的需求,有一些類或者方法不希望被混淆,這個(gè)時(shí)候就要配置自己的混淆項(xiàng)。

混淆文件是module的proguard-rules中。

混淆語法

-libraryjars class_path 避免混淆第三方j(luò)ar包 ,后面連接包路徑
-keep {Modifier} {class_specification} 保護(hù)指定的類文件和類的成員
-keepclassmembers {modifier} {class_specification} 保護(hù)指定類的成員,如果此類受到保護(hù)他們會(huì)保護(hù)的更好
-keepclasseswithmembers {class_specification} 保護(hù)指定的類和類的成員,但條件是所有指定的類和類成員是要存在。
-keepnames {class_specification} 保護(hù)指定的類和類的成員的名稱(如果他們不會(huì)壓縮步驟中刪除)
-keepclassmembernames {class_specification} 保護(hù)指定的類的成員的名稱(如果他們不會(huì)壓縮步驟中刪除)
-keepclasseswithmembernames {class_specification} 保護(hù)指定的類和類的成員的名稱,如果所有指定的類成員存在(在壓縮步驟之后)

常見配置如下:

###-----------基本指令--------------------
###-----------指定代碼的壓縮級(jí)別------------
-optimizationpasses 5
###-----------是否使用大小寫混合------------
-dontusemixedcaseclassnames
###-----------混淆時(shí)是否做預(yù)校驗(yàn)------------
-dontpreverify
###-----------混淆時(shí)是否記錄日志------------
-verbose
###-----------忽略警告------------
-ignorewarnings
-keepattributes EnclosingMethod

###-----------保證異常時(shí)顯示行號(hào)------------
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

 #dump文件列出apk包內(nèi)所有class的內(nèi)部結(jié)構(gòu)
-dump class_files.txt        

#seeds.txt文件列出未混淆的類和成員
-printseeds seeds.txt

#usage.txt文件列出從apk中刪除的代碼
-printusage unused.txt

#mapping文件列出混淆前后的映射
-printmapping mapping.txt

###-----------注解------------
-keepattributes *Annotation*

###-----------泛型------------
-keepattributes Signature

###-----------異常------------
-keepattributes Exceptions

###-----------混淆時(shí)所采用的算法------------
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
###-----------避免混淆Android基本組件的配置--------------------
###-----------保持Activity類不被混淆------------
-keep public class * extends android.app.Activity
###-----------保持AppCompatActivity類不被混淆------------
-keep public class * extends android.support.v7.app.AppCompatActivity
###-----------保持DialogFragment類不被混淆------------
-keep public class * extends android.app.DialogFragment
###-----------保持Application類不被混淆------------
-keep public class * extends android.app.Application
###-----------保持Service類不被混淆------------
-keep public class * extends android.app.Service
###-----------保持BroadcastReceiver類不被混淆------------
-keep public class * extends android.content.BroadcastReceiver
###-----------保持ContentProvider類不被混淆------------
-keep public class * extends android.content.ContentProvider
###-----------保持BackupAgentHelper類不被混淆------------
-keep public class * extends android.app.backup.BackupAgentHelper
###-----------保持Preference類不被混淆------------
-keep public class * extends android.preference.Preference
###-----------保持ILicensingService類不被混淆------------
-keep public class com.android.vending.licensing.ILicensingService

###-----------保持 native 方法不被混淆------------
-keepclasseswithmembernames class * {
    native <methods>;
}

###-----------保持自定義控件類不被混淆------------
-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 *;
} 

###----------混淆第三方庫(kù)-----------------

###-----------保持 retrofit client 不被混淆------------
-keep class com.excellence.retrofit.RetrofitHttpService { *; }

###-----------保持 retrofit 不被混淆------------
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-dontwarn javax.annotation.**

###-----------保持 okhttp 不被混淆------------
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**

###-----------保持 GreenDao 不被混淆------------
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties

###-----------保持 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);
}

###-----------保持 bugly 不被混淆------------
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}

###-----------保持 gson 不被混淆------------
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }

###-----------保持 Rxjava RxAndroid 不被混淆------------
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
   long producerIndex;
   long consumerIndex;
}
-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;
}

###-----------保持 volley 不被混淆------------
-keep class com.android.volley.** { *; }
-keep class com.android.volley.toolbox.** { *; }

當(dāng)你的工程引用了其他庫(kù)的時(shí)候,你應(yīng)該對(duì)該庫(kù)也進(jìn)行混淆配置?;煜渲猛炅酥笮枰敿?xì)的測(cè)試是否有問題,可能由于混淆導(dǎo)致某個(gè)類找不到了從而程序不能正常運(yùn)行。

混淆雖然可以一定程度上防止別人反編譯你的代碼,但是混淆也存在缺點(diǎn),混淆之后的代碼,對(duì)于開發(fā)人員定位問題的位置不太友好,因?yàn)閳?bào)錯(cuò)都是abcd之類的名字,我們也不知道是哪個(gè)類,哪個(gè)方法了。不過還好,我們有工具協(xié)助。可以將錯(cuò)誤還原成原來的代碼。

首先找到你的Android的sdk目錄。然后找到tools--> proguard -->bin-->proguardgui.bat.雙擊打開之后如下圖:

2中mapping.txt的路徑app\build\outputs\mapping\發(fā)布渠道\release\mapping.txt,這個(gè)文件記錄了混淆的規(guī)則,混淆前類和混淆后類的對(duì)應(yīng)關(guān)系,所以可以根據(jù)這個(gè)文件還原混淆前的類,我覺得翻譯成原來的類更為貼切。
這樣你就可以對(duì)已經(jīng)發(fā)布的apk,bug的log進(jìn)行翻譯并且定位了。

PS: 工程配置了混淆之后,需要詳細(xì)測(cè)試,因?yàn)榭赡苡捎诨煜竽承╊愓也坏綇亩绊懗绦蛘_\(yùn)作。

參考:
Android混淆總結(jié)篇(一)
5分鐘搞定android混淆

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容