android学习之代码混淆小结

之前一直没有对代码混淆有一个很明确的认识,今天重新对代码混淆做了一番了解,并记录一下在android studio上是如何做代码混淆的。

第一步:

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

将Module下的build.gradle文件中将minifyEnabled false改为minifyEnabled true,则默认进行代码混淆。打包的时候选择release,否则只打包不会混淆。

第二步:

  • 混淆规则:
    proguard默认会对第三方库进行混淆,而有的第三方库本身是做过混淆或者使用了java反射技术,例如腾讯直播的SDK就采用了反射技术。这时候就要排除对这些第三方库的混淆。

摘自《Android代码混淆技巧》总结的混淆规则,觉得很全面。

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 ;
}
# 对所有类的初始化方法的方法名不进行混淆
-keepclasseswithmembers class *{
    public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class *{
    public (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 ------------------------------------

以上只是最基本的混淆,具体项目中的第三方库具体添加!

贴出示例:

#保持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.** {  
    ;  
    ;  
}  

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

-keepclasseswithmembernames class * {
    @butterknife.* ;
}
-keepclasseswithmembernames class * {
    @butterknife.* ;
}

#EventBus不被混淆

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

# Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
    (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.**  

上面总结了这么多,当然还有很多其他的第三方库,无法一一列出总结,都可以参考具体文档来进行混淆。

你可能感兴趣的:(Android,学习进阶)