Android Proguard 詳解,androidproguard

來源:互聯網
上載者:User

Android Proguard 詳解,androidproguard

一般的商業項目都需要對代碼進行加密,Android提供了一種代碼混淆方法,介紹如下:

一、簡介

1、簡介

混淆器通過刪除從未用過的代碼和使用晦澀名字重新命名類、欄位和方法,對代碼進行壓縮,最佳化和混淆。結果是一個比較小的.apk檔案,該檔案比較難進行逆向工程。因此,當你的應用程式對安全敏感(要求高),例如當你授權應用程式的時候,混淆器是一種重要的保護手段。

混淆器被整合在android 構建系統中,所以你不必手動調用它。同時混淆器僅在發布模式下進行構建應用程式的時候才會運行起來,所以在偵錯模式下構建程式時,你不必處理混淆代碼。讓混淆器運行起來是可選擇的,但是推薦選上。

2.注意事項

       在新版本的ADT建立項目時,混碼的檔案不再是proguard.cfg,而是project.properties和proguard-project.txt。

如果需要對項目進行全域混碼,只需要進行一步操作:

將project.properties的中

“#  proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的“#”去掉就可以了。


     如果有一些代碼不能被混淆,比如需要加入了so檔案,需要調用裡面的方法,那麼調用JNI訪問so檔案的方法就不能被混碼。在匯出的時候,可能不會報錯。但是在手機上啟動並執行時候,需要調用so檔案的時候,就會報某某方法無法找到。這個時候就需要用到proguard-project.txt。

二、在Eclipse中啟用ProGuard

1、確定Android SDK目錄下是否存在proguard檔案夾
例如   D:\Environment\android-sdk-windows\tools\proguard
2、配置
   1)檢查項目根目錄下是否存在proguard.cfg(或proguard-project.txt)檔案,如果不存在(說明的當前的項目是2.3以前的項目),需要建立一個2.3的android項目,從該項目中將proguard.cfg檔案拷貝到你的項目根目錄中,無需改動(除非你明白如何自訂自己的混淆策略),繼續下面步驟。
   2)如果存在,則找到項目根目錄下的default.properties[如果你使用的是ADT14或者更高版本,那麼項目中沒有default.properties檔案,只有project.properties檔案,找到project.properties檔案即可]檔案,在檔案中增加一項配置:proguard.config=proguard.cfg
這樣就完成了配置

3.文法規則

# android 原始混淆模板  # -------------------------------------    # ----------------------------------  #  通過指定數量的最佳化能執行  #  -optimizationpasses n  # ----------------------------------  -optimizationpasses 5    # ----------------------------------  #   混淆時不會產生形形色色的類名   #   -dontusemixedcaseclassnames  # ----------------------------------  #-dontusemixedcaseclassnames  # ----------------------------------  #      指定不去忽略非公用的庫類  #  -dontskipnonpubliclibraryclasses  # ----------------------------------  #-dontskipnonpubliclibraryclasses    # ----------------------------------  #       不預校正  #    -dontpreverify  # ----------------------------------  # -dontpreverify    # ----------------------------------  #      輸出產生資訊  #       -verbose  # ----------------------------------  -verbose    # ----------------------------------  #        最佳化選項  #   optimizations  {optimization_filter}   # ----------------------------------  -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 <methods>;  }  # -----------------  # modify 修改合并  # -----------------  -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*(...);  }    -keepclassmembers enum * {      public static **[] values();      public static ** valueOf(java.lang.String);  }    -keep class * implements android.os.Parcelable {    public static final android.os.Parcelable$Creator *;  }    #--------------------------  # 保護類型   -keepattributes 說明  # Exceptions, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable,   # LocalVariableTypeTable, Synthetic, EnclosingMethod, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations,   # RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, and AnnotationDefault  # --------------------  -keepattributes **  -libraryjars <java.home>/lib/rt.jar    # ----------------------  #  不壓縮指定的檔案  #  -dontshrink  # ----------------------  -dontshrink    # ----------------------  #  不最佳化指定的檔案  #  -dontoptimize  # -----------------------  -dontoptimize    # -----------------------  #  不混淆指定的檔案  #  -dontobfuscate  # -----------------------    # ----- 混淆包路徑 -------  -repackageclasses ''  -flattenpackagehierarchy ''  -target 1.6    # -------- 以下是使用了 roboguice-1.1.2.jar 以及 guice-2.0-no_app.jar 功能需要保護的欄位及類相關 --------  -keep class com.google.inject.Binder  -keepclassmembers class * {      @com.google.inject.Inject <init>(...);  }  -keepclassmembers class * {      void *(**On*Event);   }  -keepclassmembers class **.R$* {      public static <fields>;  }    # ------ 編譯時間需要用到的 jar 包  -libraryjars D:/dev_rc/android-sdk-windows/add-ons/addon_google_apis_google_inc_11/libs/maps.jar    # ------ 保護 Google第三方 jar 包,介面特效 ----------  -keep class android.support.v4.**  -dontwarn android.support.v4.**    # ------ 保護百度地址jar包 --------  -keep class com.baidu.mapapi.** { *; }  -dontwarn com.baidu.mapapi.**    # --- 打包時忽略以下類的警告 --  -dontwarn com.classpackage.AA    #-keepnames class * implements java.io.Serializable  # ---------保護所有實體中的欄位名稱----------  -keepclassmembers class * implements java.io.Serializable {      <fields>;  }    # --------- 保護類中的所有方法名 ------------  -keepclassmembers class * {      public <methods>;  }  

參考:http://huangyuan.iteye.com/blog/1472732

如有問題請留言,轉載註明出處。


android裡proguardcfg檔案有什用?

這是代碼混淆用的.
你可以搜尋一下android 代碼混淆,看看大家是怎麼配置這個檔案的.

代碼混淆是為了防止你的apk被反編譯而代碼全部暴露.不過目前的代碼混淆只是把命名修改了一下而已,真正反編譯時間還是可以想辦法還原出來的,所以不能真正的混淆.
 
我在eclipse中建立一個android工程,最後說我缺少proguardcfg,我該怎解決

更新sdk,就可以解決了

1、Eclipse-->> Window-->>Android SDK And AVD Manager

2、選中installed packages 中的SDK tools 然後點擊 update all ..

經過上面兩步問題即可解決
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.