大家都晓得四大组件是不能混淆的 因为混淆工具只会搞dex文件的混淆 xml就不行了 强行混淆会导致activity文件名改变了 注册清单里面的没变从而导致无法运行APP
下面介绍一个能混淆四大组件 自定义view的办法 和其他的组件
效果图如下
可以看到四大组件名字都改变了 谁也认不出咋是啥玩意 大大提高解读难度
这个gradle插件是饿了么开源的组件 开源项目我也copy了一份 点我直达
copy的版本是本文发布的时间 2019年01月20日14:51:38
如果有更新请自己跟踪copy
使用很简单 但是官方并没有太多的使用文档和注意事项说
我这里根据使用经验来补充介绍一下
- 插件的最新版本是2.0.0 也就是classpath 'me.ele:mess-plugin:2.0.0’这样 可以自己改成classpath 'me.ele:mess-plugin:+'来获取最新版本 获取完毕之后在改成写死的最新版本
- 2.0.0版本插件只支持gradle 3.0.x版本 如果你使用的gradle版本比较高 请自行降低 否则会报错找不到清单文件
- 混淆规则请添加指令-dontshrink 否则会导致插件失效
- 混淆如果使用之前文章的自定义字典 请注释classobfuscationdictionary这个类名字典 否则会导致编译失败 因为xml不识别特殊符号
- 使用时请吧混淆规则的排除四大组件 自定义view等规则注释 否则就没有使用这个插件的意义了
- 在测试混淆的时候 请不要使用 run的方法直接运行到手机 有可能导致插件失效 我是build debug apk 文件出来发送到手机来测试的
下面附上我的混淆配置文件
#必须要开 否则ele的activity混淆会失效
-dontshrink
-optimizationpasses 5
-dontusemixedcaseclassnames
#-overloadaggressively
#-useuniqueclassmembernames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-allowaccessmodification
-dontoptimize
-dontpreverify
-ignorewarnings
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*
-keepattributes Signature
-keepattributes Exceptions
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
#自定义输出到指定包名 捉迷藏
-repackageclasses 'android.support.v4'
-verbose
#自定义字典 类名的混淆字典注释 为什么上面说了
-obfuscationdictionary dict.txt
#-classobfuscationdictionary dict.txt
-packageobfuscationdictionary dict.txt
#关闭警告
-dontwarn android.support.**
-dontwarn androidx.**
#webview 使用了要加上
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
-keepclassmembers,allowoptimization enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-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();
}
#移除日志
-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(...);
}
-assumenosideeffects class java.io.PrintStream {
public *** println(...);
public *** print(...);
}
#-----------------------------不动-----------------------------
#okhttp的混淆
-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
-dontwarn org.codehaus.mojo.animal_sniffer.*
-dontwarn okhttp3.internal.platform.ConscryptPlatform
#腾讯mta统计
-keep class com.tencent.stat.*{*;}
-keep class com.tencent.mid.*{*;}
#广点通广告
-keep class com.qq.e.** {
public protected *;
}
#ndk类排除
-keep class 包名.Utils{
*;
}
#webview js 交互
-keep class 包名.JavaScriptLocal{
*;
}
配置好了就可以build apk出来测试了 可以使用jadx-gui来反编译项目查看效果 jadx-gui工具自己网上找
附上使用方法
项目根目的gradle依赖导入
dependencies {
//noinspection GradleDependency
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'me.ele:mess-plugin:2.0.0'
}
app模块的使用插件
apply plugin: 'com.android.application'
apply plugin: 'me.ele.mess'
这样就行