簡(jiǎn)單介紹下Android調(diào)試

億速云服務(wù)器與全球多個(gè)國家頂級(jí)機(jī)房直接合作,提供包括香港、美國、日本等國家和地區(qū)的服務(wù)器,需要的請(qǐng)聯(lián)系創(chuàng)新互聯(lián)官方客服! 優(yōu)質(zhì)的服務(wù)器租用!

鄢陵網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

今天我要分享的是Framework的學(xué)習(xí)和調(diào)試的方法。

首先,Android是一種基于Linux的開放源代碼軟件棧,為廣泛的設(shè)備和機(jī)型而創(chuàng)建。下圖是Android平臺(tái)的主要組件。
簡(jiǎn)單介紹下Android調(diào)試

從圖中你可以看到主要有以下幾部分組成:

  • Linux內(nèi)核
  • Android Runtime
  • 原生C/C++庫
  • Java API框架(后面我稱之為Framework框架層)
  • 系統(tǒng)應(yīng)用

 
  在各個(gè)應(yīng)用市場(chǎng)看到的,大多是第三方應(yīng)用,也就是安裝在data區(qū)域的應(yīng)用,它們可以卸載,并且權(quán)限也受到一些限制,比如不能直接設(shè)置時(shí)間日期,需要調(diào)用到系統(tǒng)應(yīng)用設(shè)置里面再進(jìn)行操作。
 
  在應(yīng)用開發(fā)過程中使用的四大組件,便是在Framework框架層進(jìn)行實(shí)現(xiàn),應(yīng)用通過約定俗成的規(guī)則,在AndroidMainfest.xml中進(jìn)行配置,然后繼承對(duì)應(yīng)的基類進(jìn)行復(fù)寫。系統(tǒng)在啟動(dòng)過程中解析AndroidMainfest.xml,將應(yīng)用的信息存儲(chǔ)下來,隨后根據(jù)用戶的操作,或者系統(tǒng)的廣播觸發(fā),啟動(dòng)對(duì)應(yīng)的應(yīng)用。

 
framwork 到底又那些東西?
  Framework框架層是應(yīng)用開發(fā)過程中,調(diào)用的系統(tǒng)方法的內(nèi)部實(shí)現(xiàn),比如我們使用的TextView、Button控件,都是在這里實(shí)現(xiàn)的。再舉幾個(gè)例子,我們調(diào)用ActivityManager的getRunningAppProcesses方法查看當(dāng)前運(yùn)行的進(jìn)程列表,還有我們使用NotificationManager的notify發(fā)送一個(gè)系統(tǒng)通知。

代碼源碼目錄編譯目錄
系統(tǒng)的相關(guān)Widgetframeworks/base/core/java/android, frameworks/base/core/java/android/view/system/framework/framework.jar
系統(tǒng)中的AMS/PMSframeworks/base/services/core/java/com/android/server/system/framework/services.jar
系統(tǒng)中內(nèi)置的資源文件,比如Button的背景圖、屬性值之類frameworks/base/core/res/system/framework/framework-res.apk
在系統(tǒng)開發(fā)中還會(huì)涉及到服務(wù)的對(duì)應(yīng)本地實(shí)現(xiàn)部分,比如frameworks/base/core/jni, frameworks/base/services/core/jni視情況

 
如何快速地學(xué)習(xí)、梳理Framework知識(shí)體系呢?常見的學(xué)習(xí)方法有下面幾種:

  • 閱讀書籍(方便梳理知識(shí)體系,但對(duì)于解決問題只能提供方向)。
  • 直接閱讀源碼(效率低,挑戰(zhàn)難度大)。
  • 打Log和打堆棧 (效率有所提升,但需要反復(fù)編譯,添加Log和堆棧代碼)。
  • 直接聯(lián)調(diào),實(shí)時(shí)便捷(需要調(diào)試版本)。

 
  首先可以通過購買相關(guān)的書籍進(jìn)行學(xué)習(xí),其中主要的知識(shí)體系有Linux操作系統(tǒng),比如進(jìn)程、線程、進(jìn)程間通信、虛擬內(nèi)存,建立起自己的軟件架構(gòu)。在此基礎(chǔ)上學(xué)習(xí)Android的啟動(dòng)過程、服務(wù)進(jìn)程SystemServer的創(chuàng)建、各個(gè)服務(wù)線程(AMS/PMS等)的創(chuàng)建過程,以及Launcher的啟動(dòng)過程。熟悉了這些之后,你還要了解ART虛擬機(jī)的主要工作原理,以及init和Zygote的主要工作原理。之后隨著在工作和實(shí)踐過程中你會(huì)發(fā)現(xiàn),F(xiàn)ramework主要是圍繞應(yīng)用啟動(dòng)、顯示、廣播消息、按鍵傳遞、添加服務(wù)等開展,這些代碼的實(shí)現(xiàn)主要使用的是Java和C++這兩種語言。

 
  通過書籍或者網(wǎng)絡(luò)資料學(xué)習(xí)一段時(shí)間后,你會(huì)發(fā)現(xiàn)很多問題都沒有現(xiàn)成的解決方案,而此時(shí)就需要我們深入源碼中進(jìn)行挖掘和學(xué)習(xí)。但是除了閱讀官方文檔外,別忘了調(diào)試Framework也是一把利刃,可以讓你游刃有余快速定位和分析源碼。

 
  下面我們來看看調(diào)試Framework的Java部分:

 
  這里使用 Android Studio 進(jìn)行調(diào)試,在調(diào)試前我們要先掌握一些知識(shí)。Java代碼的調(diào)試,主要依據(jù)兩個(gè)因素,一個(gè)是你要調(diào)試的進(jìn)程;一個(gè)是調(diào)試的類對(duì)應(yīng)的包名路徑,同時(shí)還要保證你所運(yùn)行的手機(jī)環(huán)境和你要調(diào)試的代碼是匹配的。只要這兩個(gè)信息匹配,編譯不通過也是可以進(jìn)行調(diào)試的。

我們調(diào)試的系統(tǒng)服務(wù)是在SystemServer進(jìn)程中,可以使用下面的命令驗(yàn)證
ps -A | grep system_server  查看系統(tǒng)服務(wù)進(jìn)程pid
cat /proc/pid/maps |grep services 通過cat查看此進(jìn)程的內(nèi)存映射,看看是否services映射到內(nèi)存里面。

 
這里我們看到信息:/system/framework/oat/x86/services.odex 。odex是Android系統(tǒng)對(duì)于dex的進(jìn)一步優(yōu)化,目的是為了提升執(zhí)行效率。從這個(gè)信息便可以確定,我們的services.jar確實(shí)是跑到這里了,也就是我們的系統(tǒng)服務(wù)相關(guān)聯(lián)的代碼,可以通過調(diào)試SystemServer進(jìn)程進(jìn)行跟蹤。

 
下來我們來建立調(diào)試環(huán)境。

  • 打開Genymotion,選擇下載好Android 9.0的鏡像文件,啟動(dòng)模擬器。
  • 找到模擬器對(duì)應(yīng)的ActivityManagerService.java代碼。 我是從http://androidxref.com/下載Android 9.0對(duì)應(yīng)的代碼。
  • 打開Android Studio,F(xiàn)ile -> New -> New Project然后直接Next直到完成就行。
  • 新建一個(gè)包名,從ActivityManagerService.java文件中找到它,這里為com.android.server.am,然后把ActivityManagerService.java放到里面即可。
  • 在ActivityManagerService.java的startActivity方法上面設(shè)置斷點(diǎn),然后找到菜單的Run -> Attach debugger to Android process勾選Show all process,選中system_server進(jìn)程確定。
    簡(jiǎn)單介紹下Android調(diào)試

這時(shí)候我們點(diǎn)擊Genymotion模擬器中桌面的一個(gè)圖標(biāo),啟動(dòng)新的界面。會(huì)發(fā)現(xiàn)這時(shí)候我們?cè)O(shè)定的斷點(diǎn)已經(jīng)生效。

簡(jiǎn)單介紹下Android調(diào)試

你可以看到斷下來的堆棧信息,以及一些變量值,然后我們可以一步步調(diào)試下去,跟蹤啟動(dòng)的流程。
簡(jiǎn)單介紹下Android調(diào)試

 
  對(duì)于學(xué)習(xí)系統(tǒng)服務(wù)線程來講,通過調(diào)試可以快速掌握流程,再結(jié)合閱讀源碼,便可以快速學(xué)習(xí),掌握系統(tǒng)框架的整個(gè)邏輯,從而節(jié)省學(xué)習(xí)的時(shí)間成本。

 
  以上我們驗(yàn)證了系統(tǒng)服務(wù)AMS服務(wù)代碼的調(diào)試,其他服務(wù)調(diào)試方法也是一樣,具體的線程信息,可以使用下面的命令查看。

ps -T 353
這里353是使用ps -A |grep system_server查出 SystemServer的進(jìn)程號(hào)

創(chuàng)新互聯(lián)的服務(wù)器不僅具有高穩(wěn)定性,高速訪問,而且易于管理,安全和輕松使用,以減少用戶在服務(wù)器維護(hù)中的能量和時(shí)間成本,并專注于自己的業(yè)務(wù)的開發(fā)和推廣。創(chuàng)新互聯(lián)服務(wù)器,致力于為用戶提供性價(jià)比最高的服務(wù)器!

網(wǎng)站標(biāo)題:簡(jiǎn)單介紹下Android調(diào)試
網(wǎng)站URL:http://bm7419.com/article38/jcedpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、ChatGPT、面包屑導(dǎo)航、云服務(wù)器、網(wǎng)頁設(shè)計(jì)公司網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司