前言
在開發(fā)android沙盒時茉盏,我們需要涉及到大量Android Framework層的知識,需要對Framework層的運行細(xì)節(jié)有深入的理解饿敲,光靠靜態(tài)看代碼我們是很難從整體把握整個Framework層辽幌,因此,能夠動態(tài)調(diào)試Framework層的代碼是我們開發(fā)沙盒的一個非常重要的前提條件膛堤。
環(huán)境
- Android Studio
我們采用android studio調(diào)試Framework - AOSP
這里你要確保已經(jīng)下載和編譯好了android系統(tǒng)源碼,我這里選擇android4.4_r1
過程
為了成功將源碼導(dǎo)入android studio,我們需要為AS生成項目工程配置文件晌该,切換到AOSP根目錄下面肥荔,依次執(zhí)行:
source build/envsetup.sh
lunch 1
development/tools/idegen/idegen.sh
上述命令會在AOSP根目錄下生成名為android.ipr的文件,我們接下來用android studio打開這個文件朝群,android studio會導(dǎo)入整個AOSP到工程中燕耿,如下圖:
我們接下來打開模擬器和ddms
在繼續(xù)接下來的步驟之前,這里我們簡單介紹下Java平臺的調(diào)試姜胖。Java平臺的調(diào)試是有一個規(guī)范化的標(biāo)準(zhǔn)的誉帅,那就是JPDA(Java Platform Debugger Architecture);通過 JPDA 提供的 API右莱,開發(fā)人員可以方便靈活的搭建 Java 調(diào)試應(yīng)用程序蚜锨。 JPDA 主要由三個部分組成:Java 虛擬機工具接口(JVMTI),Java 調(diào)試線協(xié)議(JDWP)慢蜓,以及 Java 調(diào)試接口(JDI)亚再。Java程序的調(diào)試無非就是通過一個調(diào)試器(debugger)獲取對應(yīng)Java虛擬機的信息,在dalvik虛擬機內(nèi)部有一個專門的jdwp線程晨抡,Android系統(tǒng)的adbd進(jìn)程通過socket與各個虛擬機的jdwp線程進(jìn)行通信氛悬,外部調(diào)試器通過adb工具與adbd通信進(jìn)而完成與jdwp的通信。我們通常所說的「attach debugger」指的就是這個意思——連接到指定的需要調(diào)試的進(jìn)程耘柱。
這個jdwp線程會根據(jù)AndroidManifest.xml中application標(biāo)簽的屬性android:debuggable以及default.prop中的ro.debuggable屬性值來決定當(dāng)前app是否可以被調(diào)試如捅。由于虛擬機默認(rèn)ro.debuggable=1,因此所有的app都可以被調(diào)試调煎,如ddms上圖所示镜遣。
如果想詳細(xì)了解JDWP的工作細(xì)節(jié),可以參照android源碼dalvik/vm/jdwp下面的代碼汛蝙。
我們通過ddms可以看到所有的jdwp線程都連接到了主機的8700端口烈涮,因此朴肺,通過這個端口我們可以調(diào)試所有的app的java層代碼窖剑。
了解了調(diào)試原理之后坚洽,我們很自然的就會想到用android studio去連接8700這個端口,具體配置:
點擊菜單run->Edit Configurations ,添加一個遠(yuǎn)程調(diào)試配置
接下來我們用ddms點擊選擇我們需要調(diào)試的app(這里很重要額)西土,這里我們選擇桌面launcher讶舰,
在類ActivityManagerNative的函數(shù)StartActivity處下斷點,然后點擊工具欄那個“臭蟲”按鈕連接上DDMS需了,
我們點擊android桌面的任何一個icon打開一個Activity都會被斷下跳昼,如下圖所示:
從intent參數(shù)可以看出來,我們點擊打開了計算器app肋乍。
總結(jié)
通過本文我們學(xué)習(xí)了如何調(diào)試android framework層代碼鹅颊,也為我們后續(xù)的沙盒開發(fā)準(zhǔn)備一把倚天劍。