国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

android 混淆規(guī)則作用,Android代碼混淆詳解

這篇具有很好參考價值的文章主要介紹了android 混淆規(guī)則作用,Android代碼混淆詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、混淆的意義

混淆代碼并不是讓代碼無法被反編譯,而是將代碼中的類、方法、變量等信息進(jìn)行重命名,把它們改成一些毫無意義的名字,同時也可以移除未被使用的類、方法、變量等。 所以直觀的看,通過混淆可以提高程序的安全性,增加逆向工程的難度,同時也有效縮減了apk的體積??偨Y(jié)如下:

1、將項(xiàng)目中的類、方法、變量等信息進(jìn)行重命名,變成一些無意義的簡短名字。

2、移除未被使用的類、方法、變量等。

二、混淆的規(guī)則和配置

凡是需要在AndroidManifest.xml中去注冊的所有類的類名以及從父類重寫的方法名都自動不會被混淆。 因此,除了Activity之外,這份規(guī)則同樣也適用于Service、BroadcastReceiver和ContentProvider。

(1)minifyEnabled

minifyEnabled為true的作用:啟用代碼混淆、壓縮APK;

minifyEnabled會對資源進(jìn)行壓縮,多余的代碼在打包的時候就給移除掉了。不僅僅是代碼,沒有被調(diào)用的資源同樣也會被移除掉,因此minifyEnabled除了混淆代碼之外,還可以起到壓縮APK包的作用。

開啟混淆后也可添加shrinkResources,表示開啟刪除無用資源。

(2)shrinkResources

shrinkResources為true用來開啟刪除無用資源。

shrinkResources會對就是沒有被引用的文件(經(jīng)過實(shí)測是drawable,layout,實(shí)際并不是徹底刪除,而是保留文件名,但是沒有內(nèi)容),但是因?yàn)樾枰朗欠癖灰盟孕枰浜蟤ififyEnable使用,只有當(dāng)兩者都為true的時候才會起到真正的刪除無效代碼和無引用資源的目的。

(3)避免被誤刪除

若配置minifyEnable true && shrinkResources true,防止避免誤刪除的文件,可以配置如下: 在res/raw/keep.xml(避免被誤刪除)寫了配置的

對于沒有被引用的文件&沒有在配置文件keep.xml中聲明保存的文件,打包后是沒有內(nèi)容的,聲明保存的文件有內(nèi)容(資源文件和layout文件)。 注意:string.xml中沒有被引用的怎么設(shè)置都不會被刪除。

(4)proguard-android.txt和proguard-rules.pro

proguard-android.txt:代表系統(tǒng)默認(rèn)的混淆規(guī)則配置文件,該文件在/tools/proguard下,一般不要更改該配置文件,因?yàn)橐矔饔糜谄渌?xiàng)目。

proguard-rules.pro:代碼表當(dāng)前Project的混淆配置文件,在app module下,可以通過修改該文件來添加適用當(dāng)前項(xiàng)目的混淆規(guī)則。

(5)proguard文件夾

代碼混淆生成apk之后,項(xiàng)目下面會多出來一個proguard文件夾,proguard文件夾中四個文件的作用。

dump.txt : 描述了apk中所有類文件中內(nèi)部的結(jié)構(gòu)體。

mapping.txt : 列出了原始的類、方法和名稱與混淆代碼間的映射。

seeds.txt : 列出了沒有混淆的類和方法。

usage.txt : 列出congapk中刪除的代碼。

android studio自帶java語言的ProGuard工具,主要用來壓縮、優(yōu)化、混淆,然后配合Gradle構(gòu)建工具實(shí)現(xiàn)混淆。

在app module中統(tǒng)一配置混淆規(guī)則

我們可以直接在app module中build.gradle文件配置所有module需要混淆的規(guī)則。這樣,其他module中就無需開啟混淆。
首先在build.gradle 中將混淆的開關(guān)打開,即 minifyEnabled 置為 true

?

1 buildTypes {
2         release {
3             minifyEnabled true   //開啟混淆
4             zipAlignEnabled true  //壓縮優(yōu)化
5             shrinkResources true  //移出無用資源
6             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //默認(rèn)的混淆文件以及我們指定的混淆文件
7         }
8 }

如果是model混淆,子模塊混淆文件的指定是通過consumerProguardFiles這個屬性來指定的,并不是proguardFiles 屬性,而且我們無需配置其他的選項(xiàng),只需要配置consumerProguardFiles屬性就可以。該屬性表示在打包的時候會自動尋找該module下我們指定的混淆文件對代碼進(jìn)行混淆。配置如下:

1 buildTypes {
2     release {
3     //minifyEnabled true //是否開啟混淆,其實(shí)子模塊中這個已經(jīng)沒有作用了,由主模塊控制
4     consumerProguardFiles 'proguard-rules.pro' //子模塊要用這個命令才能生效
5 }

然后就要去proguard-rules.pro寫入我們的混淆的規(guī)則(如文件其名),防止重要的類被混淆移除了。

先特別介紹的是與保持相關(guān)元素不參與混淆的規(guī)則相關(guān)的幾種命令:
-keep ? ?防止類和成員被移除或者被重命名
-keepnames ? ?防止類和成員被重命名
-keepclassmembers ? ?防止成員被移除或者被重命名
-keepclasseswithmembers ? ?防止擁有該成員的類和成員被移除或者被重命名
-keepclasseswithmembernames ? ?防止擁有該成員的類和成員被重命名

混淆規(guī)則:

1、有一些固定的混淆規(guī)則不需要更改:

#指定代碼的壓縮級別
-optimizationpasses 5

#包明不混合大小寫
-dontusemixedcaseclassnames

#不去忽略非公共的庫類
-dontskipnonpubliclibraryclasses

?#優(yōu)化 ?不優(yōu)化輸入的類文件
-dontoptimize

?#預(yù)校驗(yàn)
-dontpreverify

?#混淆時是否記錄日志
-verbose

?# 混淆時所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

#保護(hù)注解
-keepattributes *Annotation*

2、理解通配符

-keep class cn.hadcn.test.**
-keep class cn.hadcn.test.*
很多同學(xué)都搞不懂下面兩個的區(qū)別,一顆星表示只是保持該包下的類名,而子包下的類名還是會被混淆;兩顆星表示把本包和所含子包下的類名都保持;用以上方法保持類后,你會發(fā)現(xiàn)類名雖然未混淆,但里面的具體方法和變量命名還是變了,這時如果既想保持類名,又想保持里面的內(nèi)容不被混淆,我們就需要以下方法了:

-keep class cn.hadcn.test.* {*;}

3、保證指定包名下的所有類及子包中所有的類不被混淆

例子1:com.lib.manager 包下面的類不混淆
-keep class com.lib.manager.**{*;}?
例子2:v4包下面的所有類不混淆
-keep class android.support.v4.** { *; }

4、保證指定的類不被混淆

例子1:YiBaWiFiActivity 類不被混淆, YiBaWiFiActivity 完整包名:com.yiba.wifi.sdk.lib.activity.YiBaWiFiActivity
-keep class com.yiba.wifi.sdk.lib.activity.YiBaWiFiActivity{*;}
例子2:v4 包下面的 ActivityCompat 類不被混淆
-keep class android.support.v4.app.ActivityCompat{*;}

5、不混淆指定類的子類

-keep class * extends pp.lib.User { *; }
User 類的子類不混淆

6、指定接口不混淆

Callback 是一個接口,完整包名為:com.lib.impl.Callback

-keep interface com.lib.impl.Callback{ * ; }

7、指定接口的實(shí)現(xiàn)類不混淆

Callback 是一個接口,完整包名為:com.lib.impl.Callback . 所有的實(shí)現(xiàn)類都不會混淆。

-keep class * implements com.lib.impl.Callback { *; }

8、指定類的內(nèi)部類不混淆

PhoneUtil 的源碼如下:

 1 package com.lib.manager;
 2 import android.content.Context;
 3 import android.os.AsyncTask;
 4  
 5 /**
 6  * Created by yiba_zyj on 2017/4/5.
 7  */
 8  
 9 public class PhoneUtil {
10  
11     public final static int APPID = 100 ;
12  
13     public PhoneUtil( Context context ){
14  
15     }
16  
17     class MyTask extends AsyncTask {
18  
19         @Override
20         protected Object doInBackground(Object[] params) {
21             return null;
22         }
23     }
24 }

PhoneUtil 有一個常量、一個構(gòu)造函數(shù)、一個內(nèi)部類。

混淆規(guī)則:

-keep class com.lib.manager.PhoneUtil$* {
? * ;
}

?

9、構(gòu)造函數(shù)不混淆

PhoneUtil 的源碼如所示:

 1 package com.lib;
 2  
 3 /**
 4  * Created by yiba_zyj on 2017/4/7.
 5  */
 6  
 7 public class PhoneUtil {
 8  
 9     public static final String aa = "1222" ;
10  
11     public void run(){
12  
13     }
14  
15 }

混淆規(guī)則:PhoneUtil 的無參構(gòu)造函數(shù)不混淆 。PhoneUtil 里面沒有用到的 屬性和方法將會被移除。

-keep class com.lib.PhoneUtil {
? public <init>();
}
那么有參的構(gòu)造函數(shù)的混淆規(guī)則是怎么樣的?

混淆規(guī)則:PhoneUtil 的 參數(shù)為 Context 的構(gòu)造函數(shù)不混淆

-keep class com.lib.PhoneUtil {
public <init>( android.content.Context );
}

10、指定類的屬性和方法不被混淆

原始類 PhoneUtil 代碼如下,完整的包名為:com.lib.manager.PhoneUtil

 1 package com.lib.manager;
 2  
 3 import android.content.Context;
 4 import android.util.DisplayMetrics;
 5 import android.view.WindowManager;
 6  
 7 /**
 8  * Created by yiba_zyj on 2017/4/5.
 9  */
10  
11 public class PhoneUtil {
12  
13      public static final int AppID = 100 ;
14  
15     /**
16      * 獲得屏幕高度
17      * @param context
18      * @return
19      */
20     public static int getScreenWidth(Context context) {
21         WindowManager wm = (WindowManager) context
22                 .getSystemService(Context.WINDOW_SERVICE);
23         DisplayMetrics outMetrics = new DisplayMetrics();
24         wm.getDefaultDisplay().getMetrics(outMetrics);
25         return  outMetrics.widthPixels;
26     }
27  
28     /**
29      * 獲得屏幕寬度
30      * @param context
31      * @return
32      */
33     public static int getScreenHeight(Context context) {
34         WindowManager wm = (WindowManager) context
35                 .getSystemService(Context.WINDOW_SERVICE);
36         DisplayMetrics outMetrics = new DisplayMetrics();
37         wm.getDefaultDisplay().getMetrics(outMetrics);
38         return  outMetrics.heightPixels;
39     }
40  
41 }

PhoneUtil 類中包含1個常量及2個方法.類中的變量不被混淆:
-keep class com.lib.manager.PhoneUtil{
public static final int AppID ;
}
混淆后的效果如下:

1 package com.lib.manager;
2  
3 public class PhoneUtil {
4     public static final int AppID = 100;
5  
6     public PhoneUtil() {
7     }
8 }

可以看到混淆后的類中,AppID 常量被保存下來了,getScreenWidth 、 getScreenHeight 這兩個方法被移除了。 為什么會有方法被移除? 因?yàn)樵诨煜龝r,Android 會默認(rèn)移除沒有使用的的方法和資源,保證apk 合理的被壓縮。保留類中的方法不被混淆
-keep class com.lib.manager.PhoneUtil{
?public static int getScreenWidth(android.content.Context);
?}
混淆后的方法如下:

 1 //
 2 // Source code recreated from a .class file by IntelliJ IDEA
 3 // (powered by Fernflower decompiler)
 4 //
 5  
 6 package com.lib.manager;
 7  
 8 import android.content.Context;
 9 import android.util.DisplayMetrics;
10 import android.view.WindowManager;
11  
12 public class PhoneUtil {
13     public PhoneUtil() {
14     }
15  
16     public static int getScreenWidth(Context var0) {
17         WindowManager var1 = (WindowManager)var0.getSystemService("window");
18         DisplayMetrics var2 = new DisplayMetrics();
19         var1.getDefaultDisplay().getMetrics(var2);
20         return var2.widthPixels;
21     }
22 }

11、不混淆類中所有的 public 方法

# <methods> 匹配所有的方法

-keep class cn.hadcn.test.One {
? ? public <methods>;
}
表示One類下的所有public方法都不會被混淆

12、不混淆類中所有的 public 字段

-keep class pp.lib.PhoneUtil{
? public <fields> ;
}
表示 PhoneUtil 類中所有的 public 屬性將保留,其他類型的字段

13、不混淆構(gòu)造函數(shù)

-keep class pp.lib.PhoneUtil{
? ?<init>(***) ;
? ?<init>(*** , *** ) ;
}
不混淆 PhoneUtil 類中所有 一個參數(shù) 和 兩個參數(shù)的 的構(gòu)造函數(shù)。

13、不混淆 bean 對象里面的 set 、get 方法

User 對象如下圖所示:

 1 package pp.lib;
 2  
 3 /**
 4  * Created by ${zhaoyanjun} on 2017/4/10.
 5  */
 6  
 7 public class User {
 8  
 9     private String name ;
10     private String age ;
11  
12     public String getName() {
13         return name;
14     }
15  
16     public void setName(String name) {
17         this.name = name;
18     }
19  
20     public String getAge() {
21         return age;
22     }
23  
24     public void setAge(String age) {
25         this.age = age;
26     }
27 }

混淆規(guī)則:不混淆 User 類中所有的 set 和 get 方法,*** 代表 通配符

-keep class pp.lib.User{
? void set*( *** ) ;
? ?*** get*() ;
}

常見不混淆的類和屬性

不混淆四大組件 和 Application

因?yàn)樗拇蠼M件和 Application 需要在 AndroidManifest.xml 中注冊,不能混淆,否則就會報(bào)類找不到異常。

-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?

特殊情況:

如果 BroadcastReceiver 是動態(tài)注冊的,則是可以加入混淆的。

不混淆任何包含native方法的類的類名以及native方法名
-keepclasseswithmembernames class * {
? ? native <methods>;
}

不混淆任何一個View中的setXxx()和getXxx()方法,因?yàn)閷傩詣赢嬓枰邢鄳?yīng)的setter和getter的方法實(shí)現(xiàn),混淆了就無法工作了。
-keepclassmembers public class * extends android.view.View {
? ?void set*(***);
? ?*** get*();
}

不混淆Activity中參數(shù)是View的方法,因?yàn)橛羞@樣一種用法,在XML中配置android:onClick=”buttonClick”屬性,當(dāng)用戶點(diǎn)擊該按鈕時就會調(diào)用Activity中的buttonClick(View view)方法,如果這個方法被混淆的話就找不到了。
-keepclassmembers class * extends android.app.Activity {
? ?public void *(android.view.View);
}

不混淆枚舉中的values()和valueOf()方法

-keepclassmembers enum * {
? ? public static **[] values();
? ? public static ** valueOf(java.lang.String);
}

不混淆Parcelable實(shí)現(xiàn)類中的CREATOR字段,毫無疑問,CREATOR字段是絕對不能改變的,包括大小寫都不能變,不然整個Parcelable工作機(jī)制都會失敗。
-keepclassmembers class * implements android.os.Parcelable {
? public static final android.os.Parcelable$Creator CREATOR;
}

不混淆R文件中的所有靜態(tài)字段,我們都知道R文件是通過字段來記錄每個資源的id的,字段名要是被混淆了,id也就找不著了。
登錄后復(fù)制?
-keepclassmembers class **.R$* {
? ? public static <fields>;
}
?

其他的常見不被混淆

一般以下情況都會不混淆:

1.使用了自定義控件那么要保證它們不參與混淆。

2.使用了枚舉要保證枚舉不被混淆。

3.對第三方庫中的類不進(jìn)行混淆。

4.運(yùn)用了反射的類也不進(jìn)行混淆。

5.使用了 Gson 之類的工具要使 JavaBean 類即實(shí)體類不被混淆。

6.在引用第三方庫的時候,一般會標(biāo)明庫的混淆規(guī)則的,建議在使用的時候就把混淆規(guī)則添加上去,免得到最后才去找。

7.有用到 WebView 的 JS 調(diào)用也需要保證寫的接口方法不混淆,原因和第一條一樣。

8.Parcelable 的子類和 Creator 靜態(tài)成員變量不混淆,否則會產(chǎn)生 Android.os.BadParcelableException 異常。

9.供第三放調(diào)用的Interface接口不進(jìn)行混淆。

附一份配置:

  1 # 指定代碼的壓縮級別 0 - 7(指定代碼進(jìn)行迭代優(yōu)化的次數(shù),在Android里面默認(rèn)是5,這條指令也只有在可以優(yōu)化時起作用。)
  2 -optimizationpasses 5
  3 # 混淆時不會產(chǎn)生形形色色的類名(混淆時不使用大小寫混合類名)
  4 -dontusemixedcaseclassnames
  5 # 指定不去忽略非公共的庫類(不跳過library中的非public的類)
  6 -dontskipnonpubliclibraryclasses
  7 # 指定不去忽略包可見的庫類的成員
  8 -dontskipnonpubliclibraryclassmembers
  9 #不進(jìn)行優(yōu)化,建議使用此選項(xiàng),
 10 -dontoptimize
 11  # 不進(jìn)行預(yù)校驗(yàn),Android不需要,可加快混淆速度。
 12 -dontpreverify
 13 # 屏蔽警告
 14 -ignorewarnings
 15 # 指定混淆是采用的算法,后面的參數(shù)是一個過濾器
 16 # 這個過濾器是谷歌推薦的算法,一般不做更改
 17 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
 18 # 保護(hù)代碼中的Annotation不被混淆
 19 -keepattributes *Annotation*
 20 # 避免混淆泛型, 這在JSON實(shí)體映射時非常重要
 21 -keepattributes Signature
 22 # 拋出異常時保留代碼行號
 23 -keepattributes SourceFile,LineNumberTable
 24  #優(yōu)化時允許訪問并修改有修飾符的類和類的成員,這可以提高優(yōu)化步驟的結(jié)果。
 25 # 比如,當(dāng)內(nèi)聯(lián)一個公共的getter方法時,這也可能需要外地公共訪問。
 26 # 雖然java二進(jìn)制規(guī)范不需要這個,要不然有的虛擬機(jī)處理這些代碼會有問題。當(dāng)有優(yōu)化和使用-repackageclasses時才適用。
 27 #指示語:不能用這個指令處理庫中的代碼,因?yàn)橛械念惡皖惓蓡T沒有設(shè)計(jì)成public ,而在api中可能變成public
 28 -allowaccessmodification
 29 #當(dāng)有優(yōu)化和使用-repackageclasses時才適用。
 30 -repackageclasses ''
 31  # 混淆時記錄日志(打印混淆的詳細(xì)信息)
 32  # 這句話能夠使我們的項(xiàng)目混淆后產(chǎn)生映射文件
 33  # 包含有類名->混淆后類名的映射關(guān)系
 34 -verbose
 35 # ----------------------------- 默認(rèn)保留 -----------------------------
 36 # 保持哪些類不被混淆
 37 #繼承activity,application,service,broadcastReceiver,contentprovider....不進(jìn)行混淆
 38 -keep public class * extends android.app.Activity
 39 -keep public class * extends android.app.Application
 40 -keep public class * extends android.support.multidex.MultiDexApplication
 41 -keep public class * extends android.app.Service
 42 -keep public class * extends android.content.BroadcastReceiver
 43 -keep public class * extends android.content.ContentProvider
 44 -keep public class * extends android.app.backup.BackupAgentHelper
 45 -keep public class * extends android.preference.Preference
 46 -keep public class * extends android.view.View
 47 -keep class android.support.** {*;}## 保留support下的所有類及其內(nèi)部類
 48 -keep public class com.google.vending.licensing.ILicensingService
 49 -keep public class com.android.vending.licensing.ILicensingService
 50 #表示不混淆上面聲明的類,最后這兩個類我們基本也用不上,是接入Google原生的一些服務(wù)時使用的。
 51 #----------------------------------------------------
 52 # 保留繼承的
 53 -keep public class * extends android.support.v4.**
 54 -keep public class * extends android.support.v7.**
 55 -keep public class * extends android.support.annotation.**
 56 #表示不混淆任何包含native方法的類的類名以及native方法名,這個和我們剛才驗(yàn)證的結(jié)果是一致
 57 -keepclasseswithmembernames class * {
 58     native <methods>;
 59 }
 60 #這個主要是在layout 中寫的onclick方法android:onclick="onClick",不進(jìn)行混淆
 61 #表示不混淆Activity中參數(shù)是View的方法,因?yàn)橛羞@樣一種用法,在XML中配置android:onClick=”buttonClick”屬性,
 62 #當(dāng)用戶點(diǎn)擊該按鈕時就會調(diào)用Activity中的buttonClick(View view)方法,如果這個方法被混淆的話就找不到了
 63 -keepclassmembers class * extends android.app.Activity{
 64     public void *(android.view.View);
 65 }
 66 #表示不混淆枚舉中的values()和valueOf()方法,枚舉我用的非常少,這個就不評論了
 67 -keepclassmembers enum * {
 68     public static **[] values();
 69     public static ** valueOf(java.lang.String);
 70 }
 71 #表示不混淆任何一個View中的setXxx()和getXxx()方法,
 72 #因?yàn)閷傩詣赢嬓枰邢鄳?yīng)的setter和getter的方法實(shí)現(xiàn),混淆了就無法工作了。
 73 -keep public class * extends android.view.View{
 74     *** get*();
 75     void set*(***);
 76     public <init>(android.content.Context);
 77     public <init>(android.content.Context, android.util.AttributeSet);
 78     public <init>(android.content.Context, android.util.AttributeSet, int);
 79 }
 80 -keepclasseswithmembers class * {
 81     public <init>(android.content.Context, android.util.AttributeSet);
 82     public <init>(android.content.Context, android.util.AttributeSet, int);
 83 }
 84 #表示不混淆Parcelable實(shí)現(xiàn)類中的CREATOR字段,
 85 #毫無疑問,CREATOR字段是絕對不能改變的,包括大小寫都不能變,不然整個Parcelable工作機(jī)制都會失敗。
 86 -keep class * implements android.os.Parcelable {
 87   public static final android.os.Parcelable$Creator *;
 88 }
 89 # 這指定了繼承Serizalizable的類的如下成員不被移除混淆
 90 -keepclassmembers class * implements java.io.Serializable {
 91     static final long serialVersionUID;
 92     private static final java.io.ObjectStreamField[] serialPersistentFields;
 93     private void writeObject(java.io.ObjectOutputStream);
 94     private void readObject(java.io.ObjectInputStream);
 95     java.lang.Object writeReplace();
 96     java.lang.Object readResolve();
 97 }
 98 # 保留R下面的資源
 99 -keep class **.R$* {
100  *;
101 }
102 #不混淆資源類下static的
103 -keepclassmembers class **.R$* {
104     public static <fields>;
105 }
106 # 對于帶有回調(diào)函數(shù)的onXXEvent、**On*Listener的,不能被混淆
107 -keepclassmembers class * {
108     void *(**On*Event);
109     void *(**On*Listener);
110 }
111 # 保留我們自定義控件(繼承自View)不被混淆
112 -keep public class * extends android.view.View{
113     *** get*();
114     void set*(***);
115     public <init>(android.content.Context);
116     public <init>(android.content.Context, android.util.AttributeSet);
117     public <init>(android.content.Context, android.util.AttributeSet, int);
118 }
119 -keep class com.example.odm.garbagesorthelper.widget.** { *; }
120 #
121 #----------------------------- WebView(項(xiàng)目中沒有可以忽略) -----------------------------
122 #
123 #webView需要進(jìn)行特殊處理
124 #在app中與HTML5的JavaScript的交互進(jìn)行特殊處理
125 #我們需要確保這些js要調(diào)用的原生方法不能夠被混淆,于是我們需要做如下處理:
126 #
127 #---------------------------------實(shí)體類---------------------------
128 #--------(實(shí)體Model不能混淆,否則找不到對應(yīng)的屬性獲取不到值)-----
129 #
130 -keep class com.example.odm.garbagesorthelper.model.entity.** { *; }
131 -dontwarn  com.example.odm.garbagesorthelper.model.entity.**
132 #對含有反射類的處理
133 -keep class com.example.odm.garbagesorthelper.utils.** { *; }
134 #
135 # ----------------------------- 其他的 -----------------------------
136 #
137 # 刪除代碼中Log相關(guān)的代碼
138 -assumenosideeffects class android.util.Log {
139     public static boolean isLoggable(java.lang.String, int);
140     public static int v(...);
141     public static int i(...);
142     public static int w(...);
143     public static int d(...);
144     public static int e(...);
145 }
146 # 保持測試相關(guān)的代碼
147 -dontnote junit.framework.**
148 -dontnote junit.runner.**
149 -dontwarn android.test.**
150 -dontwarn android.support.test.**
151 -dontwarn org.junit.**
152 #
153 # ----------------------------- 第三方庫、框架、SDK -----------------------------
154 #logger
155 -dontwarn com.orhanobut.logger.**
156 -keep class com.orhanobut.logger.**{*;}
157 -keep interface com.orhanobut.logger.**{*;}
158 # Gson
159 -keep class com.google.gson.stream.** { *; }
160 -keepattributes EnclosingMethod
161 -dontwarn com.google.gson.**
162 -keep class com.google.gson.**{*;}
163 -keep interface com.google.gson.**{*;}
164 #gson
165 #如果用到Gson解析包的,直接添加下面這幾行就能成功混淆,不然會報(bào)錯。
166 ##---------------Begin: proguard configuration for Gson  ----------
167 # Gson uses generic type information stored in a class file when working with fields. Proguard
168 # removes such information by default, so configure it to keep all of it.
169 -keepattributes Signature
170 # For using GSON @Expose annotation
171 -keepattributes *Annotation*
172 # Gson specific classes
173 -dontwarn sun.misc.**
174 #-keep class com.google.gson.stream.** { *; }
175 # Prevent proguard from stripping interface information from TypeAdapterFactory,
176 # JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
177 -keep class * implements com.google.gson.TypeAdapterFactory
178 -keep class * implements com.google.gson.JsonSerializer
179 -keep class * implements com.google.gson.JsonDeserializer
180 # Application classes that will be serialized/deserialized over Gso
181 # OkHttp3
182 -dontwarn okhttp3.logging.**
183 -keep class okhttp3.internal.**{*;}
184 -dontwarn okio.**
185 # Retrofit
186 -dontwarn retrofit2.**
187 -keep class retrofit2.** { *; }
188 #-keepattributes Signature-keepattributes Exceptions
189 # Platform calls Class.forName on types which do not exist on Android to determine platform.
190 -dontnote retrofit2.Platform
191 # Platform used when running on Java 8 VMs. Will not be used at runtime.
192 -dontwarn retrofit2.Platform$Java8
193 # Retain generic type information for use by reflection by converters and adapters.
194 -keepattributes Signature
195 # Retain declared checked exceptions for use by a Proxy instance.
196 -keepattributes Exceptions
197 # RxJava RxAndroid
198 -dontwarn sun.misc.**
199 -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
200     long producerIndex;
201     long consumerIndex;
202 }
203 -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
204     rx.internal.util.atomic.LinkedQueueNode producerNode;
205 }
206 -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
207     rx.internal.util.atomic.LinkedQueueNode consumerNode;
208 }
209 #LiveEventBus
210 -dontwarn com.jeremyliao.liveeventbus.**
211 -keep class com.jeremyliao.liveeventbus.** { *; }
212 -keep class androidx.lifecycle.** { *; }
213 -keep class androidx.arch.core.** { *; }
214 #glide
215 -keep public class * implements com.bumptech.glide.module.GlideModule
216 -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
217   **[] $VALUES;
218   public *;
219 }
220 #utilcodex
221 -keep class  com.blankj.utilcode.util.** { *; }
222 #
223 -keep class site.gemus.** { *; }
224 #XUI
225 -keep class com.xuexiang.xui.** { *; }
226 #訊飛SDK
227 -libraryjars libs/Msc.jar
228 -libraryjars src/main/jniLibs/Msc.jar
229 -keep class com.iflytek.**{*;}
230 -keepattributes Signature
231 #RxPermission
232 -keep class com.tbruyelle.rxpermissions2.** { *; }
233 #XBanner
234 -keep class com.stx.xhb.androidx.XBanner.** { *; }
235 #Bugly SDK
236 -dontwarn com.tencent.bugly.**
237 -keep public class com.tencent.bugly.**{*;}
238 -keep class android.support.**{*;}

?文章來源地址http://www.zghlxwxcb.cn/news/detail-837637.html

到了這里,關(guān)于android 混淆規(guī)則作用,Android代碼混淆詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • android 混淆

    # 指定代碼的壓縮級別 0 - 7(指定代碼進(jìn)行迭代優(yōu)化的次數(shù),在Android里面默認(rèn)是5,這條指令也只有在可以優(yōu)化時起作用。) -optimizationpasses 5 # 混淆時不會產(chǎn)生形形色色的類名(混淆時不使用大小寫混合類名) -dontusemixedcaseclassnames # 指定不去忽略非公共的庫類(不跳過library中的非

    2024年02月05日
    瀏覽(16)
  • Android 馬甲包 google市場混淆技術(shù)方案

    指定 混淆字典 在app的gralde里配置混淆字典 -obfuscationdictionary dict.txt#外部字典 -classobfuscationdictionary dict.txt #類字典 -packageobfuscationdictionary dict.txt #包字典 dict.txt 文件內(nèi)容類似這樣的: zguqnx mvdmuyh wmws jwomtp nhmhn zvlogo pomcwh bhdnzul osxbj gojb ctvkrg srmar sgkarnqi byghdn tvebtxw uxdhno qmjac pgxa

    2024年02月09日
    瀏覽(24)
  • Python變量:創(chuàng)建、類型、命名規(guī)則和作用域詳解

    變量是用于存儲數(shù)據(jù)值的容器。 創(chuàng)建變量 Python沒有用于聲明變量的命令。 變量在您第一次為其分配值時被創(chuàng)建。 示例 變量不需要聲明為特定類型,并且甚至在設(shè)置后可以更改類型。 示例 如果要指定變量的數(shù)據(jù)類型,可以使用類型轉(zhuǎn)換。 示例 獲取類型 您可以使用type()函數(shù)

    2024年02月08日
    瀏覽(18)
  • ProGuard詳解 - Java代碼混淆

    ProGuard詳解 - Java代碼混淆

    ? ?我們在工程應(yīng)用中經(jīng)常會遇到核心代碼不希望給別人抄襲,但系統(tǒng)是用java開發(fā)的,無法避免被反編譯的情況,這樣可以用代碼混淆的方式來解決。 ? ?調(diào)查了一下主流的第三方混淆工具,發(fā)現(xiàn)只有ProGuard用的最多,而且版本一直在更新維護(hù),功能也比較多,所以打算用

    2023年04月09日
    瀏覽(19)
  • Android NDK開發(fā)詳解之編寫C/C++代碼中的Android SDK 版本屬性)

    本部分將討論如何使用 NDK 提供的庫。 注意:有關(guān)導(dǎo)入預(yù)構(gòu)建庫(未包含在 NDK 中的庫)的指南已移至各個構(gòu)建系統(tǒng)的相關(guān)部分。請根據(jù)您的項(xiàng)目需求參閱 CMake 或 ndk-build 指南。 文中說明了 NDK 提供的 C ++ 運(yùn)行時,并介紹了 NDK 提供的其他庫(例如 OpenGL ES 和 OpenSL ES)以及支持

    2024年02月07日
    瀏覽(41)
  • Unity3D代碼混淆方案詳解

    Unity3D代碼混淆方案詳解

    Unity引擎使用Mono運(yùn)行時,而C#語言易受反編譯影響,存在代碼泄露風(fēng)險。本文通過《QQ樂團(tuán)》項(xiàng)目實(shí)踐,提出一種適用于Unity引擎的代碼混淆方案,以保護(hù)代碼邏輯。 在Unity引擎下,為了防止代碼被輕易反編譯,需要采取相應(yīng)的保護(hù)措施。本文將分享一種基于實(shí)踐經(jīng)驗(yàn)的可行方

    2024年01月18日
    瀏覽(26)
  • 【Android Gradle 插件】Android 依賴管理 ④ ( 常用依賴配置分析 | implementation 依賴作用 | api 依賴作用 | compileOnly 依賴作用 )

    在本篇博客中逐一分析以下依賴配置 : implementation api compileOnly runtimeOnly annotationProcessor lintChecks lintPublish apk ( 已廢棄 ) compile ( 已廢棄 ) provided ( 已廢棄 ) Android 依賴參考文檔 : https://developer.android.google.cn/studio/build/dependencies compile 依賴作用: 編譯打包 : 為 自己的項(xiàng)目模塊 添加依

    2024年02月02日
    瀏覽(25)
  • Android attachBaseContext作用

    在 Android 應(yīng)用程序中, attachBaseContext() 方法是一個回調(diào)方法,它在 onCreate() 方法之前被調(diào)用,其作用是向應(yīng)用程序的 Context 對象中添加或修改一些信息。通常,開發(fā)人員會在這個方法中執(zhí)行一些初始化操作,如創(chuàng)建全局對象、設(shè)置默認(rèn)語言等。 具體來說, attachBaseContext() 方法

    2024年02月08日
    瀏覽(25)
  • 【Android進(jìn)階篇】Android中PreferenceScreen的作用和詳細(xì)用法介紹

    【Android進(jìn)階篇】Android中PreferenceScreen的作用和詳細(xì)用法介紹

    1, PreferenceScreen的作用 在Android開發(fā)中,PreferenceScreen是一個非常重要的布局控件,主要用于創(chuàng)建設(shè)置界面(settings page)。它可以包含多個Preference子項(xiàng),如CheckBoxPreference, ListPreference等,用于設(shè)置應(yīng)用程序的各種選項(xiàng)。 以下是一些關(guān)于PreferenceScreen的詳細(xì)使用說明: 1, 創(chuàng)建設(shè)

    2024年02月21日
    瀏覽(42)
  • 混淆矩陣含義及作用

    混淆矩陣含義及作用

    在機(jī)器學(xué)習(xí)領(lǐng)域, 混淆矩陣(Confusion?Matrix) ,又稱為可能性矩陣或錯誤矩陣。混淆矩陣是可視化工具,特別用于監(jiān)督學(xué)習(xí),在 無監(jiān)督學(xué)習(xí) 一般叫做 匹配矩陣 。在圖像精度評價中,主要用于比較分類結(jié)果和實(shí)際測得值,可以把分類結(jié)果的精度顯示在一個混淆矩陣?yán)锩?混淆

    2024年02月05日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包