Android 代碼混淆
簡介
在我們日常開發中,對已經開發完成的源代碼,需做一些代碼混淆作業,以對代碼起到一種保護和降低安裝包體積的作用,
開啟混淆
在app的build.gradle檔案中如下代碼:
android {
......
buildTypes {
release {
//開啟代碼混淆
minifyEnabled true
//開啟資源混淆,移除未使用的資源
shrinkResources true
//proguard-android-optimize.txt:SDK提供的默認混淆檔案
//proguard-rules.pro:自定義混淆檔案
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
配置混淆檔案
在app的proguard-rules.pro檔案中撰寫混淆代碼即可


混淆語法
| 命令 | 作用 |
|---|---|
| -keep | 防止類和成員被移除或者被重命名 |
| -keepnames | 防止類和成員被重命名 |
| -keepclassmembers | 防止成員被移除或者被重命名 |
| -keepclassmembersname | 防止成員被重命名 |
| -keepclasseswithmembers | 防止擁有該成員的類和成員被移除或者被重命名 |
| -keepclasseswithmembernames | 防止擁有該成員的類和成員被重命名 |
| 類通配符 * | 匹配任意長度字符,但不含包名分隔符(.) |
| 類通配符 ** | 匹配任意長度字符,并且包含包名分隔符(.) |
| 類extends | 即可以指定類的基類 |
| 類implements | 匹配實作了某介面的類 |
| 類$ | 內部類 |
| 成員(方法)通配符 * | 匹配任意長度字符,但不含包名分隔符(.) |
| 成員(方法)通配符 ** | 匹配任意長度字符,并且包含包名分隔符(.) |
| 成員(方法)通配符 *** | 匹配任意引數型別 |
| 成員(方法)通配符 … | 匹配任意長度的任意型別引數 |
| 成員(方法)通配符 <> | 匹配方法名,eg. |
常用基本混淆
#############################################
#
# 基本指令區域(沒什么別的需求不需要動)
#
#############################################
# 代碼混淆壓縮比,在0~7之間,默認為5,一般不做修改
-optimizationpasses 5
# 混合時不使用大小寫混合,混合后的類名為小寫
-dontusemixedcaseclassnames
# 指定不去忽略非公共庫的類
-dontskipnonpubliclibraryclasses
# 這句話能夠使我們的專案混淆后產生映射檔案
# 包含有類名->混淆后類名的映射關系
-verbose
# 指定不去忽略非公共庫的類成員
-dontskipnonpubliclibraryclassmembers
# 不做預校驗,preverify是proguard的四個步驟之一,Android不需要preverify,去掉這一步能夠加快混淆速度,
-dontpreverify
# 保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 拋出例外時保留代碼行號
-keepattributes SourceFile,LineNumberTable
# 指定混淆是采用的演算法,后面的引數是一個過濾器
# 這個過濾器是谷歌推薦的演算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*
#############################################
#
# Android開發中一些需要保留的公共部分(沒什么別的需求不需要動)
#
#############################################
# 保留我們使用的四大組件,自定義的Application等等這些類不被混淆
# 因為這些子類都有可能被外部呼叫
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Appliction
-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
# 保留support下的所有類及其內部類
-keep class android.support.** {*;}
# 保留繼承的
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**
# 保留R下面的資源
-keep class **.R$* {*;}
# 保留本地native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留在Activity中的方法引數是view的方法,
# 這樣以來我們在layout中寫的onClick就不會被影響
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
# 保留列舉類不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 保留我們自定義控制元件(繼承自View)不被混淆
-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);
}
# 保留Parcelable序列化類不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 保留Serializable序列化的類不被混淆
-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();
}
# 對于帶有回呼函式的onXXEvent、**On*Listener的,不能被混淆
-keepclassmembers class * {
void *(**On*Event);
void *(**On*Listener);
}
# WebView處理,專案中沒有使用到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);
}
#-----------處理物體類---------------
# 在開發的時候我們可以將所有的物體類放在一個包內,這樣我們寫一次混淆就行了,
-keep class com.zzs.wanandroidmvvm.model.bean.** { *; }
常見第三方混淆
ButterKnife
# ButterKnife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
EventBus
# EventBus
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
OkHttp3
# OkHttp3
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**
Retrofit
# Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
RxJava RxAndroid
# RxJava RxAndroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
Glide
# Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
Gson
# Gson
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn sun.misc.**
-keep class com.google.gson.examples.android.model.** { <fields>; }
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
GreenDao
# GreenDao
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties { *; }
不混淆第三方庫(包括jar、aar、依賴)
-keep class 第三方庫包名.** { *;}
如:
-keep class com.baidu.map.** { *;}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/7932.html
標籤:其他
上一篇:Linux密碼忘了怎么辦?或者進入他人的Linux系統,我教你,拿去拿去別客氣,安排(也可進入別人的Linux搞一搞)!!!!
