Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發者指南(9) —— ProGuard

Android開發者指南(9) —— ProGuard

編輯: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文件由你決定。例如,你可以根據版本和構建號來重命名它們,或者連同你的源代碼進行版本控制。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved