Android Java混淆(ProGuard)

來源:互聯網
上載者:User

ProGuard簡介
       ProGuard是一個SourceForge上非常知名的開源項目。官網網址是:http://proguard.sourceforge.net/。

       Java的位元組碼一般是非常容易反編譯的。為了很好的保護Java原始碼,我們往往會對編譯好的class檔案進行混淆處理。ProGuard的主要作用就是混淆。當然它還能對位元組碼進行縮減體積、最佳化等,但那些對於我們來說都算是次要的功能。

       引用ProGuard官方的一段話來介紹就是:

       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 for Java Micro Edition.


Android Eclipse開發環境與ProGuard
       在Android 2.3以前,混淆Android代碼只能手動添加proguard來實現代碼混淆,非常不方便。而2.3以後,Google已經將這個工具加入到了SDK的工具集裡。具體路徑:SDKoolsproguard。當建立一個新的Android工程時,在工程目錄的根路徑下,會出現一個proguard的設定檔proguard.cfg。也就是說,我們可以通過簡單的配置,在我們的elipse工程中直接使用ProGuard混淆Android工程。

       具體混淆的步驟非常簡單。首先,我們需要在工程描述檔案default.properties中,添加一句話,啟用ProGuard。如下所示:

 

 1 # This file is automatically generated by Android Tools.
 2 # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
 3 #
 4 # This file must be checked in Version Control Systems.
 5 #
 6 # To customize properties used by the Ant build system use,
 7 # "build.properties", and override values to adapt the script to your
 8 # project structure.
 9 # Indicates whether an apk should be generated for each density.
10 split.density=false
11 # Project target.
12 target=android-10
13 proguard.config=proguard.cfg
14

       這樣,Proguard就可以使用了。當我們正常通過Android Tools匯出Application Package時,Proguard就會自動啟用,最佳化混淆你的代碼。

 


 


     
    匯出成功後,你可以反編譯看看混淆的效果。一些類名、方法名和變數名等,都變成了一些無意義的字母或者數字。證明混淆成功!


proguard.cfg配置
       稍微深入想一下混淆後的結果,你就會發現,如果一些提供給外部的類、方法、變數等名字被改變了,那麼程式本身的功能就無法正常實現。那麼Proguard如何知道哪些東西是可以改名,而哪些是不能改變的呢?

       這個是靠proguard.cfg檔案來進行配置的。Android工程中預設自動產生的proguard.cfg已經針對Android的一般情況進行了配置,我們開啟這個設定檔。內容大概如下:

 


 1 -optimizationpasses 5
 2 -dontusemixedcaseclassnames
 3 -dontskipnonpubliclibraryclasses
 4 -dontpreverify
 5 -verbose
 6 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
 7 -keep public class * extends android.app.Activity
 8 -keep public class * extends android.app.Application
 9 -keep public class * extends android.app.Service
10 -keep public class * extends android.content.BroadcastReceiver
11 -keep public class * extends android.content.ContentProvider
12 -keep public class * extends android.app.backup.BackupAgentHelper
13 -keep public class * extends android.preference.Preference
14 -keep public class com.android.vending.licensing.ILicensingService
15
16 -keepclasseswithmembernames class * {
17     native <methods>;
18 }
19
20 -keepclasseswithmembernames class * {
21     public <init>(android.content.Context, android.util.AttributeSet);
22 }
23
24 -keepclasseswithmembernames class * {
25     public <init>(android.content.Context, android.util.AttributeSet, int);
26 }
27
28 -keepclassmembers enum * {
29     public static **[] values();
30     public static ** valueOf(java.lang.String);
31 }
32
33 -keep class * implements android.os.Parcelable {
34   public static final android.os.Parcelable$Creator *;
35 }
36

    它主要保留了繼承自Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子類。因為這些子類,都是可能被外部調用的。

另外,它還保留了含有native方法的類、建構函式從xml構造的類(一般為View的子類)、枚舉類型中的values和valueOf靜態方法、繼承Parcelable的跨進程資料類。

       在實際的一個工程項目中,可能Google自動產生的配置不能勝任我們的混淆工作。所以,我們往往需要自己編寫一些ProGuard配置。這方面的資料在官網的Manual -> Usage裡有詳細說明。大家可以研究一下。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.