亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android 實(shí)現(xiàn)代碼混淆的實(shí)例

 更新時(shí)間:2017年09月21日 14:50:17   投稿:lqh  
這篇文章主要介紹了Android 實(shí)現(xiàn)代碼混淆的實(shí)例的相關(guān)資料,希望通過(guò)本文大家能夠掌握Android代碼混淆的實(shí)現(xiàn)方法,需要的朋友可以參考下

Android 實(shí)現(xiàn)代碼混淆的實(shí)例

1、簡(jiǎn)介

代碼混淆(Obfuscated code)亦稱花指令,是將計(jì)算機(jī)程序的代碼,轉(zhuǎn)換成一種功能上等價(jià),但是難于閱讀和理解的形式的行為。

混淆的目的是為了加大反編譯的成本,但是并不能徹底防止反編譯。

2、如何開(kāi)啟混淆

通常我們需要找到項(xiàng)目路徑下app目錄下的build.gradle文件,找到minifyEnabled這個(gè)配置,然后設(shè)置為true即可,如下:

release {
  minifyEnabled true
  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

3、proguard又是什么呢

這是java官網(wǎng)給出的定義:

ProGuard is a free Java Class file shrinker, optimizer, obfuscator, 
and preverifier. It detects and removes unused classes, fields, methods,
 and attributes. It optimizes bytecode and removes unused instructions. 
It renames the remaining classes, fields, and methods using short meaningless names. 
Finally, it preverifies the processed code for Java 6 or higher, or for Java Micro Edition.

作用:

  • proguard是一個(gè)集文件壓縮,優(yōu)化,混淆和校驗(yàn)等功能的工具
  • 檢測(cè)并刪除無(wú)用的類(lèi),變量,方法和屬性
  • 優(yōu)化字節(jié)碼并刪除無(wú)用的指令
  • 通過(guò)將類(lèi)名,變量名和方法名重命名為無(wú)意義的名稱實(shí)現(xiàn)混淆效果
  • 還校驗(yàn)處理后的代碼

4、常見(jiàn)語(yǔ)句

-optimizationpasses 5

代碼混淆壓縮筆記,在0~7之間

-dontusemixedcaseclassnames

混淆后類(lèi)名都小寫(xiě)

-dontskipnonpubliclibraryclasses

不去忽略非公共的庫(kù)的類(lèi)

-dontskipnonpubliclibraryclassmembers

不去忽略非公共的庫(kù)的類(lèi)的成員

-dontpreverify

不做預(yù)校驗(yàn)的操作

-verbose
-printmapping proguardMapping.txt

生成原類(lèi)名和混淆后的類(lèi)名的映射文件

-optimizations !code/simplification/cast,!field/*,!class/merging/*

指定混淆時(shí)采用的算法

-keepattributes *Annotation*,InnerClasses

注解不混淆

-keepattributes Signature

泛型不混淆

-keepattributes SourceFile,LineNumberTable

拋出異常時(shí)保留代碼行號(hào)

用的最多的指令

-keep class XXXX

保留類(lèi)名不變,也就是類(lèi)名不混淆,而類(lèi)中的成員名不保證。當(dāng)然也可以是繼承XXX類(lèi)的所有類(lèi)名不混淆

-keepclasseswithmembers class XXXX

保留類(lèi)名和成員名,當(dāng)然也可以是類(lèi)中特定方法

5、哪些不混淆

  • 反射中使用的元素
  • 與網(wǎng)絡(luò)請(qǐng)求相關(guān)實(shí)體類(lèi)
  • 使用注解的元素
  • 四大組件
  • WebView中與JS交互的類(lèi)
  • 枚舉 等

6、混淆文件編寫(xiě)

按照以上的規(guī)則和基本語(yǔ)句,我們將混淆文件分為兩個(gè)區(qū)域:

定制化區(qū)域:分為實(shí)體類(lèi)、第三方、js相關(guān)、反射相關(guān),應(yīng)按項(xiàng)目真實(shí)情況進(jìn)行編寫(xiě),具體會(huì)在稍后提到;

基本不動(dòng)區(qū)直接復(fù)制即可。

#-------------------------------------------定制化區(qū)域----------------------------------------------
#---------------------------------1.實(shí)體類(lèi)---------------------------------


#---------------------------------2.第三方包-------------------------------

 

#---------------------------------3.與js互相調(diào)用的類(lèi)------------------------

 

#---------------------------------4.反射相關(guān)的類(lèi)和方法-----------------------

 

#-------------------------------------------基本不用動(dòng)區(qū)域--------------------------------------------
#---------------------------------基本指令區(qū)----------------------------------
-optimizationpasses 5
-dontskipnonpubliclibraryclassmembers
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------

#---------------------------------默認(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.** {*;}

-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);
}
-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);
}

#---------------------------------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);
}
#------------------------------------------------------------------------------------

實(shí)體類(lèi):

-keep class 你的實(shí)體類(lèi)所在的包.* { ; }

實(shí)體類(lèi)由于涉及到與服務(wù)端的交互,各種gson的交互如此等等,是要保留的。將你項(xiàng)目中實(shí)體類(lèi)都挑出來(lái),用以上語(yǔ)法進(jìn)行保留。

如果實(shí)體類(lèi)都在同一一個(gè)包下,就和上面一樣,很簡(jiǎn)單;如果實(shí)體類(lèi)分布在各個(gè)包下,不好意思,挨個(gè)添加。

第三方包

需到項(xiàng)目的build.gradle文件中找到所有添的依賴,然后去官網(wǎng)或者github找到對(duì)應(yīng)的混淆代碼,添加到我們自己的混淆文件中。

如果是添的jar包的話,就像如下來(lái)寫(xiě)

#log4j
-libraryjars log4j-1.2.17.jar
-dontwarn org.apache.log4j.**
-keep class org.apache.log4j.** { *;}

大致意思就是不混淆,不報(bào)warn。如果gradle報(bào)錯(cuò)的話,可以考慮注釋掉-libraryjars log4j-1.2.17.jar這句。

與JS交互相關(guān)

如果沒(méi)有可跳過(guò)

-keep class 你的類(lèi)所在的包.** { *; }

如果是內(nèi)部類(lèi)的話這樣寫(xiě):

-keepclasseswithmembers class 你的類(lèi)所在的包.父類(lèi)$子類(lèi) { <methods>; }

反射相關(guān)

沒(méi)有可跳過(guò)

-keep class 你的類(lèi)所在的包.** { *; }

ok,這樣就可以了,其實(shí)混淆很簡(jiǎn)單!

 如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • 仿墨跡天氣在Android App中實(shí)現(xiàn)自定義zip皮膚更換

    仿墨跡天氣在Android App中實(shí)現(xiàn)自定義zip皮膚更換

    這篇文章主要介紹了仿墨跡天氣在Android App中實(shí)現(xiàn)自定義zip皮膚更換的方法,即讓用戶可以自行通過(guò)自制或者下載的zip皮膚包進(jìn)行換膚,需要的朋友可以參考下
    2016-02-02
  • 詳解Android Dialog對(duì)話框的五種形式

    詳解Android Dialog對(duì)話框的五種形式

    這篇文章主要為大家詳細(xì)介紹了Android對(duì)話框的五種形式,一般對(duì)話框,列表對(duì)話框,單選按鈕對(duì)話框,多選按鈕對(duì)話框,自定義對(duì)話框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • PopupWindow自定義位置顯示的實(shí)現(xiàn)代碼

    PopupWindow自定義位置顯示的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了PopupWindow自定義位置顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Android Location服務(wù)之LocationManager案例詳解

    Android Location服務(wù)之LocationManager案例詳解

    這篇文章主要介紹了Android Location服務(wù)之LocationManager案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Android項(xiàng)目中實(shí)體類(lèi)entity的作用詳解

    Android項(xiàng)目中實(shí)體類(lèi)entity的作用詳解

    這篇文章主要介紹了Android項(xiàng)目中實(shí)體類(lèi)entity的作用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Android使用TransitionDrawable漸變切換多張圖片

    Android使用TransitionDrawable漸變切換多張圖片

    這篇文章主要為大家詳細(xì)介紹了Android使用TransitionDrawable漸變切換多張圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 最新評(píng)論