Android混淆

混淆通過刪除從未用過的代碼和使用晦澀名字重命名類、字段和方法,對代碼進行壓縮,優化和混淆。結果是一個比較小的.apk文件,該文件比較難進行逆向工程。

某些情況下,proguard文件的缺省配置可以滿足需求了。但是,對於混淆器來說,大多數情況做出正確的分析是困難的,並且它或許會刪除在它看來是無用的,但對於程序來說卻確實需要的代碼。

注意:jar包現在基本上是無法混淆的,用工具就可以直接看到你的jar包的源碼。所以這裏的混淆是針對apk混淆

低版本 SDK 下,項目中同時包含 proguard.cfg 和 project.properties 文件,則只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再將項目 Export 即可。

 高版本 SDK 下,項目中同時包含 proguard-project.txt 和 project.properties 文件,這時需要在 proguard-project.txt 文件中進行如下信息的配置,然後再將項目 Export 即可。

在Android的SDK低版本中,混淆配置文件是proguard.cfg。在新版SDK中(例如4.0以上版本)用的是proguard-project.txt。用法和配置都是一樣的。現在以高版本爲例簡要說明下配置文件:

# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. target=android-19

將proguard-project.txt裏的#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt前的#去掉。

這樣就開啓了混淆工作。當然如果你的APK簽名導出了的話,Android會默認給你混淆一下。

默認的混淆配置文件是這樣的:

# To enable ProGuard in your project, edit project.properties # to define the proguard.config property as described in that file. # # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in ${sdk.dir}/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the ProGuard # include property in project.properties. # # For more details, see #   http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { #   public *; #}

#代表已經註釋掉了這一樣,去掉#號就是取消註釋這一行。

-keep這個參數是表示哪些類不被混淆

下面大概說下配置含義:(部分前綴dont代表don’t)

-optimizationpasses 5   設置混淆的壓縮比率 0 ~ 7    # 指定代碼的壓縮級別
-dontwarn  包名.**  --------告訴ProGuard不要警告找不到包名.**這個包裏面的類的相關引用
-dontusemixedcaseclassnames    #是否使用大小寫混合
-dontskipnonpubliclibraryclasses   # 是否混淆第三方jar
-dontpreverify     # 混淆時是否做預校驗
-verbose     # 混淆時是否記錄日誌
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆時所採用的算法

-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 com.android.vending.licensing.ILicensingService       # 保持哪些類不被混淆

-keepclasseswithmembernames class * {                               # 保持 native 方法不被混淆
    native <methods>;
}

-keepclasseswithmembers class * {                                   # 保持自定義控件類不被混淆
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {                                   # 保持自定義控件類不被混淆
    public <init>(android.content.Context, android.util.AttributeSet, int);      
}

-keepclassmembers class * extends android.app.Activity {            # 保持自定義控件類不被混淆
   public void *(android.view.View);
}

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

-keep class * implements android.os.Parcelable {                    # 保持 Parcelable 不被混淆
  public static final android.os.Parcelable$Creator *;
}

-keep class MyClass;                                                # 保持自己定義的類不被混淆
-keep class **.R$* {   *;  }//過濾R文件的混淆 -keep class packagename.** {*;}//過濾第三方包的混淆(其中packagename爲第三方包的包名)
-injars libs\your_library.jar  //表示你要混淆的jar文件

-outjars libs\your_library_out.jar  //是混淆後的jar文件名
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章