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