最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

1、簡介

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

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

2、如何開啟混淆

通常我們需要找到項目路徑下app目錄下的build.gradle文件,找到minifyEnabled這個配置,然后設(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是一個集文件壓縮,優(yōu)化,混淆和校驗等功能的工具
  • 檢測并刪除無用的類,變量,方法和屬性
  • 優(yōu)化字節(jié)碼并刪除無用的指令
  • 通過將類名,變量名和方法名重命名為無意義的名稱實現(xiàn)混淆效果
  • 還校驗處理后的代碼

4、常見語句

-optimizationpasses 5

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

-dontusemixedcaseclassnames

混淆后類名都小寫

-dontskipnonpubliclibraryclasses

不去忽略非公共的庫的類

-dontskipnonpubliclibraryclassmembers

不去忽略非公共的庫的類的成員

-dontpreverify

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

-verbose
-printmapping proguardMapping.txt

生成原類名和混淆后的類名的映射文件

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

指定混淆時采用的算法

-keepattributes *Annotation*,InnerClasses

注解不混淆

-keepattributes Signature

泛型不混淆

-keepattributes SourceFile,LineNumberTable

拋出異常時保留代碼行號

用的最多的指令

-keep class XXXX

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

-keepclasseswithmembers class XXXX

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

5、哪些不混淆

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

6、混淆文件編寫

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

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

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

#-------------------------------------------定制化區(qū)域----------------------------------------------
#---------------------------------1.實體類---------------------------------


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

 

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

 

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

 

#-------------------------------------------基本不用動區(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);
}
#------------------------------------------------------------------------------------

實體類:

-keep class 你的實體類所在的包.* { ; }

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

如果實體類都在同一一個包下,就和上面一樣,很簡單;如果實體類分布在各個包下,不好意思,挨個添加。

第三方包

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

如果是添的jar包的話,就像如下來寫

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

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

與JS交互相關(guān)

如果沒有可跳過

-keep class 你的類所在的包.** { *; }

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

-keepclasseswithmembers class 你的類所在的包.父類$子類 { <methods>; }

反射相關(guān)

沒有可跳過

-keep class 你的類所在的包.** { *; }

ok,這樣就可以了,其實混淆很簡單!

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

相關(guān)文章

  • Android手機(jī)保持屏幕高亮方法

    Android手機(jī)保持屏幕高亮方法

    這篇文章主要介紹了Android手機(jī)保持屏幕高亮方法,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-06-06
  • Android仿微信朋友圈點(diǎn)擊加號添加圖片功能

    Android仿微信朋友圈點(diǎn)擊加號添加圖片功能

    這篇文章主要為大家詳細(xì)介紹了Android仿微信朋友圈點(diǎn)擊加號添加圖片功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Android登錄注冊功能 數(shù)據(jù)庫SQLite驗證

    Android登錄注冊功能 數(shù)據(jù)庫SQLite驗證

    這篇文章主要為大家詳細(xì)介紹了Android登錄注冊功能,數(shù)據(jù)庫SQLite驗證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Android中AlertDialog用法實例分析

    Android中AlertDialog用法實例分析

    這篇文章主要介紹了Android中AlertDialog用法,結(jié)合實例形式簡單分析了AlertDialog的基本調(diào)用與功能實現(xiàn)技巧,需要的朋友可以參考下
    2016-01-01
  • Android實現(xiàn)把文件存放在SDCard的方法

    Android實現(xiàn)把文件存放在SDCard的方法

    這篇文章主要介紹了Android實現(xiàn)把文件存放在SDCard的方法,涉及Android針對SDCard的讀寫技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 如何安裝adb工具及常用的adb命令

    如何安裝adb工具及常用的adb命令

    ADB全稱為Android Debug Bridge,起到調(diào)試橋的作用,是一個客戶端-服務(wù)器端程序,ADB 也是 Android SDK 中的一個工具,可以直接操作管理 Android 模擬器或者真實的 Android 設(shè)備,本文介紹如何安裝adb工具及常用的adb命令,感興趣的朋友一起看看吧
    2024-01-01
  • Android自定義ViewGroup實現(xiàn)九宮格布局

    Android自定義ViewGroup實現(xiàn)九宮格布局

    這篇文章主要為大家詳細(xì)介紹了Android如何通過自定義ViewGroup實現(xiàn)九宮格布局,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • Android圖片處理工具類BitmapUtils

    Android圖片處理工具類BitmapUtils

    這篇文章主要為大家詳細(xì)介紹了Android圖片的處理工具類BitmapUtils,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android中的Bitmap序列化失敗的解決方法

    Android中的Bitmap序列化失敗的解決方法

    這篇文章主要介紹了Android中的Bitmap序列化失敗的解決方法,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • Android實現(xiàn)百度地圖兩點(diǎn)畫弧線

    Android實現(xiàn)百度地圖兩點(diǎn)畫弧線

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)百度地圖兩點(diǎn)畫弧線,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論

长乐市| 区。| 林甸县| 噶尔县| 定陶县| 印江| 剑川县| 六盘水市| 承德县| 洛隆县| 新邵县| 南丰县| 房产| 西林县| 武陟县| 全椒县| 缙云县| 叶城县| 舟山市| 武山县| 宣恩县| 桓仁| 桐城市| 阳江市| 曲靖市| 商丘市| 黑水县| 蒲城县| 文化| 鄯善县| 和硕县| 合川市| 惠来县| 呼玛县| 新邵县| 建瓯市| 石台县| 海林市| 景泰县| 西昌市| 广德县|