混淆是什么
混淆并不是使代码无法进行反编译,只是将代码中的类、方法等重命名,把它们改成a.b.c.d等毫无意义的名词,就算得到源码也不知道方法有任何意思,但是对于计算机而言,它只会按照原先的执行顺序执行代码,而且Android的混淆过程中,会自动识别程序中的引用,去除代码中未被引用的方法以及未使用到的资源,换句话说,它也可以减少我们apk的大小。
怎样混淆
现在大部分的开发都使用的Android studio,在这里只讲解Android Studio的混淆的方法。使项目支持混淆只需要android->buildType->release的minifyEnabled设置为true即可(自动生成的是false),如以下:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
这样的话就使这个项目支持混淆了,但是混淆只会在Generate Signed apk的时候进行混淆,直接build apk是不会进行混淆的,并且在生成apk时选择V1(Jar Signature),本人测试选择V2的时候,安装会提示安装包已损坏。
混淆配置
以上介绍了如何使项目支持混淆,但是在实际的项目开发中有些代码是不需要混淆,在这里就需要对这些代码进行配置了,常见的有第三方jar包、第三方库、与JS的交互类等。
下面举几个简单的例子,首先是对第三方jar的混淆,在现在的版本系统默认是会把jar给进行libraryjars的,如果一直提示错误,最好是进行libraryjars。下面看具体的代码。这里以fastjson举例,在fastjson进行数据解析时,是需要与数据对上字段名的,所以实际的项目中你的model不要混淆或者说使用注解让字段与数据绑定。
#fastjson的混淆
-libraryjars /libs/fastjson-1.2.7.jar #如果提示重复应用的话,删除这句话即可
-dontwarn com.alibaba.fastjson.** #不检查com.alibaba.fastjson的类
-keep class com.alibaba.fastjson.** { *; } #对com.alibaba.fastjson下的类不进行混淆
#okhttp
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}
#okio
-dontwarn okio.**
-keep class okio.**{*;}
#litepal
-keep class org.litepal.** {
*;
}
-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 *;
}
-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
#高德jar混淆
-dontwarn com.amap.api.**
-dontwarn com.amap.apis.**
-dontwarn com.a.a.**
-dontwarn com.autonavi.**
-keep class com.amap.api.** {*;}
-keep class com.amap.apis.** {*;}
-keep class com.autonavi.** {*;}
-keep class com.a.a.** {*;}
#下方是与JS进行交互的类,交互的model以及交互实体都需要不混淆
-keepclassmembers class fqcn.of.javascript.listener.for.webview {
public *;
}
-keepclassmembers class com.wshuttle.trailerplatform.controller.activity.order.OrderAct$OrderJsHelper {
public *;
}
-keepclassmembers class com.wshuttle.trailerplatform.controller.activity.dispatch.RescueDispatchAct$RescueDispatchJsHelper {
public *;
}
-keepclassmembers class com.wshuttle.trailerplatform.model.bean.BaseJsHelperInfo {
public *;
}
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
-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, jav.lang.String);
}