之前一直没有对代码混淆有一个很明确的认识,今天重新对代码混淆做了一番了解,并记录一下在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 <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 ------------------------------------
以上只是最基本的混淆,具体项目中的第三方库具体添加!
贴出示例:
#保持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.**
上面总结了这么多,当然还有很多其他的第三方库,无法一一列出总结,都可以参考具体文档来进行混淆。