1、四大组件默认不进行混淆也不能进行混淆,因为发包时清单文件中内容不会改动,混淆后便找不到对应的组件
2、每个module的 proguard-rules.pro作用于该module,引用不继承混淆规则
3、
混淆规则每个module都有两个,一个是sdk默认提供的,一个是自己书写的,sdk的位于sdk目录下的\tools\proguard中的proguard-android.txt
4、sdk提供的混淆规则有:
#不使用混合大小写的类名
-dontusemixedcaseclassnames
#不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
#混淆时是否记录日志
-verbose
#默认关闭优化。 Dex不喜欢通过ProGuard运行的代码优化和预验证步骤(并自行执行其中一些优化)。
-dontoptimize
#不预校验
-dontpreverify
#假如项目中有用到注解,应加入这行配置
-keepattributes *Annotation*
#特定的类
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
#native方法不混淆
-keepclasseswithmembernames class * {
native <methods>;
}
#在view中保留get和set方法以便动画可以正常运行
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
#以便正常反射在xml中设置的onClickWe
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
#保持枚举 enum 不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#保持 Parcelable 不被混淆(aidl文件不能去混淆)
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
#保持R文件中的静态变量不被混淆,否则,你的反射是获取不到资源id的
-keepclassmembers class **.R$* {
public static <fields>;
}
#不需要提醒这个肯定安全(文档就是这么说的)
-dontwarn android.support.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
5、引入的第三方jar包中的代码不是我们的目标和关心的对象,所以可以忽略不用进行混淆,例如:
便可以
#声明lib文件
-libraryjars libs/libammsdk.jar
#不提示警告
-dontwarn com.tencent.mm.opensdk.**
#不进行混淆
-keep com.tencent.mm.opensdk.** { *;}
6、用于json转换的实体类的变量名称不能进行混淆,例如:
#转换JSON的JavaBean,类成员名称保护,使其不被混淆
-keepclassmembernames class org.zero.commontemplate.common.model.** { *; }
7、此外还有一些通用的(后续遇到会更新):
#通用
-keepnames class * implements java.io.Serializable #需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆)
-keepattributes Signature #过滤泛型(不写可能会出现类型转换错误,一般情况把这个加上就是了)
-keepattributes *Annotation* #假如项目中有用到注解,应加入这行配置
-keep class **.Webview2JsInterface { *; } #保护WebView对HTML页面的API不被混淆
-keepclassmembers class * extends android.webkit.WebViewClient { #如果你的项目中用到了webview的复杂操作 ,最好加入
public void *(android.webkit.WebView,java.lang.String,android.graphics.Bitmap);
public boolean *(android.webkit.WebView,java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebChromeClient { #如果你的项目中用到了webview的复杂操作 ,最好加入
public void *(android.webkit.WebView,java.lang.String);
}
#对WebView的简单说明下:经过实战检验,做腾讯QQ登录,如果引用他们提供的jar,若不加防止WebChromeClient混淆的代码,oauth认证无法回调,反编译基代码后可看到他们有用到WebChromeClient,加入此代码即可。
8、混淆成功后在app/build/output/mapping下可以找到dump.txt、mapping.txt、seeds.txt、usage.txt四个文件,dump.txt中记录所有类文件间的内部结构,mapping.txt中列出了原始的类、方法、变量名与混淆后的映射对应关系,这张表每次发布线上包要保存下来,以便线上出bug后能从混淆后的类、方法中倒推出原始的类、方法,seeds.txt列出了未被混淆的类、方法,usage.txt中列出了从apk中删除的代码