1. 程式人生 > >Android混淆——混淆程式碼總結

Android混淆——混淆程式碼總結

混淆的概念:

對編譯好的class檔案進行混淆處理。

ProGuard是一個混淆程式碼的開源專案。它的主要作用就是混淆,當然它還能對位元組碼進行縮減體積、優化等

混淆的原理

Java 是一種跨平臺的、解釋型語言,Java 原始碼編譯成中間”位元組碼”儲存於 class 檔案中。由於跨平臺的需要,Java 位元組碼中包括了很多原始碼資訊,如變數名、方法名,並且通過這些名稱來訪問變數和方法,這些符號帶有許多語義資訊,很容易被反編譯成 Java 原始碼。為了防止這種現象,我們可以使用 Java 混淆器對 Java 位元組碼進行混淆。

混淆就是對釋出出去的程式進行重新組織和處理,使得處理後的程式碼與處理前程式碼完成相同的功能,而混淆後的程式碼很難被反編譯,即使反編譯成功也很難得出程式的真正語義。被混淆過的程式程式碼,仍然遵照原來的檔案格式和指令集,執行結果也與混淆前一樣,只是混淆器將程式碼中的所有變數、函式、類的名稱變為簡短的英文字母代號,在缺乏相應的函式名和程式註釋的況下,即使被反編譯,也將難以

閱讀。同時混淆是不可逆的,在混淆的過程中一些不影響正常執行的資訊將永久丟失,這些資訊的丟失使程式變得更加難以理解。

混淆器的作用不僅僅是保護程式碼,它也有精簡編譯後程序大小的作用。由於以上介紹的縮短變數和函式名以及丟失部分資訊的原因, 編譯後 jar 檔案體積大約能減少25% ,這對當前費用較貴的無線網路傳輸是有一定意義的。

混淆的語法:
<span style="font-size:12px;">
    -include {filename}    從給定的檔案中讀取配置引數   
    -basedirectory {directoryname}    指定基礎目錄為以後相對的檔案名稱   
    -injars {class_path}    指定要處理的應用程式jar,war,ear和目錄   
    -outjars {class_path}    指定處理完後要輸出的jar,war,ear和目錄的名稱   
    -libraryjars {classpath}    指定要處理的應用程式jar,war,ear和目錄所需要的程式庫檔案   
    -dontskipnonpubliclibraryclasses    指定不去忽略非公共的庫類。   
    -dontskipnonpubliclibraryclassmembers    指定不去忽略包可見的庫類的成員。  
       
    保留選項   
    -keep {Modifier} {class_specification}    保護指定的類檔案和類的成員   
    -keepclassmembers {modifier} {class_specification}    保護指定類的成員,如果此類受到保護他們會保護的更好  
    -keepclasseswithmembers {class_specification}    保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。   
    -keepnames {class_specification}    保護指定的類和類的成員的名稱(如果他們不會壓縮步驟中刪除)   
    -keepclassmembernames {class_specification}    保護指定的類的成員的名稱(如果他們不會壓縮步驟中刪除)   
    -keepclasseswithmembernames {class_specification}    保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)   
    -printseeds {filename}    列出類和類的成員-keep選項的清單,標準輸出到給定的檔案 </span><strong>  
       
    </strong>壓縮   
    -dontshrink    不壓縮輸入的類檔案   
    -printusage {filename}   
    -dontwarn   如果有警告也不終止  
    -whyareyoukeeping {class_specification}       
       
    優化   
    -dontoptimize    不優化輸入的類檔案   
    -assumenosideeffects {class_specification}    優化時假設指定的方法,沒有任何副作用   
    -allowaccessmodification    優化時允許訪問並修改有修飾符的類和類的成員   
       
    混淆   
    -dontobfuscate    不混淆輸入的類檔案   
    -printmapping {filename}   
    -applymapping {filename}    重用對映增加混淆   
    -obfuscationdictionary {filename}    使用給定檔案中的關鍵字作為要混淆方法的名稱   
    -overloadaggressively    混淆時應用侵入式過載   
    -useuniqueclassmembernames    確定統一的混淆類的成員名稱來增加混淆   
    -flattenpackagehierarchy {package_name}    重新包裝所有重新命名的包並放在給定的單一包中   
    -repackageclass {package_name}    重新包裝所有重新命名的類檔案中放在給定的單一包中   
    -dontusemixedcaseclassnames    混淆時不會產生形形色色的類名   
    -keepattributes {attribute_name,...}    保護給定的可選屬性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and   
       
    InnerClasses.   
    -renamesourcefileattribute {string}    設定原始檔中給定的字串常量  


混淆的步驟

1. 新建一個工程會看到專案下邊有這樣proguard-project.txt一個檔案,這個對混淆程式碼很重要,不小心刪掉了可以從其他地方拷貝一個過來

2.在proguard-project.txt新增混淆的申明:

    a. 把所有你的jar包都申明進來,例如:

  -libraryjars libs/apns_1.0.6.jar
  -libraryjars libs/armeabi/libBaiduMapSDK_v2_3_1.so
  -libraryjars libs/armeabi/liblocSDK4.so
  -libraryjars libs/baidumapapi_v2_3_1.jar

  b. 將你不需要混淆的部分申明進來,因為有些類經過混淆會導致程式編譯不通過,如下:

  
   -keep public class * extends android.app.Fragment  
   -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.support.v4.**
   -keep public class com.android.vending.licensing.ILicensingService

--以上都是API裡邊的類,最好都要避免混淆

  c.保證native方法不被混淆

-keepclasseswithmembernames class * {  
    native <methods>;  
}  
d.保證制定規則的方法不混淆
-keepclassmembers class * extends android.app.Activity {   
    public void *(android.view.View); #保持指定規則的方法不被混淆(Android layout 佈局檔案中為控制元件配置的onClick方法不能混淆)  
}


e.保證自定義的控制元件類不混淆

<pre name="code" class="java">-keepclasseswithmembers class * {  
    public <init>(android.content.Context, android.util.AttributeSet);  #保持自定義控制元件類不被混淆,指定格式的構造方法不去混淆  
}  
  -keepclasseswithmembers class * {  
    public <init>(android.content.Context, android.util.AttributeSet, int);  
}
-keepclasseswithmembers class * {  
    public <init>(android.content.Context);  
}
-keepclasseswithmembers class * {  
    public <init>();  
}
f.保證自定義控制元件類指定規則的方法不被混淆
-keep public class * extends android.view.View {  #保持自定義控制元件指定規則的方法不被混淆  
    public <init>(android.content.Context);  
    public <init>(android.content.Context, android.util.AttributeSet);  
    public <init>(android.content.Context, android.util.AttributeSet, int);  
    public void set*(...);  
} 

g.保證列舉類不混淆
-keepclassmembers enum * {  #保持列舉 enum 不被混淆  
    public static **[] values();  
    public static ** valueOf(java.lang.String);  
} 

h.保持 Parcelable 不被混淆(aidl檔案不能去混淆)
-keep class * implements android.os.Parcelable {  #保持 Parcelable 不被混淆(aidl檔案不能去混淆)  
    public static final android.os.Parcelable$Creator *;  
}  
i.需要序列化和反序列化的類不能被混淆(注:Java反射用到的類也不能被混淆)
-keepnames class * implements java.io.Serializable 


j.保護實現介面Serializable的類中,指定規則的類成員不被混淆
-keepclassmembers class * implements java.io.Serializable { #保護實現介面Serializable的類中,指定規則的類成員不被混淆  
    static final long serialVersionUID;  
    private static final java.io.ObjectStreamField[] serialPersistentFields;  
    !static !transient <fields>;  
    private void writeObject(java.io.ObjectOutputStream);  
    private void readObject(java.io.ObjectInputStream);  
    java.lang.Object writeReplace();  
    java.lang.Object readResolve();  
}  
k.過濾泛型(不寫可能會出現型別轉換錯誤,一般情況把這個加上就是了)
-keepattributes Signature  #過濾泛型(不寫可能會出現型別轉換錯誤,一般情況把這個加上就是了) 

l.假如專案中有用到註解,應加入這行配置
keepattributes *Annotation*

m.保持R檔案不被混淆,否則,你的反射是獲取不到資源id的 

-keep class **.R$* { *; }  #保持R檔案不被混淆,否則,你的反射是獲取不到資源id的


下面都是專案中引入的第三方 jar 包。第三方 jar 包中的程式碼不是我們的目標和關心的物件,故而對此我們全部忽略不進行混淆。

-libraryjars  libs/android-support-v4.jar  
-dontwarn android.support.v4.**  
-keep class android.support.v4.** { *; }    
-keep interface android.support.v4.** { *; }  
-keep public class * extends android.support.v4.**   
-keep public class * extends android.app.Fragment  
  
-libraryjars libs/gson-2.3.1-sources.jar  
-libraryjars libs/gson-2.3.1.jar  
-dontwarn com.google.gson.**      
-keep class sun.misc.Unsafe { *; }  
-keep class com.google.gson.** { *; }  
  
-libraryjars libs/alipaySDK-20150602.jar  
-dontwarn com.alipay.**      
-dontwarn com.ta.utdid2.**      
-dontwarn com.ut.device.**      
-keep class com.alipay.** { *; }  
-keep class com.ta.utdid2.** { *; }  
-keep class com.ut.device.** { *; }  
  
-libraryjars libs/android-async-http-1.4.6.jar  
-dontwarn com.loopj.android.http.**  
-keep class com.loopj.android.http.** { *; }  
  
-libraryjars libs/baidumapapi_v2_4_1.jar  
-dontwarn com.baidu.**  
-keep class com.baidu.** {*; }  
-keep class assets.** {*; }  
-keep class vi.com.gdi.bgl.** {*; }  
  
-libraryjars libs/libammsdk.jar  
-dontwarn com.tencent.**  
-keep class com.tencent.** { *; }  
  
-libraryjars libs/locSDK_4.1.jar  
-dontwarn com.baidu.location.**  
-keep class com.baidu.location.** { *; }  
  
-libraryjars libs/mframework.jar  
-dontwarn m.framework.**  
-keep class m.framework.** { *; }  
  
-libraryjars libs/mta-sdk-1.6.2.jar  
-dontwarn com.tencent.stat.**  
-keep class com.tencent.stat.** { *; }  
  
-libraryjars libs/nineoldandroids-library-2.4.0.jar  
-dontwarn com.nineoldandroids.**  
-keep class com.nineoldandroids.** { *; }  
  
-libraryjars libs/open_sdk_r4889.jar  
-dontwarn com.tencent.**  
-keep class com.tencent.** { *; }   
  
-libraryjars libs/ShareSDK-Core-2.5.9.jar  
-dontwarn cn.sharesdk.framework.**  
-keep class cn.sharesdk.framework.** { *; }   
  
-libraryjars libs/ShareSDK-ShortMessage-2.5.9.jar  
-dontwarn cn.sharesdk.system.text.**  
-keep class cn.sharesdk.system.text.** { *; }   
  
-libraryjars libs/ShareSDK-SinaWeibo-2.5.9.jar  
-dontwarn cn.sharesdk.sina.weibo.**  
-keep class cn.sharesdk.sina.weibo.** { *; }   
  
-libraryjars libs/ShareSDK-Wechat-2.5.9.jar  
-dontwarn cn.sharesdk.wechat.friends.**  
-keep class cn.sharesdk.wechat.friends.** { *; }   
  
-libraryjars libs/ShareSDK-Wechat-Core-2.5.9.jar  
-dontwarn cn.sharesdk.wechat.utils.**  
-keep class cn.sharesdk.wechat.utils.** { *; }   
  
-libraryjars libs/ShareSDK-Wechat-Favorite-2.5.9.jar  
-dontwarn cn.sharesdk.wechat.favorite.**  
-keep class cn.sharesdk.wechat.favorite.** { *; }   
  
-libraryjars libs/ShareSDK-Wechat-Moments-2.5.9.jar  
-dontwarn cn.sharesdk.wechat.moments.**  
-keep class cn.sharesdk.wechat.moments.** { *; }   
  
-libraryjars libs/universal-image-loader-1.9.2-SNAPSHOT-with-sources.jar  
-dontwarn com.nostra13.universalimageloader.**  
-keep class com.nostra13.universalimageloader.** { *; }   
  
-libraryjars libs/weibosdkcore.jar  
-dontwarn com.sina.weibo.sdk.**  
-keep class com.sina.weibo.sdk.** { *; }  

有些很特殊的,例如百度地圖,你需要新增以下申明:

-keep class com.baidu.** { *; }
-keep class vi.com.gdi.bgl.android.**{*;}

友盟的混淆規則

-keep class com.umeng.** { *; }    
-keep class com.umeng.analytics.** { *; }    
-keep class com.umeng.common.** { *; }    
-keep class com.umeng.newxp.** { *; }    
com.j256.ormlite混淆規則
-keep public class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper  
-keep public class * extends com.j256.ormlite.android.apptools.OpenHelperManager  

-keep class com.j256.ormlite.** { *; }    
-keep class com.j256.ormlite.android.** { *; }    
-keep class com.j256.ormlite.field.** { *; }    
-keep class com.j256.ormlite.stmt.** { *; }  

eventbus混淆規則

-dontwarn de.greenrobot.event.**
-keep class de.greenrobot.event.** { *; }
-keepclassmembers class ** {
	public void onEvent(**);
	void onEvent*(**);
}




相關推薦

Android 混淆程式碼總結Android APK反編譯(最新更新)

http://blog.csdn.net/vipzjyno1/article/details/21039349/ http://blog.csdn.net/vipzjyno1/article/details/21039349/  反編譯 在學習Android開發的過程你

Android混淆——混淆程式碼總結

混淆的概念: 對編譯好的class檔案進行混淆處理。 ProGuard是一個混淆程式碼的開源專案。它的主要作用就是混淆,當然它還能對位元組碼進行縮減體積、優化等 混淆的原理 Java 是一種跨平臺的、解釋型語言,Java 原始碼編譯成中間”位元組碼”儲存於 cl

Android 混淆程式碼總結

為了防止自己的勞動成果被別人竊取,混淆程式碼能有效防止被反編譯,下面來總結以下混淆程式碼的步驟: 1. 大家也許都注意到新建一個工程會看到專案下邊有這樣proguard-project.txt一個檔案,這個對混淆程式碼很重要,如果你不小心刪掉了,沒關係,從其他

Android混淆配置及總結

Android打正式的release包混淆是必備的,避免APP被反編譯,使專案中隱祕的技術或資訊被別人檢視。 Android studio則寫在proguard-rules.pro中,當然寫在proguard-android.txt中也可以。   gradle配置 buildTypes

Android常用混淆程式碼集合(不斷更新中...)

Glide圖片載入框架混淆 # glide 的混淆程式碼 -keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.r

安全程式設計之Android APK打包程式碼混淆

第一步:在專案工程目錄下的proguard-rules.pro檔案中配置自定義的混淆規則 #注意: #1.引用外部的jar包 如果不是自己寫的最好不混淆它們,因為外部jar包有可能已經混淆過 #2.不要混淆XML佈局中使用的自定義控制元件類,混淆後加載佈局會報找不到該控制

混淆程式碼總結

混淆程式碼網址很棒的網址: 配置Android sdk: 把sdk目錄下的platform-tools和tools路徑配置到path中,用分號間隔 cmd輸入adb或者是android -h說明配置成功 反編譯: 1.apk重新命名為zip,複製classes

Android開發之程式碼混淆

應用混淆(ProGuard) ProGuard是一個免費的JAVA類檔案壓縮,優化,混淆器。 它探測並刪除沒有使用的類,欄位,方法和屬性,它刪除沒有用的說明並使用位元組碼得到最大優化,它使用無意義的名字重新命名類,欄位和方法。 我們先來介紹下ProGuard 我們為啥要使用ProGu

android 2.2 程式碼混淆

 2.3以上版本:AndroidSDK自帶proguard混淆 在Android SDK中自帶有proguard程式碼混淆器,但在預設的情況下該混淆器是沒有開啟的。該混淆器在SDK中的路徑是android-sdk-windows\tools\proguard 啟

Android輕鬆實現程式碼混淆

1、簡介 程式碼混淆(Obfuscated code)亦稱花指令,是將計算機程式的程式碼,轉換成一種功能上等價,但是難於閱讀和理解的形式的行為。 混淆的目的是為了加大反編譯的成本,但是並不能徹底防止反編譯。 2、如何開啟混淆 通常我們需要找到

android學習之程式碼混淆小結

之前一直沒有對程式碼混淆有一個很明確的認識,今天重新對程式碼混淆做了一番瞭解,並記錄一下在Androidstudio上是如何做程式碼混淆的。 第一步: buildTypes { release { minifyEnabled true prog

Android高階混淆程式碼保護技術

本文有兩部分內容,一部分講混淆,一部分介紹一些混淆之下的安全手段。基準原則都是:在保證不麻煩到自身 以及 能夠正常閱讀異常日誌的前提下,儘可能提高混淆強度和保護程式碼安全。本文原文地址:http://drakeet.me/android-advanced-proguard-a

Android 專案的程式碼混淆Android proguard 使用說明

簡介Java程式碼是非常容易反編譯的。為了很好的保護Java原始碼,我們往往會對編譯好的class檔案進行混淆處理。ProGuard是一個混淆程式碼的開源專案。它的主要作用就是混淆,當然它還能對位元組碼進行縮減體積、優化等,但那些對於我們來說都算是次要的功能。官網地址:htt

Android 中的程式碼混淆

在Android開發工作中,我們都或多或少接觸過程式碼混淆。比如我們想要整合某個SDK,往往需要做一些排除混淆的操作。 本文為本人的一些實踐總結,介紹一些混淆的知識和注意事項。希望可以幫助大家更好的學習和使用程式碼混淆。 什麼是混淆 關於混淆維基百科上該詞條的解釋為 程式碼混淆(Obfuscat

Android解決混淆打包之後註解被去掉的問題

一、實驗環境(藍色粗體字為特別注意內容) 1,環境:Eclipse+ADT 2,參考文獻: ①https://blog.csdn.net/yhtppp/article/details/44059519?utm_source=blogxgwz0②http://liucanwen.iteye

解決Android簽名混淆後WebView與JS互動失效的問題

最近做了個網頁端微信支付的小功能,測試版還好好的,混淆打包後,寫的方法webview無法呼叫,意識到混淆除了問題,於是在網上找了一些大神的解決方案,再根據自己的實際解決過程,列出來一個完整的解決方法。 Android4.2以上版本呼叫js介面需要在方法使用宣告@JavascriptInterfa

使用VS2013自帶的PreEmptive Dotfuscator and Analytis來混淆C#程式碼

1. 使用VS2013編譯你要打包的程式,會在資料夾中的 ..\bin\Release中 2. 點選VS2013中的TOOLS -> PreEmptive Dotfuscator and Analytics :                   開啟的介面如

android studio 混淆使用,測試百分百可用

轉載請申明 http://blog.csdn.net/wuqilianga/article/details/77533599 在主app中開啟混淆,一般情況下release開啟就行了,這個壓縮和混淆開啟影響速度 buildTypes { release

美團Android資源混淆保護實踐

前言 Android應用中的APK安全性一直遭人詬病,市面上充斥著各種被破解或者漢化的應用,破解者可以非常簡單的通過破解工具就能對一個APK進行反編譯、破解、漢化等等,這樣就可以修改原有程式碼的邏輯、新增新程式碼、新增或修改資源、或者更有甚者植入病毒等等,從而破壞原有A

微信Android資源混淆打包工具,如何讓應用安裝包立減1M

微信中的資源混淆工具主要為了混淆資源ID長度(例如將res/drawable/welcome.png混淆為r/s/a.png),同時利用7z深度壓縮,大大減少了安裝包體積,同時也增加了逼格,提升了反破解難度。本文主要是對此做一個簡單分析。 寫在前言 資源混淆工具大