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 ..
經過上面兩步問題即可解決