Android Studio 如何混淆打包

app/build.gradle配置

在build.grandle添加,其中規則寫在proguard-rules.pro中,也可以自定義一個文件,將其代替,比如eclipse常用的 proguard-project.txt

    buildTypes {
        release {
            //表示是否混淆
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'prguard-rules.pro'
        }
    }

proguard-android.txt

默認的混淆文件,路徑爲:/Users/liuende/Library/Android/sdk/tools/proguard/proguard-android.txt

proguard-rules.pro

模板中的實體類根據項目修改

#指定代碼的壓縮級別
-optimizationpasses 5
#包明不混合大小寫
-dontusemixedcaseclassnames
#不去忽略非公共的庫類
-dontskipnonpubliclibraryclasses
 #優化  不優化輸入的類文件
-dontoptimize
 #預校驗
-dontpreverify
 # 混淆時所採用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#保護註解
-keepattributes *Annotation*

#混淆第三方jar,Android Studio中不需要默認會添加
#-libraryjars libs/achartengine-1.0.0.jar

#不顯示警告
#-ignorewarnings

#不混淆API中的類
-keep public class * extends android.app.Fragment
-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.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
#
#如果有引用v4包可以添加下面這行
-keep public class * extends android.support.v4.**
#-keep public class * extends android.support.v4.app.Fragment
#如果有引用v7包
#-keep public class * extends android.support.** { *; }

#####################記錄生成的日誌數據,gradle build時在本項目根目錄輸出################
 #混淆時是否記錄日誌
-verbose
#apk 包內所有 class 的內部結構
-dump class_files.txt
#未混淆的類和成員 文件過大不輸出
#-printseeds seeds.txt
#列出從 apk 中刪除的代碼
-printusage unused.txt
#混淆前後的映射
-printmapping mapping.txt

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


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

#保持自定義控件類不被混淆
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

#保持序列化的類不混淆
#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}


#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable

#保持 Serializable 不被混淆並且enum 類也不被混淆
-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();
}

#保持枚舉 enum 類不被混淆
#如果混淆報錯,建議直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可
-keepclassmembers enum * {
  public static **[] values();
  public static ** valueOf(java.lang.String);
}

#不混淆資源類
-keepclassmembers class **.R$* {
    public static <fields>;
}
 -keep class **.R$* { *; }
#避免混淆泛型 如果混淆報錯建議關掉
-keepattributes Signature

#保持實體類不混淆
-keep class  com.pay.alipay.entity.**{*;}

#Gson混淆
##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
##---------------End: proguard configuration for Gson  ----------


#其他需要混淆的包
-dontwarn demo.**
-keep class demo.** { *;}

#時間過長
#-dontwarn org.apache.**
#-keep class org.apache.** { *;}

-dontwarn org.apache.commons.logging.impl.**
-keep class org.apache.commons.logging.impl.** { *;}

-dontwarn org.apache.log4j.**
-keep class org.apache.log4j.** { *;}


-dontwarn org.dom4j.**
-keep class org.dom4j.** { *;}

-dontwarn ytx.org.apache.http.impl.auth.**
-keep class ytx.org.apache.http.impl.auth.** { *;}

#XmlPullParser報錯,原因這兩個類和Android自帶的類衝突

-dontwarn org.kobjects.**
-dontwarn org.ksoap2.**
-dontwarn org.kxml2.**
-dontwarn org.xmlpull.v1.**

-keep class org.kobjects.** { *; }
-keep class org.ksoap2.** { *; }
-keep class org.kxml2.** { *; }
-keep class org.xmlpull.** { *; }

混淆後打包報錯

打包後報錯爲正常情況,需要手動對項目中jar文件中的實體類包不做混淆處理,格式如下

-dontwarn org.dom4j.**
-keep class org.dom4j.** { *;}
發佈了59 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章