1. 程式人生 > >android學習之程式碼混淆小結

android學習之程式碼混淆小結

之前一直沒有對程式碼混淆有一個很明確的認識,今天重新對程式碼混淆做了一番瞭解,並記錄一下在Androidstudio上是如何做程式碼混淆的。

第一步:

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

將Module下的build.gradle檔案中將minifyEnabled false改為minifyEnabled true,則預設進行程式碼混淆。打包的時候選擇release,否則只打包不會混淆。

第二步:

  • 混淆規則: 
    proguard預設會對第三方庫進行混淆,而有的第三方庫本身是做過混淆或者使用了java反射技術,例如騰訊直播的SDK就採用了反射技術。這時候就要排除對這些第三方庫的混淆。

1.如果使用了Gson之類的工具要使JavaBean類即實體類不被混淆。 
2.如果使用了自定義控制元件那麼要保證它們不參與混淆。 
3.如果使用了列舉要保證列舉不被混淆。 
4.對第三方庫中的類不進行混淆

語法很多,我自己也記不全,不過一般的第三方庫會給出混淆程式碼來方便我們整合,所以記不住也不需要太過擔心

android中在android Manifest檔案中的activity,service,provider, receviter,等都不能進行混淆。一些在xml中配置的自定義的view也不能進行混淆,android提供的預設配置中都有。

-optimizationpasses 5
#混淆時不會產生形形色色的類名
-dontusemixedcaseclassnames
#指定不去忽略非公共的類庫
-dontskipnonpubliclibraryclasses
#不進行預校驗
-dontpreverify
-verbose
#優化操作
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*


#-------------------------------------通用混淆配置 start ---------------------------------------

# 對於繼承Android的四大元件等系統類,保持原樣
-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 -keep class android.support.**{*;} -keep class android.support.v4.** { *; } -keep interface android.support.v4.app.** { *; } -keep public class * extends android.support.v4.** -dontwarn android.support.v4.** -dontwarn com.android.support.** -dontwarn android.support.** # 保對所有類的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); } # 保護繼承至View物件中的set/get方法 -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } # 對列舉型別enum的所有類的以下指定方法的方法名不進行混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 對實現了Parcelable介面的所有類的類名不進行混淆,對其成員變數為Parcelable$Creator型別的成員變數的變數名不進行混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class fqcn.of.javascript.interface.for.webview { public *; } -keep class **.R$* { *; } #----------------------------------------通用混淆配置 end ------------------------------------
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

以上只是最基本的混淆,具體專案中的第三方庫具體新增!

貼出示例:

#保持gson不被混淆

-keep class com.google.gson.** {*;}  
#-keep class com.google.**{*;}  
-keep class sun.misc.Unsafe { *; }  
-keep class com.google.gson.stream.** { *; }  
-keep class com.google.gson.examples.android.model.** { *; }   
-keep class com.google.** {  
    <fields>;  
    <methods>;  
}  

# Butterknife混淆處理
-keep class butterknife.** { *; }
-keep class **$$ViewInjector { *; }
-dontwarn butterknife.internal.**

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

#EventBus不被混淆

-keepclassmembers class ** {
    public void onEvent*(**);
}

# Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

#Glide不被混淆

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

# # -------------------------------------------
# # ############### volley混淆 ############### 
# # -------------------------------------------
-keep class com.android.volley.** {*;}
-keep class com.android.volley.toolbox.** {*;}
-keep class com.android.volley.Response$* { *; }
-keep class com.android.volley.Request$* { *; }
-keep class com.android.volley.RequestQueue$* { *; }
-keep class com.android.volley.toolbox.HurlStack$* { *; }
-keep class com.android.volley.toolbox.ImageLoader$* { *; }
# # -------------------------------------------
# # ############### android-support-v4混淆 ############### 
# # -------------------------------------------
-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

#如果引用了v4或者v7包,可以忽略警告,因為用不到android.support  
-dontwarn android.support.**  

# # -------------------------------------------
# # ############### androidannotations混淆 ############### 
# # -------------------------------------------

-dontwarn org.springframework.**

# universal-image-loader 混淆

-dontwarn com.nostra13.universalimageloader.**
-keep class com.nostra13.universalimageloader.** { *; }

###-----------MPAndroidChart相簿相關的混淆配置------------  
-keep class com.github.mikephil.charting.** { *; }  

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

#支付寶保持不被混淆
-dontwarn com.alipay.android.app.** 
-keep public class com.alipay.** {*;}

# ========== fastjson ============
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** {*;}
# ================================

####################zxing#####################  
-keep class com.google.zxing.** {*;}  
-dontwarn com.google.zxing.**  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102

上面總結了這麼多,當然還有很多其他的第三方庫,無法一一列出總結,都可以參考具體文件來進行混淆。













-dontskipnonpubliclibraryclasses #不去忽略非公共的庫類
-dontoptimize  #優化  不優化輸入的類檔案
-dontpreverify #預校驗
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  # 混淆時所採用的演算法
-keepattributes *Annotation* #保護註解
-ignorewarning #忽略警告


-optimizationpasses 5          # 指定程式碼的壓縮級別
-dontusemixedcaseclassnames #混淆時不會產生形形色色的類名
-dontpreverify           # 混淆時是否做預校驗
-verbose                # 混淆時是否記錄日誌
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}


-dontskipnonpubliclibraryclasses


-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*


-keepattributes *Annotation*
-keepattributes Signature


-libraryjars libs/apns_1.0.6.jar
-libraryjars libs/armeabi/libBaiduMapSDK_v2_3_1.so
-libraryjars libs/armeabi/liblocSDK4.so
-libraryjars libs/baidumapapi_v2_3_1.jar
-libraryjars libs/core.jar
-libraryjars libs/gesture-imageview.jar
-libraryjars libs/gson-2.0.jar
-libraryjars libs/infogracesound.jar
-libraryjars libs/locSDK_4.0.jar
-libraryjars libs/ormlite-android-4.48.jar
-libraryjars libs/ormlite-core-4.48.jar
-libraryjars libs/universal-image-loader-1.9.0.jar


-keep class com.baidu.** { *; }
-keep class vi.com.gdi.bgl.android.**{*;}


-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 * extends android.support.v4.**
-keep public class com.android.vending.licensing.ILicensingService


-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.uuhelper.Application.** { *; }
-keep class net.sourceforge.zbar.** { *; }
-keep class com.google.android.gms.** { *; }


-keep class com.bank.pingan.model.** { *; }


-keep public class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper
-keep public class * extends com.j256.ormlite.android.apptools.OpenHelperManager


-keep class com.android.vending.licensing.ILicensingService
-keep class android.support.v4.** { *; }
-keep class org.apache.commons.net.** { *; }
-keep class com.tencent.** { *; }


-keep class com.umeng.** { *; }
-keep class com.umeng.analytics.** { *; }
-keep class com.umeng.common.** { *; }
-keep class com.umeng.newxp.** { *; }


-keep class com.j256.ormlite.** { *; }
-keep class com.j256.ormlite.android.** { *; }
-keep class com.j256.ormlite.field.** { *; }
-keep class com.j256.ormlite.stmt.** { *; }


-dontwarn android.support.v4.**
-dontwarn org.apache.commons.net.**
-dontwarn com.tencent.**


-keepclasseswithmembernames class * {
    native <methods>;
}


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


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


-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}


-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}


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


-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**


-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable


-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**


-keep public class com.umeng.socialize.* {*;}
-keep public class javax.**
-keep public class android.webkit.**


-keep class com.facebook.**
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**


-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}


-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}


-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}


-keep public class [your_pkg].R$*{
    public static final int *;
}


-libraryjars ../KlowerBase/libs/mail-activation.jar
-libraryjars ../KlowerBase/libs/mail-additionnal.jar
-libraryjars ../KlowerBase/libs/mail.jar
-keep class javax.mail.**{*;}
 -keep class com.sun.mail.**{*;}
-keep class javax.activation.**{*;}
-keep class org.apache.harmony.**{*;}
-keep class java.security.**{*;}


#解決:can't find referenced class java.beans.Beans
-dontwarn org.apache.commons.collections.BeanMap
-dontwarn java.beans.**
#解決:can't find referenced class javax.security.sasl.Sasl
-dontwarn com.sun.mail.imap.protocol.**










-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  # 混淆時所採用的演算法


#-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    # 保持哪些類不被混淆
-keep class com.tencent.android.tpush.**  {* ;}
-keep class com.tencent.mid.**  {* ;}
-keepclasseswithmembernames class * {  # 保持 native 方法不被混淆
    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);
}
-keepclassmembers enum * {     # 保持列舉 enum 類不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
    public static final android.os.Parcelable$Creator *;
}


# 保持哪些類不被混淆
-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.**


#--以上都是API裡邊的類,最好都要避免混淆
#有些很特殊的,例如百度地圖,你需要新增以下申明:
-keep class com.baidu.** { *; }
-keep class vi.com.gdi.bgl.android.**{*;}


#根據我的經驗,一般model最好避免混淆(model無關緊要,不混淆也沒多大關係)如:
 -keep class com.bank.pingan.model.** { *; }










#下面在貼上關於Umeng分享統計的避免混淆的申明
-dontwarn android.support.v4.**
-dontwarn org.apache.commons.NET.**
-dontwarn com.tencent.**
-keepclasseswithmembernames class * {
    native <methods>;
}
-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(Java.lang.String);
}
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context);
}
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**
-keep public class com.umeng.socialize.* {*;}
-keep public class javax.**
-keep public class android.webkit.**
-keep class com.facebook.**
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}
-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
-keep public class [your_pkg].R$*{
    public static final int *;
}
#####################記錄生成的日誌資料,gradle build時在本專案根目錄輸出################


#apk 包內所有 class 的內部結構
-dump class_files.txt
#未混淆的類和成員
-printseeds seeds.txt
#列出從 apk 中刪除的程式碼
-printusage unused.txt
#混淆前後的對映
-printmapping mapping.txt


#####################記錄生成的日誌資料,gradle build時 在本專案根目錄輸出-end################




################混淆保護自己專案的部分程式碼以及引用的第三方jar包library#########################
-libraryjars libs/asmack-android-6.jar
-libraryjars libs/nineoldandroids-2.4.0.jar
#-libraryjars libs/alipaysdk.jar
#-libraryjars libs/umeng-analytics-v5.2.4.jar
#-libraryjars libs/alipaysdk.jar
#-libraryjars libs/alipaysecsdk.jar
#-libraryjars libs/alipayutdid.jar
#-libraryjars libs/wup-1.0.0-SNAPSHOT.jar
#-libraryjars libs/weibosdkcore.jar




#三星應用市場需要新增:sdk-v1.0.0.jar,look-v1.0.1.jar
#-libraryjars libs/sdk-v1.0.0.jar
#-libraryjars libs/look-v1.0.1.jar


#我是以libaray的形式引用了一個圖片載入框架,如果不想混淆 keep 掉
-keep class com.nostra13.universalimageloader.** { *; }


#友盟
-keep class com.umeng.**{*;}


#支付寶
-keep class com.alipay.android.app.IAliPay{*;}
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.lib.ResourceMap{*;}




#信鴿推送
-keep class com.tencent.android.tpush.**  {* ;}
-keep class com.tencent.mid.**  {* ;}




#自己專案特殊處理程式碼


#忽略警告
-dontwarn com.veidy.mobile.common.**
#保留一個完整的包
-keep class com.veidy.mobile.common.** {
    *;
 }


-keep class  com.veidy.activity.login.WebLoginActivity{*;}
-keep class  com.veidy.activity.UserInfoFragment{*;}
-keep class  com.veidy.activity.HomeFragmentActivity{*;}
-keep class  com.veidy.activity.CityActivity{*;}
-keep class  com.veidy.activity.ClinikActivity{*;}


#如果引用了v4或者v7包
-dontwarn android.support.**


############混淆保護自己專案的部分程式碼以及引用的第三方jar包library-end##################


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


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


#保持 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 * {
    public void *ButtonClicked(android.view.View);
}


#不混淆資源類
-keepclassmembers class **.R$* {
    public static <fields>;
}


#避免混淆泛型 如果混淆報錯建議關掉
#–keepattributes Signature


#移除log 測試了下沒有用還是建議自己定義一個開關控制是否輸出日誌
#-assumenosideeffects class android.util.Log {
#    public static boolean isLoggable(java.lang.String, int);
#    public static int v(...);
#    public static int i(...);
#    public static int w(...);
#    public static int d(...);
#    public static int e(...);
#}


#保持gson不被混淆


-keep class com.google.gson.** {*;}  
#-keep class com.google.**{*;}  
-keep class sun.misc.Unsafe { *; }  
-keep class com.google.gson.stream.** { *; }  
-keep class com.google.gson.examples.android.model.** { *; }   
-keep class com.google.** {  
    <fields>;  
    <methods>;  
}  


# Butterknife混淆處理
-keep class butterknife.** { *; }
-keep class **$$ViewInjector { *; }
-dontwarn butterknife.internal.**


-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}


#EventBus不被混淆


-keepclassmembers class ** {
    public void onEvent*(**);
}


# Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}


#Glide不被混淆


-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}


# # -------------------------------------------
# # ############### volley混淆 ############### 
# # -------------------------------------------
-keep class com.android.volley.** {*;}
-keep class com.android.volley.toolbox.** {*;}
-keep class com.android.volley.Response$* { *; }
-keep class com.android.volley.Request$* { *; }
-keep class com.android.volley.RequestQueue$* { *; }
-keep class com.android.volley.toolbox.HurlStack$* { *; }
-keep class com.android.volley.toolbox.ImageLoader$* { *; }
# # -------------------------------------------
# # ############### android-support-v4混淆 ############### 
# # -------------------------------------------
-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


#如果引用了v4或者v7包,可以忽略警告,因為用不到android.support  
-dontwarn android.support.**  


# # -------------------------------------------
# # ############### androidannotations混淆 ############### 
# # -------------------------------------------


-dontwarn org.springframework.**


# universal-image-loader 混淆


-dontwarn com.nostra13.universalimageloader.**
-keep class com.nostra13.universalimageloader.** { *; }


###-----------MPAndroidChart相簿相關的混淆配置------------  
-keep class com.github.mikephil.charting.** { *; }  


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


#支付寶保持不被混淆
-dontwarn com.alipay.android.app.** 
-keep public class com.alipay.** {*;}


# ========== fastjson ============
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** {*;}
# ================================


####################zxing#####################  
-keep class com.google.zxing.** {*;}  
-dontwarn com.google.zxing.**  
#gson
#-libraryjars libs/gson-2.2.2.jar
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }


# webview + js
-keepattributes *JavascriptInterface*
# keep 使用 webview 的類
-keepclassmembers class  com.veidy.activity.WebViewActivity {
   public *;
}
# keep 使用 webview 的類的所有的內部類
-keepclassmembers  class  com.veidy.activity.WebViewActivity$*{
    *;
}

相關推薦

android學習程式碼混淆小結

之前一直沒有對程式碼混淆有一個很明確的認識,今天重新對程式碼混淆做了一番瞭解,並記錄一下在Androidstudio上是如何做程式碼混淆的。 第一步: buildTypes { release { minifyEnabled true prog

Android開發程式碼混淆

應用混淆(ProGuard) ProGuard是一個免費的JAVA類檔案壓縮,優化,混淆器。 它探測並刪除沒有使用的類,欄位,方法和屬性,它刪除沒有用的說明並使用位元組碼得到最大優化,它使用無意義的名字重新命名類,欄位和方法。 我們先來介紹下ProGuard 我們為啥要使用ProGu

Android 學習《第一行程式碼》第二版 筆記(十)探究碎片(二)

一個簡易版的新聞應用 同時相容手機和平板的應用程式 一、佈局 news_content_frag.xml額我的程式碼裡面是news_content_fragment.xml,圖片打錯了 二、程式碼編寫 1. 實體類(News.java) //新聞實體類 pub

Android 學習《第一行程式碼》第二版 筆記(九)探究碎片(一)

一、碎片 1. 碎片是什麼: 碎片(Fragment)是一種可以嵌入在活動當中的UI片段,能讓程式更加合理和充分地利用大螢幕的空間。(可以理解成迷你型活動) 2. 簡單用法: 在一個活動當中新增兩個碎片,並讓這兩個碎片平分活動空間。 1.)效果圖(沒錢買平板,CPU不支援

Android 學習Android程式設計權威指南》第二版 程式碼+筆記整理(四)

(程式碼)GeoQuiz最終開發 GeoQuiz應用初步開發 GeoQuiz應用升級開發 解決GeoQuiz應用旋轉恢復第一題的BUG 不展示編譯器自動完成的程式碼,僅提供手動修改或者編寫的程式碼。 省略了先前一些程式碼,可參照上方連結。 升級內容: 增加作弊按鈕,給使用者提

Android 學習《第一行程式碼》第二版 筆記(十一)詳解廣播機制(一)

一、廣播機制簡介 1. 四大元件之一 2. Android 提供了一套完整的API,允許應用程式自由地傳送和接收廣播。 A. 傳送廣播藉助Intent B. 接收廣播藉助廣播接收器(Broadcast Receiver) 3. 廣播型別: A. 標準廣播: 完全非同步執行

Android 學習《第一行程式碼》第二版 筆記(十二)詳解廣播機制(二)

廣播的最佳實踐——實現強制下線功能 思路:在介面上彈出一個對話方塊,讓使用者無法進行任何操作,必須點選對話方塊中的確定按鈕,然後回到登入介面即可。 一、效果圖 1. 登入介面並輸入賬號密碼 2. 登陸後的介面 3. 強制下線 4. 退回登陸的介面

Android 學習Android程式設計權威指南》第二版 程式碼+筆記整理(三)

(程式碼)解決GeoQuiz應用旋轉恢復第一題的BUG 一、產生BUG的原因 1. 裝置旋轉時,系統會銷燬當前的QuizActivity例項,然後建立一個新的例項,這時陣列索引(mCurrentIndex)會初始化為0,因此使用者看到的還是第一道題目。 2.

安全程式設計Android APK打包程式碼混淆

第一步:在專案工程目錄下的proguard-rules.pro檔案中配置自定義的混淆規則 #注意: #1.引用外部的jar包 如果不是自己寫的最好不混淆它們,因為外部jar包有可能已經混淆過 #2.不要混淆XML佈局中使用的自定義控制元件類,混淆後加載佈局會報找不到該控制

Android 學習《第一行程式碼》第二版 筆記(十五)執行時許可權

一、執行時許可權功能 使用者不需要在安裝軟體的時候一次性授權所有申請的許可權,而是可以在軟體的使用過程中再對某一項許可權申請進行授權。 分類:普通許可權和危險許可權 我們在進行執行時許可權處理時使用的是許可權名,但是使用者一旦同意授權了,那麼該許可權所對應的

Android學習騰訊互動直播開發經驗小結

最近外派到XXX公司做一個帶直播功能的pad專案,整合的是騰訊的互動直播,今天寫了一下經驗小結,方便以後使用。 互動直播整合流程: 1:需要到騰訊雲直播平臺下載SDK,注意點,現在騰訊SDK的下載需要經過實名制認證的賬戶才具有下載資格許可權,只有通過騰訊資格

Android學習 移動應用微信支付整合小結

       微信支付現在主要整合在:1、移動應用開發  2、網站應用開發  3、公眾賬號開發        本篇主要針對移動應用App整合微信支付,實際專案坑點分享! 一、既予之、與共之:平臺資源 3、微信支付指引和資源中心:微信支付接入指南和資源下載中心<強

Android 學習逐幀動畫(Frame)

http sta ram override start pub fill creat 代碼 幀動畫就是將一些列圖片。依次播放。利用肉眼的“視覺暫留”的原理,給用戶的感覺是動畫的錯覺,逐幀動畫的原理和早期的電影原理是一樣的。 a:須要定義逐幀動畫,能夠通過代碼定義。也能夠

Android學習——優化篇(1)

androi static 實用 mod 簡單 keys 階段 數據 秒級 一、優化的品質 1.簡練。2.可讀性強。3.模塊化;4.層次性;5.設計良好。6.高效。7.優雅;8.清晰。 二、常見的編程規範 1. 基本要求 · 結構清晰,簡

Android 學習旅--Android 體系結構

2015年 1.5 學習 gin 3年 哈哈 蛋糕 名稱 kit 一、Android 背景 背景就不說了,百度介紹很多,主要還是記一下每個Android版本對應的甜品名稱,我覺得這個挺好玩的,哈哈 1.5 Cupcake(紙杯蛋糕):2009年4月30日發布。 1.

Android學習旅--Android Studio

tro options png 進行 下載 setting 內存 com style 一、開發工具了解 Android Studio 是一個Android集成開發工具,基於IntelliJ IDEA. 類似 Eclipse ADT,提供了集成的 Android 開

Android的DatePicker和TimePicker-android學習旅(三十八)

cursor ini lis drawable textview @+ type pin view DatePicker和TimePicker簡單介紹 DatePicker和TimePicker是從FrameLayout繼承而來。他們都是比較簡單的組件

android學習路資料集合

notice 應用程序 好程序員 box bar 賬戶 from 匯總 ats 版權聲明:本文為 stormzhang 原創文章,可以隨意轉載,但必須在明確位置註明出處!!! 這篇博客背後的故事 一路走來很不容易,剛好知乎上被人邀請回答如何自學android編程, 就借

Android學習GridView圖片布局適配經驗

statistic style code pop proc lease link csdn ram 開始解說這篇博客之前,我想問一下,當布局相似GridView這樣的

Android學習AutoCompleteTextView和MultiAutoCompleteTextView

instance java private nis imp vertica @override array .com 轉自:http://blog.csdn.net/qq_28468727/article/details/52258409 AutoCompleteTex