1. 用proguard混淆代碼
android sdk 自帶 proguard 包,是以用proguard混淆 很簡單,隻需簡單配置下就好
1. 在 project.properties裡開啟 proguard :
sdk.dir=D:\\android\\tool\\android-sdk-windows_4.0
proguard.config=${sdk.dir}\\tools\\proguard\\proguard-android.txt:proguard.cfg
2. 在 proguard.cfg做具體配置
某些情況下,proguard.cfg檔案的預設配置可以滿足需求了。但是,對于混淆器來說,大多數情況做出正确的分析是困難的,并且它或許會删除在它看來是無用的,但對于程式來說卻确實需要的代碼。一些例子如下:
l 一個僅引用于AndroidManifest.xml檔案的類。
l 一個通過JNI調用的方法。
l 動态引用的屬性和方法。
預設的proguard.cfg檔案試圖覆寫普通的情況,但是你可能碰到類似ClassNotFoundException的異常,這個異常出現在當你的程式去通路一個被混淆器移除了的類的時候。
你可以在proguard.cfg檔案中添加-keep這一行來修複這些錯誤。例如:
-keep public class <MyClass>
-Keep設定有很多可選項和注意地方,是以為了獲得更多關于配置資訊,強烈推薦你閱讀混淆器使用者手冊。特别有用的有Keep選項綜述和舉例部分。在混淆器手冊問題解決方案部分,介紹了代碼在混淆過程中你可能碰到的其他常見問題。
如 不混淆 某些jia包 等
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-dontwarn com.unionpay.**
-keep class com.unionpay.** { *; }
3.可能出現的錯誤 :
missing type parameter at com.google.gson.b.a.a
程式中用到了gson的new typeToken,結果打包成apk釋出時,發現抛出異常,解決方法:
在 proguard.cfg中添加
-dontobfuscate
-dontoptimize
xx cannot be resolved to a type
出現這個錯誤 就是引用的jar包也被混淆了,找到具體的jar包,設定下 keep即可
-keep class cn.sharesdk.** { *; }
注意 : 如果因為引用包混淆出現的錯誤 很有可能 不會直接顯示,隻有程式調用引用包的時候 才會報錯,是以混淆後需要充分測試,特别是針對引包,如
分享 登陸 二維碼掃描 百度地圖 jpush 支付寶 銀聯 等 需要跑一便看看是否正常。
4 已釋出應用程式的調試注意事項
儲存好每一個已釋出給使用者的程式的mapping.txt檔案。通過儲存釋出建構版本的mapping.txt檔案拷貝,確定當使用者碰到bug,并把混淆後的堆棧調試跟蹤資訊送出給你時,你可以進行調試進而修複問題。程式的mapping.txt檔案在每次釋出建構時都會被覆寫,是以你一定要注意儲存正确的版本。
例如,假設你已經釋出了一個應用程式并在繼續在新的版本中開發添加新的功能。接着你馬上啟動混淆器并建立一個新的釋出版本。該操作把mapping.txt檔案覆寫了。一個使用者送出了來自目前釋出版本的bug報告,該報告包含了堆棧調試資訊。你再也不能對使用者的堆棧資訊進行調試了,因為這個對應使用者本機上版本的mapping.txt檔案不存在了。其他覆寫mapping.txt檔案的情況還有很多,是以對于每一個可能需要調試的版本,你都要確定有一份拷貝。
如何儲存mapping.txt檔案由你決定。例如,你可以根據版本和建構号來重命名它們,或者連同你的源代碼進行版本控制。
5. 混淆文法:
參數:
-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選項的清單,标準輸出到給定的檔案
壓縮
-dontshrink 不壓縮輸入的類檔案
-printusage {filename}
-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} 設定源檔案中給定的字元串常量
我這裡加上了-keep public class com.emag.ui.GameCommunity{ public *;} 的參數,含義就是 class com.emag.ui.GameCommunity這個類下面的所有public方法和字段都不需要混淆。
這裡放上另外一份配置檔案,希望對大家有所幫助:
這個是web的項目,使用ProGuard混淆打包的。
是webwork+spring+hibernate的架構的項目,所有需要很詳細的配置。(經過n次失敗後總結)
Example:
-injars <project>.jar
-outjars <project>_out.jar
-libraryjars <java.home>/lib/rt.jar
-libraryjars <project.home>/webroot/WEB-INF/lib/webwork.jar
.......
# 保留實作Action接口類中的公有的,友好的,私有的屬性 和 公有的,友好的方法。其它的全部壓縮,優化,混淆。
# 因為配置檔案中的類名是一個完整的類名,如果經過處理後就有可能找不到這個類。
# 屬性是jsp頁面所需要的,如果經過處理jsp頁面就無法得到action中的資料。
-keep public class * implements com.opensymphony.xwork.Action{
public protected private <fields>;
public protected <methods>;
}
# 保留實作了Serializable接口類中的公有的,友好的,私有的成員(屬性和方法)
# 這個配置主要是對應實體類的配置。
-keep public class * implements java.io.Serializable{
public protected private *;
}
2.代碼反編譯
1. 把apk檔案 修改zip 解壓 ,解壓出 classes.dex檔案
2、還原.jar檔案;這一步需要用到一個工具 dex2jar (http://download.csdn.net/detail/socketsyuhai/9296139)
看名字也不難知道他是幹嘛的了吧?(沒錯,就是 把 dex 還原 成 jar包 )
下載下傳完了,解壓,然後把第一步的 産物(即那個classes.dex檔案)放到 dex2jar的解壓目錄裡
cmd 指令行 ,目錄切換到 dex2jar的目錄下
“ dex2jar.bat classes.dex” (版本不一樣,前面 dex2jar.bat 可能有細微差别,具體看 安裝的dex2jar下面的bat的檔案名稱)
dex2jar 檔案夾裡 有“classes.dex.dex2jar.jar” 檔案,說明還原jar檔案成功
這個就是 傳說中的 jar包了
3、檢視.jar檔案;這一步就是傳統的 反編譯 了,需要工具輔助,我這裡用到的工具是jd-gui(http://download.csdn.net/detail/socketsyuhai/9296139)
下載下傳你的系統對應的版本,解壓,你會看到一個 .exe檔案
輕按兩下,選擇 第二步 生成的 .jar, 好吧,你的項目是不是 完全還原了呢?
上面是沒有混淆的,混淆的 就看不到了: