Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 調試 Android* x86 應用程序的方法以及要使用的工具

調試 Android* x86 應用程序的方法以及要使用的工具

編輯:關於Android編程

 

1.簡介

 

眾所周知,Android* 開發人員頭頂許多稱呼:設計員、程序猿等,並且通常會不可避免地被稱為故障檢修工。代碼中的錯誤無法避免,因此無論您是否一開始就造成錯誤,了解調試工具以及如何迅速而有效地跟蹤並解決錯誤都很重要。鑒於此,如今的 Android 開發人員必須掌握有效的調試技巧。本文提供了 Android 應用程序調試工具的簡單教學,用於幫助 Android SDK 以及相關工具的新手迅速入門,並在 Android x86 平台上更有效地解決故障。

2.SDK 應用程序調試工具

Android SDK 提供了試應用程序所需的大多數工具。如果希望進行諸如單步調試代碼、查看變量值以及暫停執行應用程序的操作,則需要兼容 JDWP 的調試程序。如果使用 Eclipse,則已附帶兼容 JDWP 的調試程序,無需設置。如果使用其它 IDE,則可使用其附帶的調試程序並將調試程序與特殊端口連接,使其可以和您設備上的應用程序虛擬機通信。

如果使用 ADT(Android 開發工具)插件在 Eclipse 中進行開發,則可使用內置的 Java* 調試程序並結合 DDMS(Dalvik 調試監測程序服務器)來調試應用程序。為了便於訪問調試程序和 DDMS,Eclipse 以視圖形式顯示調試程序和 DDMS 功能,這些都是自定義的 Eclipse 視圖,根據您所在的視圖顯示特定選項卡和窗口。Eclipse 還可負責為您啟動ADB (Android Debug Bridge) 主機守護程序,從而無需手動運行該工具。如果使用其他 IDE 進行調試,則可使用 Android SDK 提供的所有調試工具,例如 ADB、DDMS、Java 調試程序等。

\

圖 1. Dalvik 調試監測程序服務器

借助 DDMS,開發人員可查看進程的堆區使用情況、跟蹤對象的內存分配、使用模擬器或設備的文件系統、檢查線程信息、獲取方法配置、使用網絡流量工具(在 Android 4.0 中提供)、使用 LogCat 跟蹤代碼信息以及模擬手機操作和位置。如欲了解更多信息,請參閱 http://developer.android.com/guide/developing/debugging/ddms.html。Android SDK 還提供 Hierarchy Viewer(層級觀察器)和 layoutopt(布局優化分析工具)幫助開發人員調試布局問題。

Hierarchy Viewer 應用程序可讓您調試並優化您的用戶界面 (UI)。它以可視方式呈現布局的視圖層級(View Hierarchy 口),提供放大的顯示視圖(Pixel Perfect 窗口)。

\

圖 2. Hierarchy Viewer(層級查看器)

View Hierarchy窗口顯示形成您設備上或模擬器上運行的活動的 UI 的視圖對象。您可以用它在整個視圖樹的上下文中查看各個視圖對象。對於每個視圖對象,View Hierarchy 窗口還顯示渲染性能數據。在選擇節點時,視圖的額外信息出現在節點上方的小窗口中。 在單擊其中一個節點時,可看到有關圖像、視圖計數和渲染時間的信息。

\

圖 3. 查看對象信息窗口

Pixel Perfect 是一個工具,用於檢查像素屬性並通過設計圖排布用戶界面。Pixel Perfect 窗口顯示模擬器或設備上可見的屏幕的放大圖像。在該窗口中,可檢查屏幕圖像中各個像素的屬性。也可使用 Pixel Perfect 窗口根據位圖設計幫助排布應用程序的用戶界面。

\

圖 4. Pixel Perfect 窗口

layoutopt 工具可讓您分析 XML 文件,該文件定義應用程序的用戶界面以查找視圖層級中的不當之處。要運行工具,可打開終端並從 SDK 工具/目錄啟動 layoutopt 變量是以空格分隔的要分析的資源的列表,可以是未編譯的資源 xml 文件或這些文件的目錄。工具會加載指定的 XML 文件並根據一組預定義的規則分析它們的定義和層級。 下面是來自工具的輸出示例:

$ layoutopt samples/ samples/compound.xml 7:23 The root-level <framelayout> can be replaced with 11:21 This LinearLayout layout or its FrameLayout parent is useless samples/simple.xml 7:7 The root-level <framelayout> can be replaced with samples/too_deep.xml -1:-1 This layout has too many nested layouts: 13 levels, it should have <= 10! 20:81 This LinearLayout layout or its LinearLayout parent is useless 24:79 This LinearLayout layout or its LinearLayout parent is useless 28:77 This LinearLayout layout or its LinearLayout parent is useless 32:75 This LinearLayout layout or its LinearLayout parent is useless 36:73 This LinearLayout layout or its LinearLayout parent is useless 40:71 This LinearLayout layout or its LinearLayout parent is useless 44:69 This LinearLayout layout or its LinearLayout parent is useless 48:67 This LinearLayout layout or its LinearLayout parent is useless 52:65 This LinearLayout layout or its LinearLayout parent is useless 56:63 This LinearLayout layout or its LinearLayout parent is useless samples/too_many.xml 7:413 The root-level <framelayout> can be replaced with -1:-1 This layout has too many views: 81 views, it should have <= 80! samples/useless.xml 7:19 The root-level <framelayout> can be replaced with 11:17 This LinearLayout layout or its FrameLayout parent is useless</framelayout></framelayout></framelayout></framelayout>

 

Traceview 是執行日志的圖形化查看器,這些日志在您使用調試類記錄代碼中的跟蹤信息時創建。Traceview 可幫助您調試應用程序並概述其性能。Traceview 可加載日志文件並在窗口中顯示其數據,該窗口如圖 5 和圖 6 所示以兩個面板將您的應用程序可視化:

 

\

圖 5. 時間軸面板描述每個線程和方法何時開始和停止

\

圖 6. Profile(概要)面板提供方法中花費的所有時間的摘要。

dmtracedump 是一種工具,為您提供一種備選方式,用於從跟蹤日志文件生成圖形調用棧圖。該工具使用 Graphviz Dot 實用程序創建圖形化輸出,因此您需要在運行 dmtracedump 之前安裝 Graphviz。dmtracedump 工具以樹圖形式生成調用堆棧數據,每個調用表示為一個節點。它使用箭頭顯示調用流程(從父節點至子節點)。圖 7 顯示了 dmtracedump 輸出的一個示例。

\

圖 7. dmtracedump

3.NDK 應用程序調試工具

由於 Android NDK 基於 GCC 工具鏈,Android NDK 包含 GDB、GNU 調試程序,因而可讓您啟動、暫停、檢查和修改程序。在 Android 設備上,GDB 配置為客戶端/服務器模式,在嵌入式設備上這種配置更為常見。程序在設備上作為服務器和遠程客戶端運行。開發人員的工作站與其連接,並發送與本地應用程序相似的調試命令。GDB 本身是一個命令行實用程序,如果手動使用會顯得較為繁瑣。幸好 GDB 可由大多數 IDE 尤其是 CDT 處理。從而可直接使用 Eclipse 來添加斷點並檢查程序,但前提是先正確配置它!

通過單擊文本編輯器的左端,Eclipse 確實可方便地用 Java 和 C/C++ 源文件插入斷點。Java 斷點借助 ADT 插件可以立即使用,該插件管理通過 Android Debug Bridge 進行的調試。但對 CDT 並非如此,CDT 並不能感知 Android。因此,插入斷點將不會有作用,除非我們配置 CDT 以使用 NDK 的 GDB,GDB 本身需要綁定至原生應用程序以對其進行調試。 在 NDK 版本中改善了對調試程序的支持(例如,之前不能調試純原生線程)。盡管 NDK 越來越適用,但 NDK R5(甚至包括 R7)還很不完善。但是,它仍然有用處! 現在讓我們了解下如何調試原生應用程序。

首先通過以下步驟在我們的應用程序中啟用調試模式:
1)有一步操作很重要,但也很容易被忽略,那就是在 Android 項目中激活調試標記。該操作在應用程序清單 AndroidManifest.xml 中完成。請勿忘記對原生代碼使用適用的 SDK 版本:

...

 

2)在清單中啟用調試標記會自動以原生代碼激活調試模式。但是,APP_OPTIM 標記也控制著調試模式。如果已在 Android.mk 中手動設置它,則檢查是否已設置其值以進行調試(並不發布)或直接刪除它:

APP_OPTIM := debug

 

 

3)現在讓我們配置將連接至設備的 GDB 客戶端。重新編譯項目並插入設備或啟動模擬器。運行然後離開應用程序。確保加載應用程序並且其 PID 可用。可通過使用以下命令(在 Windows 中使用 Cygwin)監聽進程來檢查它:

$ adb shell ps |grep gl2jni

 

 

應該會返回一行:

app_75 13178 1378 201108 68672 ffffffff 80118883 S com.android.gl2jni

 

 

4)打開終端窗口並轉到項目目錄。運行 ndk-gdb 命令(位於 Android NDK 文件夾,例如 android-ndk-r8):

$ ndk-gdb

 

 

該命令不會返回消息,但是會在 objlocal? 目錄創建三個文件(對於 arm 設備目錄為 objlocalarmeabi):

 

  • gdb.setup:這是為 GDB 客戶端生成的配置文件。
  • app_process:該文件直接從您的設備檢索。其為系統可執行文件,在系統啟動時啟動,並可形成分支,啟動新的應用程序。GBD 需要該參考文件來查找其標記。在某些方面,其為您的應用程序的二進制輸入點。
  • libc.so:該文件也可直接從您的設備檢索。其為 GDB 使用的 Android 標准 C 庫(通常稱為 bionic),用於保持跟蹤運行時期間創建的所有原生線程。

    5)在您的項目目錄中,復制 objlocal?gdb.setup 並將其命名為 gdb2.setup。打開它並刪除請求 GDB 客戶端連接至運行於設備上的 GDB 服務器的以下行(將由 Eclipse 自身執行):
    target remote :5039

    6在 Eclipse 主菜單中,轉至“Run(運行)| Debug Configurations(調試配置)...”,並在名為 GL2JNIActivityDefault 的 C/C++ 應用程序項目中創建新的調試配置。該配置將在您的計算機上啟動 GDB 客戶端並連接至設備上運行的 GDB 服務器。

    7在 Main(主菜單)選項卡中,使用浏覽按鈕,將項目設置為自己的項目目錄,將 C/C++ 應用程序設置為指向 objlocal x86app_process(可以使用絕對或相對路徑)。

    \

    圖 8. 為 C/C++ 應用程序調試配置

    8使用窗口底部的鏈接“Select other(選擇其他)...”,將啟動程序類型切換為“Standard Create Process Launcher(標准創建進程啟動程序)”:

    \

    圖 9. 選擇首選啟動程序

    9轉至調試程序文件並設置調試程序類型為 gdbserver,將 GDB 調試程序設置為 android-ndk-r8 oolchains?-4.4.3prebuiltwindowsini686-android-linux-gdb.exe 或針對 arm 平台設置為 android-ndk-r8 oolchainsarm-linux-androideabi-4.4.3prebuiltlinux-x86inarm-linux-androideabi-gdb,針對 arm 平台將 GDB 命令文件需求設置為指向位於 objlocal? 或 objlocalarmeabi 中的 gdb2.setup 文件(使用絕對或相對路徑均可)。

    \

    圖 10. 調試程序設置面板

    10轉至 Connection(連接)選項卡並將類型設置為 TCP。主機名、IP 地址和端口號 (localhost d 5039) 都保留默認值。

    \

    圖 11. 調試程序設置面板上的鏈接設置

    11現在讓我們配置 Eclipse 以在設備上運行 GDB 服務器。復制 android-ndk-r8 dk-gdb 並用文本編輯器打開它。查找以下行:
    $GDBCLIENT -x `native_path $GDBSETUP`

    由於 GDB 客戶端將由 Eclipse 本身運行,因此對其進行注釋:

    #$GDBCLIENT -x `native_path $GDBSETUP`

    12在 Eclipse 主菜單中,轉到“Run(運行)| External Tools(外部工具)| External Tools Configurations(外部工具
    配置)...”,並創建新配置 GL2JNIActivity_GDB。
    該配置將在設備上啟動 GDB 服務器。

    13在 Main(主菜單)選項卡上,將位置設置為指向 android-ndk-r8 中我們修改過的 ndk-gdb。 將工作目錄設置為您的應用程序目錄位置
    也可設置 Arguments(變量)文本框:

    • Verbose:詳細查看 Eclipse 控制台中發生了什麼。
    • Force:自動終止之前所有會話。
    • start:讓 GDB 服務器啟動應用程序,而不是在應用程序啟動之後連接至應用程序。該選項在您僅調試原生代碼而非 Java 代碼時有用。

      \

      圖 12. 外部工具配置

      14現在,和往常一樣啟動應用程序。

      15一旦應用程序啟動,就可直接通過控制台啟動 ndk-gdb 或啟動外部工具配置 GL2JNIActivity_GDB,該配置將啟動設備上的 GDB 服務器。GDB 服務器接收遠程 GDB 客戶端發送的調試命令,並在本地調試您的應用程序。

      16打開 jnigl_code.cpp 並通過雙擊文本編輯器的左端在 setupGraphics 中設置斷點(或右鍵單擊並選擇 Toggle breakpoint(切換斷點))。

      \

      圖 13. 斷點設置

      17最後啟動 GL2JNIActivity 默認 C/C++ 應用程序配置啟動 GDB 客戶端。它會通過套接字連接將調試命令從 Eclipse CDT 中繼至 GDB 服務器。從開發人員的觀點來看,這與調試本地應用程序很相似。

      也有一些專用工具用於調試圖形性能,例如 Intel® GPA System Analyzer 為英特爾® 圖形性能分析器(英特爾® GPA)之一,新增加了對於英特爾架構 Android 設備的支持,並且專供應用程序和驅動程序工程師優化其 OpenGL* ES 工作量。

      該部分提供的信息涉及如何配置英特爾 GPA 並通過 USB 連接將其用於您的 Android 設備。在連接至 Android 設備時,英特爾 GPA System Analyzer 提供 OpenGL ES API、CPU 和 GPU 性能標准,並通過提供多個圖形管線狀態重寫以幫助分析 OpenGL ES 應用程序性能。

      要在基於 Android x86 的設備上使用英特爾 GPA System Analyzer,需要從文檔檢查目標機器和固件/版本。

      要開始收集標准,需要在客戶端系統上安裝英特爾 GPA System Analyzer 並將其連接至目標設備:

      1在 Windows*/Linux* 客戶端機器上安裝英特爾 GPA 2012 R3。

      2啟動英特爾 GPA System Analyzer。

      3確保 Android 設備通過 USB 電纜連接至客戶端系統。

      4在客戶端系統檢測目標設備時,最多等待 10 秒。發現的設備會出現在對話框窗口中。目標設備的列表會每隔 5 到 6 秒刷新一次。

      5查找要連接的設備並單擊“Connect(連接)”。英特爾 GPA System Analyzer 會將所需的組件復制到目標設備並生成已安裝應用程序的列表。可通過單擊“Stop(停止)”中斷連接進程。

      \

      圖 14. 選擇互聯設備

      6從可用應用程序列表中選擇所需的應用程序。“Application List(應用程序列表)”屏幕顯示所有用戶以及 Android 設備上安裝的所有系統應用程序。

      \

      圖 15. 應用列表

      7將會啟動應用程序並且您將在英特爾 GPA System Analyzer 窗口中看到其數據。

      8要切換至不同應用程序,單擊“Back(返回)”。請注意,將強制關閉正在運行的應用程序。

      9要切換至不同目標,單擊“Back(返回)”。
      PowerVR 顯卡架構由以下核心模塊構成,這些模塊可將提交的 3D 應用程序數據轉換為渲染的圖形:Tile Accelerator (TA)、Image Synthesis Processor (ISP) 以及 Texture & Shading Processor (TSP)。“GPU” 組中的英特爾 GPA 標准對應這些核心模塊之一,“Metrics List(標准列表)”中標准的順序取決於圖形管線中核心模塊的順序。

      \

      圖 16. Intel GPA System Analyzer 窗口

      Perf 是自 Linux 版本 2.6.30 起 Linux 中很有用的一個工具,可同時用於與硬件和軟件相關的性能分析。盡管 Android 基於 Linux 構建,但和不包含其他 Linux 組件和庫一樣,它也不包含 perf。您必須將靜態構建的 perf 推送至其中。如果您已有該工具,只需將其置於 /system/bin/ 下,就可有效發揮其作用。有關 perf 的簡短說明、基本用法和教程,可訪問https://perf.wiki.kernel.org/index.php/Main_Page。
      借助 traceview,開發人員可獲取 Java 代碼的性能信息;借助 perf,開發人員可獲取有關原生和系統級代碼的性能信息,如圖 17 中所示。

      \

      圖 17. 性能統計數據

      \

      圖 18. 函數調用棧

      UxTune 是一個工程工具,用於 Android 用戶交互分析和優化。它是一種增強的 pyTimeChart 工具。
      UxTune 設計特性包括:

      • 垂直相關:將跨層的系統事件映射至用戶級別活動,例如事件、手勢、幀等。
      • 水平相關:將不同系統實體間的運行時活動(例如一個線程觸發垃圾回收)關聯。
      • 基於 pyTimeChart 的可視化。

        要使用 UxTune 分析響應能力,開發人員需要熟悉 Android 系統的某些重要進程(在 pyTimeChart 中顯示為行),即:

        1. InputReader 行:該行以觸摸坐標顯示所有觸摸事件。事件將發送至 InputDispatcher。
        2. InputDispatcher 行:InputDispatcher 將把連續的觸摸事件打包,並將該包發送至應用程序的 uiThread。
        3. uiThread 行:該行顯示從 InputDispatcher 收到的包的主要觸摸事件。uiThread 將根據特定操作繪制(渲染)其表面。 “D” 表示繪制進程。
        4. Surface 行:uiThread 在繪制開始時鎖定其表面,並在繪制完成後解鎖表面。“S” 和 “E” 表示應用程序渲染的開始和結束。
        5. SurfaceFlinger 行:在完成應用程序渲染後,應用程序將通知 SurfaceFlinger 合成並更新屏幕。“S” 表示 SurfaceFlinger 開始處理應用程序請求,而 “E” 表示合成完成(幀緩沖區交換完成)。

          \

          圖 19. UxTune 分析窗口

          Meter-FPS 是一個工具,用於測量系統的 FPS 值,它會截取顯卡處理路徑以獲得每幀的記錄,還包含其他標准,例如最大幀時間、幀時間變化、#長時幀和掉幀率。fps 監控器有兩種模式。Real Time Pattern(實時模式)可實時顯示所有正在運行的應用程序的 fps。Measure Pattern(測量模式)可在用戶定義的啟動和停止時間測量 fps 和其他參數。要使用該工具,必須取得設備最高權限。
          設置環境:
          setprop debug.graphic_log 1
          stop zygote
          start zygote

          圖 20 顯示了配置界面,開發人員可在其中為調試目標配置工具。

          \

          20. Meter-FPS 配置

          在 Real Time(實時)模式中單擊監控器按鈕。fps 工具將監控所有正在運行的應用程序,並在屏幕上的浮動窗口中更新 fps。

          \

          圖 21. Meter-FPS 實時模式

          在 Measure(測量)模式中單擊監控器按鈕。將顯示一個浮動窗口,其中顯示“Click to start(單擊以開始)...”;單擊浮動窗口開始監控。

          \

          圖 22. Meter-FPS 實時模式 1

          現在測量模式正在運行:

          \

          圖 23. Meter-FPS 實時模式 1

          單擊浮動窗口停止監控;其將顯示結果:

          \

          圖 24. Meter-FPS 分析結果列表

          單擊上面列表中的每個項目以獲取詳細記錄:

          \

          圖 25. Meter-FPS 分析詳細記錄

          參考:

          http://developer.android.com/guide/developing/debugging/index.html
          http://www.eclipse.org/sequoyah/documentation/native_debug.php
          http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/
          http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-debugging/
          http://packages.python.org/pytimechart/userguide.html
          https://perf.wiki.kernel.org/index.php/Main_Page

          相關文章與資源:

          • Android - 英特爾開發人員專區
          • Android INDE
          • 如何使用英特爾 XDK 創建應用
          • 使用 HAXM 加速英特爾架構上的 Android 模擬器

            關於作者

            \Xiaodong Wang 是英特爾軟件及服務事業部的應用工程師。 他專注於采用 Android 操作系統的基於英特爾的平台的 ISV。 Xiaodong 提供技術支持的 PRC Plus 項目(Android 平板電腦 ISV 啟用)成功啟用了前 50 個 NDK 應用程序作為技術接口。最近 Xiaodong 參與了英特爾的數個創新項目,並在開發過程中扮演重要角色。尤其是其中一個項目被選為英特爾信息技術峰會的演示項目,而 Xiaodong 成功地提供了技術支持。 在加入英特爾之前,Xiaodong 在 MediaTek 進行有關框架和應用程序開發的工作。Xiaodong 是北京大學碩士,並在作為訪問學者在新加坡南洋大學進行研究期間,在《IEEE 計算機匯刊》上發表了一篇技術論文。他感興趣的領域為移動互聯網技術(例如 LBS、NFC AR 等)以及創新設計。

             

            聲明

             

            本文件中包含關於英特爾產品的信息。本文件不構成對任何知識產權的授權,包括明示的、暗示的,也無論是基於禁止反言的原則或其他。英特爾不承擔任何其他責任。英特爾在此作出免責聲明:本文件不構成英特爾關於其產品的使用和/或銷售的任何明示或暗示的保證,包括不就其產品的(i)對某一特定用途的適用性、(ii)適銷性以及(iii)對任何專利、版權或其他知識產權的侵害的承擔任何責任或作出任何擔保。

            除非經過英特爾的書面同意認可,英特爾的產品無意被設計用於或被用於以下應用:即在這樣的應用中可因英特爾產品的故障而導致人身傷亡。

            英特爾有權隨時更改產品的規格和描述,恕不另行通知。設計者不應信賴任何英特產品所不具有的特性,設計者亦不應信賴任何標有保留權利摂或未定義摂說明或特性描述。對此,英特爾保留將來對其進行定義的權利,同時,英特爾不應為因其日後更改該等說明或特性描述而產生的沖突和不相容承擔任何責任。此處提供的信息可隨時更改,恕不另行通知。請勿根據本文件提供的信息完成一項產品設計。

            本文件所描述的產品可能包含使其與宣稱的規格不符的設計缺陷或失誤。這些缺陷或失誤已收錄於勘誤表中,可索取獲得。

            在發出訂單之前,請聯系當地的英特爾營業部或分銷商以獲取最新的產品規格。

            如欲獲得本文涉及的帶編號文檔的副本或其他英特爾文獻,可致電 1-800-548-4725,或訪問:http://www.intel.com/design/literature.htm
            性能測試中使用的軟件和工作負載可能僅在英特爾® 微處理器上針對性能進行了優化。諸如SYSmark和MobileMark等測試均系基於特定計算機系統、硬件、軟件、操作系統及功能。上述任何要素的變動都有可能導致測試結果的變化。請參考其他信息及性能測試(包括結合其他產品使用時的運行性能)以對目標產品進行全面評估。
            對本文件中包含的軟件源代碼的提供均依據相關軟件許可而做出,任何對該等源代碼的使用和復制均應按照相關軟件許可的條款執行。英特爾和 Intel 標識是英特爾在美國和/或其他國家的商標。
            英特爾公司 © 2012 年版權所有。所有權保留。
            * 其他的名稱和品牌可能是其他所有者的資產。


             

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved