Android如何實現(xiàn)代碼混淆-創(chuàng)新互聯(lián)

小編給大家分享一下Android如何實現(xiàn)代碼混淆,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設計、做網(wǎng)站與策劃設計,永平網(wǎng)站建設哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設十年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:永平等地區(qū)。永平做網(wǎng)站價格咨詢:13518219792

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

1、簡介

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

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

2、如何開啟混淆

通常我們需要找到項目路徑下app目錄下的build.gradle文件,找到minifyEnabled這個配置,然后設置為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

不做預校驗的操作

-verbose
-printmapping proguardMapping.txt

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

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

指定混淆時采用的算法

-keepattributes *Annotation*,InnerClasses

注解不混淆

-keepattributes Signature

泛型不混淆

-keepattributes SourceFile,LineNumberTable

拋出異常時保留代碼行號

用的最多的指令

-keep class XXXX

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

-keepclasseswithmembers class XXXX

保留類名和成員名,當然也可以是類中特定方法

5、哪些不混淆

  • 反射中使用的元素

  • 與網(wǎng)絡請求相關實體類

  • 使用注解的元素

  • 四大組件

  • WebView中與JS交互的類

  • 枚舉 等

6、混淆文件編寫

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

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

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

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


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

 

#---------------------------------3.與js互相調用的類------------------------

 

#---------------------------------4.反射相關的類和方法-----------------------

 

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

#---------------------------------默認保留區(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 你的實體類所在的包.* { ; }

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

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

第三方包

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

如果是添的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交互相關

如果沒有可跳過

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

如果是內部類的話這樣寫:

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

反射相關

沒有可跳過

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

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

Android是什么

Android是一種基于Linux內核的自由及開放源代碼的操作系統(tǒng),主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯(lián)盟領導及開發(fā)。

以上是“Android如何實現(xiàn)代碼混淆”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章標題:Android如何實現(xiàn)代碼混淆-創(chuàng)新互聯(lián)
標題鏈接:http://muchs.cn/article4/dhgiie.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、全網(wǎng)營銷推廣云服務器、微信小程序、靜態(tài)網(wǎng)站網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設