前言
在開發android沙盒時,我們需要涉及到大量Android Framework層的知識,需要對Framework層的運行細節有深入的理解,光靠靜態看代碼我們是很難從整體把握整個Framework層,因此,能夠動態調試Framework層的代碼是我們開發沙盒的一個非常重要的前提條件。
環境
- Android Studio
我們采用android studio調試Framework - AOSP
這里你要確保已經下載和編譯好了android系統源碼,我這里選擇android4.4_r1
過程
為了成功將源碼導入android studio,我們需要為AS生成項目工程配置文件,切換到AOSP根目錄下面,依次執行:
source build/envsetup.sh
lunch 1
development/tools/idegen/idegen.sh
上述命令會在AOSP根目錄下生成名為android.ipr的文件,我們接下來用android studio打開這個文件,android studio會導入整個AOSP到工程中,如下圖:
我們接下來打開模擬器和ddms
在繼續接下來的步驟之前,這里我們簡單介紹下Java平臺的調試。Java平臺的調試是有一個規范化的標準的,那就是JPDA(Java Platform Debugger Architecture);通過 JPDA 提供的 API,開發人員可以方便靈活的搭建 Java 調試應用程序。 JPDA 主要由三個部分組成:Java 虛擬機工具接口(JVMTI),Java 調試線協議(JDWP),以及 Java 調試接口(JDI)。Java程序的調試無非就是通過一個調試器(debugger)獲取對應Java虛擬機的信息,在dalvik虛擬機內部有一個專門的jdwp線程,Android系統的adbd進程通過socket與各個虛擬機的jdwp線程進行通信,外部調試器通過adb工具與adbd通信進而完成與jdwp的通信。我們通常所說的「attach debugger」指的就是這個意思——連接到指定的需要調試的進程。
這個jdwp線程會根據AndroidManifest.xml中application標簽的屬性android:debuggable以及default.prop中的ro.debuggable屬性值來決定當前app是否可以被調試。由于虛擬機默認ro.debuggable=1,因此所有的app都可以被調試,如ddms上圖所示。
如果想詳細了解JDWP的工作細節,可以參照android源碼dalvik/vm/jdwp下面的代碼。
我們通過ddms可以看到所有的jdwp線程都連接到了主機的8700端口,因此,通過這個端口我們可以調試所有的app的java層代碼。
了解了調試原理之后,我們很自然的就會想到用android studio去連接8700這個端口,具體配置:
點擊菜單run->Edit Configurations ,添加一個遠程調試配置
接下來我們用ddms點擊選擇我們需要調試的app(這里很重要額),這里我們選擇桌面launcher,
在類ActivityManagerNative的函數StartActivity處下斷點,然后點擊工具欄那個“臭蟲”按鈕連接上DDMS,
我們點擊android桌面的任何一個icon打開一個Activity都會被斷下,如下圖所示:
從intent參數可以看出來,我們點擊打開了計算器app。
總結
通過本文我們學習了如何調試android framework層代碼,也為我們后續的沙盒開發準備一把倚天劍。