我的Android混淆(Proguard文件)是怎么寫的

當(dāng)前環(huán)境

Android Studio: 3.2.1
Gradle 插件: 'com.android.tools.build:gradle:3.2.1'
Gradle : gradle-4.6

具體配置

因?yàn)閜roguard文件要靠手寫,所以有時(shí)候感覺很難,但是找到規(guī)律之后也挺簡單的,感覺難是因?yàn)?,不熟悉它的一些關(guān)鍵字,這里列出了常用的關(guān)鍵字,以及人能看懂的含義,其實(shí)要想看明白,自己寫的Demo測試一下就好了,借助于反編譯工具看下到底什么被混淆了,工具看這。我下面寫了詳細(xì)的注釋github,常用的也就這么多了,其余的可以根據(jù)命令行進(jìn)行調(diào)試,然后逐個(gè)添加。

#-ignorewarnings                     # 忽略警告,避免打包時(shí)某些警告出現(xiàn)
-optimizationpasses 5               # 指定代碼的壓縮級(jí)別
-dontusemixedcaseclassnames         # 是否使用大小寫混合 混淆時(shí)不會(huì)產(chǎn)生形形色色的類名
-dontskipnonpubliclibraryclasses    # 是否混淆第三方j(luò)ar
-dontpreverify                      # 混淆時(shí)是否做預(yù)校驗(yàn)
-verbose                            # 混淆時(shí)是否記錄日志
-dontoptimize                       # 不優(yōu)化輸入的類文件

## 這個(gè) SourceFile 可以字 Smali 文件里面 .source "xxxx" 保證原始類名不被抹掉
-keepattributes *Annotation*, SourceFile, InnerClasses, LineNumberTable, Signature, EnclosingMethod
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*    #優(yōu)化 混淆時(shí)采用的算法

-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.app.View
-keep public class * extends android.app.IntentService
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.hardware.display.DisplayManager
-keep public class * extends android.os.UserManager
-keep public class com.android.vending.licensing.ILicensingService
-keep public class * extends android.app.Fragment

-keep public class * extends android.support.v4.widget
#  *匹配任意字符不包括 “ . ” ,**匹配任意字符
#  下面這行的意思是,保留v4下面的類名及其v4下面子包的類名不被混淆
-keep public class * extends android.support.v4.**  
# 下面 這行表示一個(gè)接口中的所有的東西都不被混淆  
-keep interface android.support.v4.app.** { *; }    
# 下面這行表示保持這個(gè)包及其子包下面的所有類的類名及其類里面的所有內(nèi)容都不混淆
-keep class android.support.v4.** { *; }        
-keep class android.os.**{*;}
-keep class android.support.v8.renderscript.** { *; }

-keep class **.R$* { *; }
-keep class **.R{ *; }

#實(shí)現(xiàn)了android.os.Parcelable接口類的任何類,以及其內(nèi)部定義的Creator內(nèi)部類類型的public final靜態(tài)成員變量,都不能被混淆和刪除
-keep class * implements android.os.Parcelable {    # 保持Parcelable不被混淆
  public static final android.os.Parcelable$Creator *;
}

#keepclasseswithmembernames  保留類和類中的成員,防止被混淆,保留指明的成員,成員沒有引用會(huì)被移除
# 保持 native 方法不被混淆
-keepclasseswithmembernames class * {     
    native <methods>;
}

#keepclasseswithmembers 保留類和類中的成員,防止被混淆或移除,保留指明的成員(和上面的區(qū)別是,這里會(huì)防止被移除)
#  保持自定義控件類名和構(gòu)造方法不被混淆或移除
-keepclasseswithmembers class * {        
    public <init>(android.content.Context, android.util.AttributeSet);
}

# 保持自定義控件類不被混淆
-keepclasseswithmembers class * {         
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclasseswithmembers class * {
  public <init>(android.content.Context, android.util.AttributeSet, int, int);
}

-keepclassmembers class * extends android.app.Activity { #保持類成員
   public void *(android.view.View);
}

-keepclassmembers class * extends android.content.Context {
  public void *(android.view.View);
  public void *(android.view.MenuItem);
}

-keepclassmembers enum * {                  # 保持枚舉 enum 類不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
-keepnames class * implements java.io.Serializable

-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();
}

#####################上面這些是系統(tǒng)默認(rèn)配置的#####################3
## 一般來說上面的這些即使我們不寫,開了混淆也會(huì)自動(dòng)啟用
## 現(xiàn)在我用的 Android Studio Gradle的插件是 3.2.1 這個(gè)插件自帶默認(rèn)混淆文件
## 在啟用混淆的時(shí)候解壓出來,詳情參考 /項(xiàng)目名/build/intermediates/proguard-files/proguard-android.txt-3.2.1 里面的注釋
## 注釋上說gradle 的 Android 插件,從2.2 版本開始,不再使用sdk本地的Proguard,而以后gradle插件自帶默認(rèn)Proguard配置文件


#-libraryjars   libs/jar包名字.jar   #缺省proguard 會(huì)檢查每一個(gè)引用是否正確,但是第三方庫里面往往有些不會(huì)用到的類,沒有正確引用。如果不配置的話,系統(tǒng)就會(huì)報(bào)錯(cuò)。
-dontwarn android.support.v4.**
-dontwarn android.os.**

#編譯時(shí)關(guān)掉Log的打印,
#-assumenosideeffects class android.util.Log {    #如果是自定義Log類,修改下面的包名
#        public static *** d(...);
#        public static *** e(...);
#        public static *** i(...);
#        public static *** v(...);
#        public static *** println(...);
#        public static *** w(...);
#        public static *** wtf(...);
#}

# 實(shí)體類不混淆(自己項(xiàng)目實(shí)體類不被混淆,因?yàn)镚son中用到了反射)
#-keep class me.febsky.entity.** { *; }
### -----這是個(gè)列子---- ###
#這個(gè)類里面的所有的成員變量和方法都不混淆
-keep class me.febsky.testprogard.MainActivity { *; }
#這個(gè)類里面的內(nèi)部類的所有的成員變量和方法都不混淆
-keep class me.febsky.testprogard.MainActivity$* { *; }
#這個(gè)類里面的所有public的內(nèi)部類的所有的成員變量和方法都不混淆
-keep public class me.febsky.testprogard.MainActivity$* { *; }
#這個(gè)類里面的內(nèi)部類的類名不備混淆,方法和變量還是混淆的
-keep class me.febsky.testprogard.MainActivity$*
#保持一個(gè)類的類名不被混淆,里面的方法和成員變量名還是被混淆的
-keep public class me.febsky.testprogard.MyOutClass
### -----這是個(gè)列子---- ###

## for sharedSDK
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class m.framework.**{*;}


#butter knife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

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

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

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