Android 程式碼混淆語法講解及常用模板

徐公碼字發表於2017-10-19

轉載請註明原部落格地址 Android 程式碼混淆語法講解及常用模板

前言

混淆對於每一個開發者來說都不陌生,對於大多數 APP 而言,在上線之前,通常會進行程式碼混淆,加固,防止自己的 APP 被別人輕易破解。

一般來說,混淆有以下好處

  • 提高自己 APP 的安全性,防止被別人輕易破解
  • 在一定程度上起到 APK 瘦身的作用,因為方法名,類名都變成 a,b,c 等這樣的形式,這無疑會節省資源

Android 混淆模板程式碼講解

在現在的 Android 開發中,基本都是以 AndroidStudio 為主,因此,本篇文章也主要以 AndroidStudio 為例進行講解。

在 AndroidStudio 中,在 moudle 的根目錄中我們一般可以看到 proguard-rules.pro 檔案,這個檔案就是用來配置程式碼混淆的。

至於它是怎樣指定 proguard-rules.pro 檔案來配置程式碼混淆的,我們可以在看一下 build.gradle 是怎樣配置的

// 對正式版的進行混淆配置
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }複製程式碼

瞭解了在哪裡配置混淆程式碼之後,下面我們一起來看一下怎樣混淆程式碼

首先,我們先來看一下 Android 預設的程式碼混淆配置,在 {SDKHOME}\tools\proguard 目錄下,有 proguard-android.txt 檔案,該檔案就是預設的程式碼混淆配置

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers 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 **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-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>(...);
}複製程式碼

解釋說明

-dontusemixedcaseclassnames 表示混淆時不使用大小寫類名

-dontskipnonpubliclibraryclasses 表示不跳過library中的非public的類。

-verbose 列印混淆的詳細資訊

-dontskipnonpubliclibraryclasses 表示不跳過 library 中非 public 的類

-dontoptimize 表示不進行優化,建議使用此選項,因為根據proguard-android-optimize.txt中的描述,優化可能會造成一些潛在風險,不能保證在所有版本的Dalvik上都正常執行。

-dontpreverify 表示不進行預校驗。這個預校驗是作用在Java平臺上的,Android平臺上不需要這項功能,去掉之後還可以加快混淆速度。

-keepattributes *Annotation* 表示對註解中的引數進行保留

-keepclasseswithmembernames class * {
    native <methods>;
}複製程式碼

保持所有類的 native 方法不被混淆

-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}複製程式碼

表示不混淆 View 的子類中的 set 和 get 方法,因為 View 中的屬性動畫需要 setter 和 getter,混淆了就無法工作了。

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}複製程式碼

表示不混淆 Activity 及 Activity 子類中方法引數是 (android.view.View) 的方法。因為我們平時在 xml 檔案裡面可以這樣寫 onClick="onButtonClick",這樣點選 Button 的時候會自動到 Activity 裡面查詢是否有 onButtonClick (android.view.View),有的話,該方法會響應,沒有找到的話會報錯。因此,一般也不混淆。

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}複製程式碼

表示不對美劇類中的 calues 和 valueOf(java.lang.String) 進行混淆

-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}複製程式碼

表示不混淆 Parcelable 的實現類中的 CREATOR,我們知道序列化與反序列化的過程都需要 CREATOR, 混淆了就無法工作了。

-keepclassmembers class **.R$* {
    public static <fields>;
}複製程式碼

表示不混淆 R 類中 的 static 變數,在 R 類中。這些資源 ID 是系統自動幫我們生成的,混淆了就無法找到相應的資源。

-dontwarn android.support.**複製程式碼

表示混略 android.support 包下程式碼的警告。因為 android.support 包下,許多類都是在高版本中才能使用的,不過你不用擔心低版本使用了會報錯,因為在 support 包裡面的類都已經對版本進行判斷,所有直接忽略即可。

-keep class android.support.annotation.Keep複製程式碼

表示不混淆 Keep 類

-keep @android.support.annotation.Keep class * {*;}複製程式碼

表示不混淆 以下形式的程式碼

 @Keep *{
}複製程式碼
-keepclasseswithmembers class * {
    @android.support.annotation.Keep <methods>;
}複製程式碼

表示不混淆所有類中用 @Keep 註解的方法

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <fields>;
}複製程式碼

表示不混淆所有類中用 @Keep 的變數

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <init>(...);
}複製程式碼

表示不混淆所有類中用 @Keep 註解的構造方法


Android 混淆程式碼示例

如上圖,假如我們的專案中的配置是這樣的,如果我們想保持專案中 xj.progurddemo.been 包下的類都不被混淆,我們可以這樣寫

-keep class  xj.progurddemo.been.**複製程式碼

而 -keep class xj.progurddemo.been.* 只能保證 People,Test 類不被混淆。Debug 包下的 Debug 類還是會被混淆。

到這裡,相信你已經明白 * 和 \ 之間的區別了。 * 包含目錄下的所有子目錄,而 \ 只包含 目錄下的直接目錄。

假如我們有以下類 Test,

public class Test {

    String name;

    public void  test(){

    }

    public abstract String test(String name)
}複製程式碼

我們不想 test 類中的 test 方法不被混淆,而 name 欄位可以被混淆,我們可以這樣配置

 -keepclassmembers public class xj.progurddemo.been.Test {
   *** test*(***);複製程式碼

*** 表示匹配任意引數,這樣 Test 類中的 test 方法都不會被混淆,不管該方法含有什麼型別的引數和該方法的返回型別。


Android 混淆語法介紹

看完簡單的程式碼示例,下面我們一起拉看一下混淆的語法。

首先我們先來看一下 keep 關鍵字

關鍵字 描述
keep 保留類和類中的成員,防止被混淆或者移除
keepnames 保留類和類中的成員,防止被混淆,但是當成員沒有被引用時會被移除
keepclassmembers 只保留類中的成員,防止他們被混淆或者移除
keepclassmembersnames 只保留類中的成員,防止他們被混淆或者移除,但是當類中的成員沒有被引用時還是會被移除
keepclasseswithmembers 保留類和類中的成員,前提是指明的類中必須含有該成員,沒有的話還是會被混淆
keepclasseswithmembersnames 保留類和類中的成員,前提是指明的類中必須含有該成員,沒有的話還是會被混淆。需要注意的是沒有被引用的成員會被移除

接下來我們一起來看一下萬用字元

關鍵字 描述
<filed> 匹配類中的所有欄位
<method> 匹配類中的所有方法
<init> 匹配類中的所有建構函式
* 匹配任意長度字元,但不含包名分隔符(.)。比如說我們的完整類名是com.example.test.MyActivity,使用com.,或者com.exmaple.都是無法匹配的,因為無法匹配包名中的分隔符,正確的匹配方式是com.exmaple..,或者com.exmaple.test.,這些都是可以的。但如果你不寫任何其它內容,只有一個*,那就表示匹配所有的東西。
** 匹配任意長度字元,並且包含包名分隔符(.)。比如proguard-android.txt中使用的-dontwarn android.support.**就可以匹配android.support包下的所有內容,包括任意長度的子包。
*** 匹配任意引數型別。比如void set(**)就能匹配任意傳入的引數型別,** get()就能匹配任意返回值的型別。
匹配任意長度的任意型別引數。比如void test(…)就能匹配任意void test(String a)或者是void test(int a, String b)這些方法。

Android 混淆外掛推薦及常用的混淆模板

Github 上面的混淆外掛

Github 上有這樣一個外掛,AndroidProguardPlugin,他幫我們收集了常用的混淆模板,基本能滿足我們的大部分需求。詳情大家可以自己點選檢視,這裡就不教大家怎樣使用了,該連結已經講解地很清楚了。AndroidProguardPlugin

Android 常用混淆模板

# copyright zhonghanwen
#-------------------------------------------基本不用動區域--------------------------------------------
#---------------------------------基本指令區----------------------------------
-optimizationpasses 5
-dontskipnonpubliclibraryclassmembers
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------

#---------------------------------預設保留區---------------------------------
#繼承activity,application,service,broadcastReceiver,contentprovider....不進行混淆
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.support.multidex.MultiDexApplication
-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.** {*;}

-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);
}
#這個主要是在layout 中寫的onclick方法android:onclick="onClick",不進行混淆
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-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 *(*Event);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
#// natvie 方法不混淆
-keepclasseswithmembernames class * {
    native <methods>;
}

#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

#----------------------------------------------------------------------------

#---------------------------------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 [your_pkg].** { *; }

#---------------------------------第三方包-------------------------------

#支付寶支付
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep public class * extends android.os.IInterface
#微信支付
-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}
-keep class com.tencent.wxop.** { *; }
-dontwarn com.tencent.mm.**
-keep class com.tencent.mm.**{*;}

-keep class sun.misc.Unsafe { *; }

-keep class com.taobao.** {*;}
-keep class com.alibaba.** {*;}
-keep class com.alipay.** {*;}
-dontwarn com.taobao.**
-dontwarn com.alibaba.**
-dontwarn com.alipay.**

-keep class com.ut.** {*;}
-dontwarn com.ut.**

-keep class com.ta.** {*;}
-dontwarn com.ta.**

-keep class anet.**{*;}
-keep class org.android.spdy.**{*;}
-keep class org.android.agoo.**{*;}
-dontwarn anet.**
-dontwarn org.android.spdy.**
-dontwarn org.android.agoo.**

-keepclasseswithmembernames class com.xiaomi.**{*;}
-keep public class * extends com.xiaomi.mipush.sdk.PushMessageReceiver

-dontwarn com.xiaomi.push.service.b

-keep class org.apache.http.**
-keep interface org.apache.http.**
-dontwarn org.apache.**

#okhttp3.x
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**
#sharesdk
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class **.R$* {*;}
-keep class **.R{*;}

-keep class com.mob.**{*;}
-dontwarn com.mob.**
-dontwarn cn.sharesdk.**
-dontwarn **.R$*

## nineoldandroids-2.4.0.jar
-keep public class com.nineoldandroids.** {*;}

####################zxing#####################
-keep class com.google.zxing.** {*;}
-dontwarn com.google.zxing.**
##百度定位
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-dontwarn com.baidu.**

## okhttp
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.{*;}
#retrofit
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-dontwarn okio.**

#recyclerview-animators
-keep class jp.wasabeef.** {*;}
-dontwarn jp.wasabeef.*

#multistateview
-keep class com.kennyc.view.** { *; }
-dontwarn com.kennyc.view.*

# universal-image-loader 混淆
-dontwarn com.nostra13.universalimageloader.**
-keep class com.nostra13.universalimageloader.** { *; }

#ormlite
-keep class com.j256.**
-keepclassmembers class com.j256.** { *; }
-keep enum com.j256.**
-keepclassmembers enum com.j256.** { *; }
-keep interface com.j256.**
-keepclassmembers interface com.j256.** { *; }
#umeng
# ========= 友盟 =================
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**


-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable

-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**

-keep public class com.umeng.socialize.* {*;}
-keep public class javax.**
-keep public class android.webkit.**

-keep class com.facebook.**
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**

-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}

-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}

-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
下面中括號的地方需要要填你的包名
-keep public class [your_pkg].R$*{
    public static final int *;
}
-keepclassmembers class * {
   public <init> (org.json.JSONObject);
}
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

#友盟自動更新
-keep public class com.umeng.fb.ui.ThreadView {
}
-keep public class * extends com.umeng.**
# 以下包不進行過濾
-keep class com.umeng.** { *; }


#-ButterKnife 7.0
 -keep class butterknife.** { *; }
 -dontwarn butterknife.internal.**
 -keep class **$$ViewBinder { *; }
 -keepclasseswithmembernames class * {
  @butterknife.* <fields>;
 }
 -keepclasseswithmembernames class * {
 @butterknife.* <methods>;
 }


#AndFix
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native <methods>;
}

#eventbus 3.0
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}


#EventBus
-keepclassmembers class ** {
    public void onEvent*(**);
}
-keepclassmembers class ** {
public void xxxxxx(**);
}


################gson##################
-keep class com.google.gson.** {*;}
-keep class com.google.**{*;}
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }

-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 public class * implements java.io.Serializable {*;}


# support-v4
#https://stackoverflow.com/questions/18978706/obfuscate-android-support-v7-widget-gridlayout-issue
-dontwarn android.support.v4.**
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v4.** { *; }


# support-v7
-dontwarn android.support.v7.**
-keep class android.support.v7.internal.** { *; }
-keep interface android.support.v7.internal.** { *; }
-keep class android.support.v7.** { *; }

# support design
#@link http://stackoverflow.com/a/31028536
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }
#-------------------------------------------------------------------------

# picasso
-keep class com.squareup.picasso.** {*; }  
-dontwarn com.squareup.picasso.**

#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

# #  ######## greenDao混淆  ########## 
# # -------------------------------------------
-keep class de.greenrobot.dao.** {*;}
-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
    public static Java.lang.String TABLENAME;
}
-keep class **$Properties
# #  ############### volley混淆  ############### 
# # -------------------------------------------
-keep class com.android.volley.** {*;}
-keep class com.android.volley.toolbox.** {*;}
-keep class com.android.volley.Response$* { *; }
-keep class com.android.volley.Request$* { *; }
-keep class com.android.volley.RequestQueue$* { *; }
-keep class com.android.volley.toolbox.HurlStack$* { *; }
-keep class com.android.volley.toolbox.ImageLoader$* { *; }

#jpush極光推送
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }

#activeandroid
-keep class com.activeandroid.** { *; }
-dontwarn com.ikoding.app.biz.dataobject.**
-keep public class com.ikoding.app.biz.dataobject.** { *;}
-keepattributes *Annotation*

#log4j
-dontwarn org.apache.log4j.**
-keep class  org.apache.log4j.** { *;}
#下面幾行 是環信即時通訊的程式碼混淆
-keep class com.easemob.** {*;}
-keep class org.jivesoftware.** {*;}
-dontwarn  com.easemob.**

#融雲
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
 public *;
}

-keepattributes Exceptions,InnerClasses

-keep class io.rong.** {*;}

-keep class * implements io.rong.imlib.model.MessageContent{*;}

-keepattributes Signature

-keepattributes *Annotation*

-keep class sun.misc.Unsafe { *; }

-keep class com.google.gson.examples.android.model.** { *; }

-keepclassmembers class * extends com.sea_monster.dao.AbstractDao {
 public static java.lang.String TABLENAME;
}
-keep class **$Properties
-dontwarn org.eclipse.jdt.annotation.**

-keep class com.ultrapower.** {*;}
#高徳地圖
-dontwarn com.amap.api.**   
-dontwarn com.a.a.**   
-dontwarn com.autonavi.**   
-keep class com.amap.api.**  {*;}      
-keep class com.autonavi.**  {*;}
-keep class com.a.a.**  {*;}
#---------------------------------反射相關的類和方法-----------------------
在這下面寫反射相關的類和方法,沒有就不用寫!




#---------------------------------與js互相呼叫的類------------------------
在這下面寫與js互相呼叫的類,沒有就去掉這句話!

#---------------------------------自定義View的類------------------------
在這下面寫自定義View的類的類,沒有就去掉這句話!


#SuperID
#由*郭宇翔*貢獻混淆程式碼
#作者Github地址:https://github.com/yourtion
-keep class **.R$* {*;}
-keep class com.isnc.facesdk.aty.**{*;}
-keep class com.isnc.facesdk.**{*;}
-keep class com.isnc.facesdk.common.**{*;}
-keep class com.isnc.facesdk.net.**{*;}
-keep class com.isnc.facesdk.view.**{*;}
-keep class com.isnc.facesdk.viewmodel.**{*;}
-keep class com.matrixcv.androidapi.face.**{*;}

#retrofit2.x
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

#Rxjava RxAndroid
-dontwarn rx.*
-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;
}

#litepal
-dontwarn org.litepal.
-keep class org.litepal.* { ; }
-keep enum org.litepal.*
-keep interface org.litepal. { ; }
-keep public class  extends org.litepal.
-keepattributes Annotation
-keepclassmembers class * extends org.litepal.crud.DataSupport{*;}  

#fastJson
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }

# Okio
-dontwarn com.squareup.**  
-dontwarn okio.**  
-keep public class org.codehaus.* { *; }  
-keep public class java.nio.* { *; }
# Retrolambda
-dontwarn java.lang.invoke.*複製程式碼

轉載請註明原部落格地址 Android 程式碼混淆語法講解及常用模板

相關文章