編輯:Android開發實例
前言
本章內容為開發者指南(Dev Guide)/Developing/Tools/ProGuard,本章內容為"混淆器",版本為Android3.0 r1,翻譯來自:"Jim"。
原文
http://developer.android.com/guide/developing/tools/proguard.html
混淆器(ProGuard)
在本文中(In this document)
Enabling ProGuard
Configuring ProGuard
Decoding Obfuscated Stack Traces
Debugging considerations for published applications
參見
ProGuard Manual »
ProGuard ReTrace Manual »
混淆器通過刪除從未用過的代碼和使用晦澀名字重命名類、字段和方法,對代碼進行壓縮,優化和混淆。結果是一個比較小的.apk文件,該文件比較難進行逆向工程。因此,當你的應用程序對安全敏感(要求高),例如當你授權應用程序的時候,混淆器是一種重要的保護手段。
混淆器被集成在android 構建系統中,所以你不必手動調用它。同時混淆器僅在發布模式下進行構建應用程序的時候才會運行起來,所以在調試模式下構建程序時,你不必處理混淆代碼。讓混淆器運行起來是可選擇的,但是推薦選上。
這個文檔描述了怎樣啟用並配置混淆器,以及使用跟蹤(retrace)工具對混淆的堆棧跟蹤信息(stack traces)進行解碼。
啟用混淆器Enabling ProGuard
當你新建了一個Android工程之後,一個proguard.cfg文件會在工程的根目錄下自動創建。這個文件定義了混淆器是怎樣優化和混淆你的代碼的,所以懂得怎樣根據你的需要來定制是非常重要的。缺省的配置文件僅覆蓋到了通常情況,所以根據你的需求,很可能需要編輯它。接下來的內容是關於通過定制混淆器配置文件來對混淆器配置。
為了讓啟用混淆器作為Ant或者Eclipse構建過程中一部分,可以在<project_root>/default.properties文件中,設置proguard.config屬性。路徑可以是絕對路徑或者工程根目錄的相對路徑。
如果你讓proguard.cfg文件在缺省位置(工程的根目錄),你可以像這樣指定位置:
proguard.config=proguard.cfg
同樣,你可以把該文件放到任意的位置,並指定它的絕對路徑。
proguard.config=/path/to/proguard.cfg
當你在發布模式下,或者通過運行ant release,或者通過使用Eclipse中的Export Wizard構建你的應用程序的時候,構建系統都會自動地去檢查proguard.config屬性是否被設置了。如果被設置了,混淆器在把所有東西打包成.apk文件之前,自動地對應用程序字節碼進行混淆處理。而在調試模式中構建則不會調用混淆器,因為那樣調試會更加繁重。
運行混淆器之後輸出的文件有:
dump.txt
描述.apk包中所有class文件的內部結構。
mapping.txt
列出了源代碼與混淆後的類,方法和屬性名字之間的映射。這個文件對於在構建之後得到的bug報告是有用的,因為它把混淆的堆棧跟蹤信息反翻譯為源代碼中的類,方法和成員名字。更多信息,查看解碼混淆過的堆棧跟蹤信息。
seeds.txt
列出那些未混淆的類和成員。
usage.txt
列出從.apk中剝離的代碼。
這些文件放在以下目錄中:
l <project_root>/bin/proguard 當你使用Ant時
l <project_root>/proguard 當你使用Eclipse時
注意: 每次在發布模式下構建時,這些文件都會被最新的文件覆蓋。所以每次發布程序時候,為了反混淆來自構建時產生的bug報告,請保存這些文件的一個拷貝。對於為什麼要保存這些文件的重要性的更多信息,請查看程序發布調試注意事項。
混淆器配置(Configuring ProGuard)
某些情況下,proguard.cfg文件的缺省配置可以滿足需求了。但是,對於混淆器來說,大多數情況做出正確的分析是困難的,並且它或許會刪除在它看來是無用的,但對於程序來說卻確實需要的代碼。一些例子如下:
l 一個僅引用於AndroidManifest.xml文件的類。
l 一個通過JNI調用的方法。
l 動態引用的屬性和方法。
缺省的proguard.cfg文件試圖覆蓋普通的情況,但是你可能碰到類似ClassNotFoundException的異常,這個異常出現在當你的程序去訪問一個被混淆器移除了的類的時候。
你可以在proguard.cfg文件中添加-keep這一行來修復這些錯誤。例如:
-keep public class <MyClass>
-Keep設置有很多可選項和注意地方,所以為了獲得更多關於配置信息,強烈推薦你閱讀混淆器用戶手冊。特別有用的有Keep選項綜述和舉例部分。在混淆器手冊問題解決方案部分,介紹了代碼在混淆過程中你可能碰到的其他常見問題。
解碼混淆過的堆棧跟蹤信息(Decoding Obfuscated Stack Traces)
當混淆代碼並輸出了一個堆棧調試信息時,這些方法名字是混淆過的,雖然可以進行調試,但是調試變得困難。幸運的是,每當混淆器運行時候,它都會輸出到文件<project_root>/bin/proguard/mapping.txt中,該文件包含了從原始類,方法和屬性名字到混淆後名字的映射。
Windows系統中retrace.bat腳本命令或者Linux和Mac OS X系統中retrace.sh腳本命令能把混淆後的堆棧調試信息轉換為可以理解的文件。它被放在<sdk_root>/tools/proguard/目錄下。運行retrace工具的命令語法是:
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
如果你沒有為<stracktrace_file>指定值,那麼retrace工具從標准輸入讀取。
已發布應用程序的調試注意事項(Debugging considerations for published applications)
保存好每一個已發布給用戶的程序的mapping.txt文件。通過保存發布構建版本的mapping.txt文件拷貝,確保當用戶碰到bug,並把混淆後的堆棧調試跟蹤信息提交給你時,你可以進行調試從而修復問題。程序的mapping.txt文件在每次發布構建時都會被覆蓋,所以你一定要注意保存正確的版本。
例如,假設你已經發布了一個應用程序並在繼續在新的版本中開發添加新的功能。接著你馬上啟動混淆器並創建一個新的發布版本。該操作把mapping.txt文件覆蓋了。一個用戶提交了來自當前發布版本的bug報告,該報告包含了堆棧調試信息。你再也不能對用戶的堆棧信息進行調試了,因為這個對應用戶本機上版本的mapping.txt文件不存在了。其他覆蓋mapping.txt文件的情況還有很多,所以對於每一個可能需要調試的版本,你都要確保有一份拷貝。
如何保存mapping.txt文件由你決定。例如,你可以根據版本和構建號來重命名它們,或者連同你的源代碼進行版本控制。JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
之前在一篇文章中已經講過了菜單項的創建方法,但是那種方法效率較低,維護不易,現在實現另一種方法創建菜單。 MenuInflater,通過此類我們可以輕松的創建菜單
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩