App雖然沒有那么的高大上嗡害,但是代碼的混淆是代表了程序員對App的責(zé)任心鹏控, 也是對App安全的一點點保證庶近。今天我會將自己做Android混淆的過程和體會分享給大家富蓄,也避免大家少走彎路,少跳坑尚镰。
本篇博客混淆基于Android Studio的IDE開發(fā)環(huán)境阀圾。
其實在android Studio中做混淆,基本就是對Proguard-rules.pro文件的操作钓猬∩缘叮混淆的過程也是有規(guī)律可循的。下面我將分幾個部分來分別介紹混淆過程敞曹。
(1)如何開啟混淆。
(2)混淆的公共部分综膀。
(3)需要我們不混淆的代碼澳迫。
(4)libs下的第三方Jar包的混淆方式。
(5)complie的第三方Jar包的混淆方式剧劝。
(6)代碼注釋的混淆方式橄登。
ok,大家準(zhǔn)備好了嗎?下面我就以流水賬的方式與大家分別介紹啦<ゴ恕(O(∩_∩)O 哈哈~)
1.如何開啟混淆
開始混淆很簡單拢锹,Android Studio中找到你的項目module的build.gradle
將minifyEnabled設(shè)置為true就ok。
2.公共部分
在混淆的過程中萄喳,有一部分是固定不變的卒稳。下面我將列出保持不變的模塊,只需將代碼Copy即可他巨。
1.基本指令區(qū)
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-ignorewarning
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#2.默認(rèn)保留區(qū)
-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 * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keep class **.R$* {
*;
}
-keepclassmembers class * {
void *(**On*Event);
}
3.webview
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
-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);
}
以上就是固定不變的部分充坑。
3.需要我們不混淆的代碼
不混淆用關(guān)鍵字-keep來修飾减江。不混淆的部分大概分為如下幾個模塊:
(1)實體類,json解析類
(2)第三方j(luò)ar包
(3)js和webview的調(diào)用模塊
(4)與反射相關(guān)的類和方法
大概就是以上幾個模塊捻爷,下面來看不混淆的代碼:
-keep class com.xx.xx.entity.** { *; }
2.第三方包
#eventBus
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.** { *; }
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
#3.與js互相調(diào)用的類
沒有可不寫
#4.反射相關(guān)的類和方法
-keep class com.xx.xx.xx.xx.view.** { *; }
-keep class com.xx.xx.xx.xx.xx.** { *; }
4.libs下的第三方Jar包的混淆方式
保留libs下的jar包的方式也很簡單辈灼,同樣是使用-keep關(guān)鍵字:
找到libs目錄,打開相對于的jar文件也榄,找到對應(yīng)的包名巡莹,然后添加如下代碼:
-keep class 包名.** { *; }
5.complie的第三方Jar包的混淆方式
complie的第三方Jar包的混淆方式和libs下的相同,只需要打開:
打開對應(yīng)的引用jar文件甜紫,然后同樣使用-keep class 包名.** { *; }
6.代碼注釋的混淆方式
我們在項目中肯定用到過有注釋方式的代碼榕莺,例如小刀(butterknife)。需要使用@Bind來修飾變量棵介。