常用的混淆設(shè)置
#AgmentWeb——start
-keep class com.just.agentweb.** {
? ? *;
}
-dontwarn com.just.agentweb.**
-keepclassmembers class com.just.agentweb.sample.common.AndroidInterface{ *; }?
#AgmentWeb——end
# glide 的混淆代碼_start
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
? **[] $VALUES;
? public *;
}
# glide 的混淆代碼_end
# banner 的混淆代碼_start
-keep class com.youth.banner.** {
? ? *;
}
# banner 的混淆代碼_end
#Rxjava+Retrofit+Okhttp
-dontwarn javax.annotation.**
-dontwarn javax.inject.**
# OkHttp3
-dontwarn okhttp3.logging.**
-keep class okhttp3.internal.**{*;}
-dontwarn okio.**
# Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
#-keepattributes Signature-keepattributes Exceptions
# 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;
}
# Gson
-keep class com.google.gson.stream.** { *; }
-keepattributes EnclosingMethod
#保留實體類不被混淆
-keep class com.example.lenovo.daochulvxing.bean.**{*;}#class后面的路徑為自己自己的bean的包名
#design 一般都會用到
-keep class com.android.**{*;}
#butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector{ *; }
-keepclasseswithmembernames class * {
? ? @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
? ? @butterknife.* <methods>;
}
#glide-transformations
-keep class jp.wasabeef.glide.transformations.**
############ --------以下通用--------###########
? #指定代碼的壓縮級別
? -optimizationpasses 5
? #包明不混合大小寫
? -dontusemixedcaseclassnames
? #不去忽略非公共的庫類
? -dontskipnonpubliclibraryclasses
? #優(yōu)化? 不優(yōu)化輸入的類文件
? -dontoptimize
? #預(yù)校驗
? -dontpreverify
? #混淆時是否記錄日志
? -verbose
? # 混淆時所采用的算法
? -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
? #保護(hù)注解
-keepattributes *Annotation*
? # 保持哪些類不被混淆
? -keep public class * extends android.app.Fragment
? -keep public class * extends android.app.Activity
? -keep public class * extends android.support.v7.app.AppCompatActivity
? -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.app.Fragment
? ## 自定義控件
? -keep class com.everywhere.trip.widget.**{*;}
? #忽略警告
? -ignorewarning
? ##記錄生成的日志數(shù)據(jù),gradle build時在本項目根目錄輸出##
? #apk 包內(nèi)所有 class 的內(nèi)部結(jié)構(gòu)
? #-dump proguard/class_files.txt
? #未混淆的類和成員
? -printseeds proguard/seeds.txt
? #列出從 apk 中刪除的代碼
? -printusage proguard/unused.txt
? #混淆前后的映射
? -printmapping proguard/mapping.txt
? ########記錄生成的日志數(shù)據(jù)帅刊,gradle build時 在本項目根目錄輸出-end######
? #如果引用了v4或者v7包
? -dontwarn android.support.**
? ####混淆保護(hù)自己項目的部分代碼以及引用的第三方j(luò)ar包library-end####
? #保持 native 方法不被混淆
? -keepclasseswithmembernames class * {
? ? ? native <methods>;
? }
? #保持自定義控件類不被混淆
? -keepclasseswithmembers class * {
? ? ? public <init>(android.content.Context, android.util.AttributeSet);
? }
? #保持自定義控件類不被混淆
? -keepclassmembers class * extends android.app.Activity {
? ? public void *(android.view.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*(...);
? }
? #保持 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 enum * {
? ? public static **[] values();
? ? public static ** valueOf(java.lang.String);
? }
? -keepclassmembers class * {
? ? ? public void *ButtonClicked(android.view.View);
? }
? #不混淆資源類
? -keepclassmembers class **.R$* {
? ? ? public static <fields>;
? }
? #避免混淆泛型 如果混淆報錯建議關(guān)掉
? #-keepattributes Signature
? #移除Log類打印各個等級日志的代碼肚邢,打正式包的時候可以做為禁log使用打洼,這里可以作為禁止log打印的功能使用,另外的一種實現(xiàn)方案是通過BuildConfig.DEBUG的變量來控制
? #-assumenosideeffects class android.util.Log {
? #? ? public static *** v(...);
? #? ? public static *** i(...);
? #? ? public static *** d(...);
? #? ? public static *** w(...);
? #? ? public static *** e(...);
? #}
? #############################################################################################
? ########################? ? ? ? ? ? ? ? 以上通用? ? ? ? ? ##################################
? #############################################################################################
# 對WebView的處理
? -keepclassmembers class * extends android.webkit.webViewClient {
? ? ? public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
? ? ? public boolean *(android.webkit.WebView, java.lang.String);
? }
? -keepclassmembers class * extends android.webkit.webViewClient {
? ? ? public void *(android.webkit.webView, java.lang.String);
? }
? #自定義View
? -keep public class com.everywhere.trip.widget.** {*;}
? #V4下的撰筷,例如Fragment
? # 針對android-support-v4.jar的解決方案android.support.v4.app.Fragment
? -dontwarn android.support.v4.**
? -keep class android.support.v4.**? { *; }
? -keep interface android.support.v4.app.** { *; }
? -keep public class * extends android.support.v4.**
? -keep public class * extends android.app.Fragment
以上為基本混淆代碼 底下為配置
1.build.gradle(model:app)下配置
android--> buildTypes-->release-->下將 minifyEnabled 改為true(默認(rèn)是false)并且添加以下代碼
android.applicationVariants.all { variant ->
? ? ? ? ? ? ? ? variant.outputs.all {
? ? ? ? ? ? ? ? ? ? outputFileName = "EveryWhereTrip_${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }//這段代碼的作用就是可以給自己的apk包改名字
完成后復(fù)制一份release? 并且將release改名為debug
2.在signingConfigs底下添加
signingConfigs {
? ? ? ? debug {
? ? ? ? ? ? storeFile file('app.jks')
? ? ? ? ? ? storePassword "123456"
? ? ? ? ? ? keyAlias "app"
? ? ? ? ? ? keyPassword "123456"
? ? ? ? }
? ? ? ? release {
? ? ? ? ? ? storeFile file('app.jks')
? ? ? ? ? ? storePassword "123456"
? ? ? ? ? ? keyAlias "app"
? ? ? ? ? ? keyPassword "123456"
? ? ? ? }
? ? }
//多渠道打包配置
? ? productFlavors {
? ? ? ? //渠道的渠道號
? ? ? ? xiaomi {}
? ? ? ? qh360 {}
? ? ? ? baidu {}
? ? ? ? wandoujia {}
? ? ? ? huawei {}
? ? }
? ? productFlavors.all {
? ? ? ? flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
? ? }
//多維度打包或者叫版本差異化打包,這里用不到,名字自己定義就好
? ? flavorDimensions "every"
}
// 獲取當(dāng)前系統(tǒng)時間
def releaseTime() {
? ? return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
在清單文件的Application里面配置
? <meta-data
? ? ? ? ? ? android:name="channel"? //此處的channel在加固時AndroidName會用到
? ? ? ? ? ? android:value="${CHANNEL_VALUE}" />