大家都曉得四大組件是不能混淆的 因爲混淆工具只會搞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'
這樣就行