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

做者:Xiaodong Wangphp

1.簡單介紹

衆所周知,Android* 開發者頭頂不少稱呼:設計員、程序員等,並且通常會不可避免地被稱爲故障檢修工。html

代碼中的錯誤沒法避免。所以無論您是否一開始就形成錯誤,瞭解調試工具以及怎樣迅速而有效地跟蹤並解決錯誤都很是重要。html5

鑑於此。如今的 Android 開發者必須掌握有效的調試技巧。python

本文提供了 Android 應用程序調試工具的簡單教學,用於幫助 Android SDK 以及相關工具的新手迅速入門。並在 Android x86 平臺上更有效地解決故障。linux

2.SDK 應用程序調試工具

Android SDK 提供了試應用程序所需的大多數工具。android

假設但願進行諸如單步調試代碼、查看變量值以及暫停運行應用程序的操做,則需要兼容 JDWP 的調試程序。假設使用 Eclipse。則已附帶兼容 JDWP 的調試程序,無需設置。假設使用其餘 IDE,則可以使用其附帶的調試程序並將調試程序與特殊port鏈接,使其可以和您設備上的應用程序虛擬機通訊。程序員

假設使用 ADT(Android 開發工具)插件在 Eclipse 中進行開發,則可以使用內置的 Java* 調試程序並結合 DDMS(Dalvik 調試監測程序server)來調試應用程序。shell

爲了便於訪問調試程序和 DDMS。Eclipse 以視圖形式顯示調試程序和 DDMS 功能。這些都是本身定義的 Eclipse 視圖。依據您所在的視圖顯示特定選項卡和窗體。Eclipse 還可負責爲您啓動ADB (Android Debug Bridge) 主機守護程序,從而無需手動執行該工具。假設使用其它 IDE 進行調試。則可以使用 Android SDK 提供的所有調試工具,好比 ADB、DDMS、Java 調試程序等。windows

圖 1. Dalvik 調試監測程序server網絡

藉助 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 <xmlfiles>。<xmlfiles> 變量是以空格分隔的要分析的資源的列表,可以是未編譯的資源 xml 文件或這些文件的文件夾。

工具會載入指定的 XML 文件並依據一組提早定義的規則分析它們的定義和層級。 如下是來自工具的輸出演示樣例:

$ layoutopt samples/ samples/compound.xml 7:23 The root-level <FrameLayout/> can be replaced with <merge/> 11:21 This LinearLayout layout or its FrameLayout parent is useless samples/simple.xml 7:7 The root-level <FrameLayout/> can be replaced with <merge/> 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 <merge/> -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 <merge/> 11:17 This LinearLayout layout or its FrameLayout parent is useless

 

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 配置爲client/server模式,在嵌入式設備上這樣的配置更爲常見。程序在設備上做爲server和遠程client執行。開發者的工做站與其鏈接,併發送與本地應用程序類似的調試命令。

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)有一步操做很是重要。但也很是easy被忽略。那就是在 Android 項目中激活調試標記。該操做在應用程序清單 AndroidManifest.xml 中完畢。請勿忘記對原生代碼使用適用的 SDK 版本號:

<?xml version="1.0" encoding="utf-8"?

> <manifest ...> <uses-sdk android:minSdkVersion="10"/> <application ... android:debuggable="true"> ...

 

2)在清單中啓用調試標記會本身主動以原生代碼激活調試模式。

但是,APP_OPTIM 標記也控制着調試模式。假設已在 Android.mk 中手動設置它,則檢查是否已設置其值以進行調試(並不公佈)或直接刪除它:

APP_OPTIM := debug

 

 

3)現在讓咱們配置將鏈接至設備的 GDB client。又一次編譯項目並插入設備或啓動模擬器。

執行而後離開應用程序。確保載入應用程序並且其 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

 

 

該命令不會返回消息,但是會在 obj\local\x86 文件夾建立三個文件(對於 arm 設備文件夾爲 obj\local\armeabi):

 

  • gdb.setup:這是爲 GDB client生成的配置文件。

  • app_process:該文件直接從您的設備檢索。其爲系統可執行文件,在系統啓動時啓動,並可造成分支,啓動新的應用程序。

    GBD 需要該參考文件來查找其標記。在某些方面,其爲您的應用程序的二進制輸入點。

  • libc.so:該文件也可直接從您的設備檢索。其爲 GDB 使用的 Android 標準 C 庫(一般稱爲 bionic),用於保持跟蹤執行時期間建立的所有原生線程。

5)在您的項目文件夾中,複製 obj\local\x86\gdb.setup 並將其命名爲 gdb2.setup。打開它並刪除請求 GDB client鏈接至執行於設備上的 GDB server的下面行(將由 Eclipse 自身執行):
target remote :5039

6在 Eclipse 主菜單中,轉至「Run(執行)| Debug Configurations(調試配置)...」。並在名爲 GL2JNIActivityDefault 的 C/C++ 應用程序項目中建立新的調試配置。

該配置將在您的計算機上啓動 GDB client並鏈接至設備上執行的 GDB server。

7在 Main(主菜單)選項卡中。使用瀏覽button,將項目設置爲本身的項目文件夾,將 C/C++ 應用程序設置爲指向 obj\local\ x86\app_process(可以使用絕對或相對路徑)。

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

8使用窗體底部的連接「Select other(選擇其它)...」。將啓動程序類型切換爲「Standard Create Process Launcher(標準建立進程啓動程序)」:

圖 9. 選擇首選啓動程序

9轉至調試程序文件並設置調試程序類型爲 gdbserver,將 GDB 調試程序設置爲 android-ndk-r8\toolchains\x86-4.4.3\prebuilt\windows\bin\i686-android-linux-gdb.exe 或針對 arm 平臺設置爲 android-ndk-r8\toolchains\arm-linux-androideabi-4.4.3\prebuilt\linux-x86\bin\arm-linux-androideabi-gdb,針對 arm 平臺將 GDB 命令文件需求設置爲指向位於 \obj\local\x86 或 obj\local\armeabi\ 中的 gdb2.setup 文件(使用絕對或相對路徑都可)。

圖 10. 調試程序設置面板

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

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

11現在讓咱們配置 Eclipse 以在設備上執行 GDB server。

複製 android-ndk-r8\ndk-gdb 並用文本編輯器打開它。查找下面行:
$GDBCLIENT -x `native_path $GDBSETUP`

由於 GDB client將由 Eclipse 自己執行,所以對其進行凝視:

#$GDBCLIENT -x `native_path $GDBSETUP`

12在 Eclipse 主菜單中,轉到「Run(執行)| External Tools(外部工具)| External Tools Configurations(外部工具
配置)...」,並建立新配置 GL2JNIActivity_GDB。
該配置將在設備上啓動 GDB server。

13在 Main(主菜單)選項卡上。將位置設置爲指向 android-ndk-r8 中咱們改動過的 ndk-gdb。 將工做文件夾設置爲您的應用程序文件夾位置
也可設置 Arguments(變量)文本框:

  • Verbose:具體查看 Eclipse 控制檯中發生了什麼。
  • Force:本身主動終止以前所有會話。
  • start:讓 GDB server啓動應用程序,而不是在應用程序啓動以後鏈接至應用程序。該選項在您僅調試原生代碼而非 Java 代碼時實用。

圖 12. 外部工具配置

14現在。和往常同樣啓動應用程序。

15一旦應用程序啓動,就可直接經過控制檯啓動 ndk-gdb 或啓動外部工具配置 GL2JNIActivity_GDB。該配置將啓動設備上的 GDB server。GDB server接收遠程 GDB client發送的調試命令,並在本地調試您的應用程序。

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

圖 13. 斷點設置

17最後啓動 GL2JNIActivity 默認 C/C++ 應用程序配置啓動 GDB client。它會經過套接字鏈接將調試命令從 Eclipse CDT 中繼至 GDB server。從開發者的觀點來看,這與調試本地應用程序很是類似。

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

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

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

要開始收集標準,需要在client系統上安裝英特爾 GPA System Analyzer 並將其鏈接至目標設備:

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

2啓動英特爾 GPA System Analyzer。

3確保 Android 設備經過 USB 電纜鏈接至client系統。

4在client系統檢測目標設備時。最多等待 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 是一個project工具,用於 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(實時)模式中單擊監控器button。fps 工具將監控所有正在執行的應用程序,並在屏幕上的浮動窗體中更新 fps。

圖 21. Meter-FPS 實時模式

在 Measure(測量)模式中單擊監控器button。

將顯示一個浮動窗體。當中顯示「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

相關文章與資源:

關於做者

Xiaodong Wang 是英特爾軟件及服務事業部的應用project師。

他專一於採用 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 年版權所有。

所有權保留。

* 其它的名稱和品牌多是其它所有者的資產。

相關文章
相關標籤/搜索