中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

簡單介紹下Android調試

發布時間:2020-03-30 16:32:19 來源:億速云 閱讀:457 作者:三月 欄目:移動開發

億速云服務器與全球多個國家頂級機房直接合作,提供包括香港、美國、日本等國家和地區的服務器,需要的請聯系億速云官方客服! 優質的服務器租用!

今天我要分享的是Framework的學習和調試的方法。

首先,Android是一種基于Linux的開放源代碼軟件棧,為廣泛的設備和機型而創建。下圖是Android平臺的主要組件。
簡單介紹下Android調試

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

  • Linux內核
  • Android Runtime
  • 原生C/C++庫
  • Java API框架(后面我稱之為Framework框架層)
  • 系統應用

 
  在各個應用市場看到的,大多是第三方應用,也就是安裝在data區域的應用,它們可以卸載,并且權限也受到一些限制,比如不能直接設置時間日期,需要調用到系統應用設置里面再進行操作。
 
  在應用開發過程中使用的四大組件,便是在Framework框架層進行實現,應用通過約定俗成的規則,在AndroidMainfest.xml中進行配置,然后繼承對應的基類進行復寫。系統在啟動過程中解析AndroidMainfest.xml,將應用的信息存儲下來,隨后根據用戶的操作,或者系統的廣播觸發,啟動對應的應用。

 
framwork 到底又那些東西?
  Framework框架層是應用開發過程中,調用的系統方法的內部實現,比如我們使用的TextView、Button控件,都是在這里實現的。再舉幾個例子,我們調用ActivityManager的getRunningAppProcesses方法查看當前運行的進程列表,還有我們使用NotificationManager的notify發送一個系統通知。

代碼源碼目錄編譯目錄
系統的相關Widgetframeworks/base/core/java/android, frameworks/base/core/java/android/view/system/framework/framework.jar
系統中的AMS/PMSframeworks/base/services/core/java/com/android/server/system/framework/services.jar
系統中內置的資源文件,比如Button的背景圖、屬性值之類frameworks/base/core/res/system/framework/framework-res.apk
在系統開發中還會涉及到服務的對應本地實現部分,比如frameworks/base/core/jni, frameworks/base/services/core/jni視情況

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

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

 
  首先可以通過購買相關的書籍進行學習,其中主要的知識體系有Linux操作系統,比如進程、線程、進程間通信、虛擬內存,建立起自己的軟件架構。在此基礎上學習Android的啟動過程、服務進程SystemServer的創建、各個服務線程(AMS/PMS等)的創建過程,以及Launcher的啟動過程。熟悉了這些之后,你還要了解ART虛擬機的主要工作原理,以及init和Zygote的主要工作原理。之后隨著在工作和實踐過程中你會發現,Framework主要是圍繞應用啟動、顯示、廣播消息、按鍵傳遞、添加服務等開展,這些代碼的實現主要使用的是Java和C++這兩種語言。

 
  通過書籍或者網絡資料學習一段時間后,你會發現很多問題都沒有現成的解決方案,而此時就需要我們深入源碼中進行挖掘和學習。但是除了閱讀官方文檔外,別忘了調試Framework也是一把利刃,可以讓你游刃有余快速定位和分析源碼。

 
  下面我們來看看調試Framework的Java部分:

 
  這里使用 Android Studio 進行調試,在調試前我們要先掌握一些知識。Java代碼的調試,主要依據兩個因素,一個是你要調試的進程;一個是調試的類對應的包名路徑,同時還要保證你所運行的手機環境和你要調試的代碼是匹配的。只要這兩個信息匹配,編譯不通過也是可以進行調試的。

我們調試的系統服務是在SystemServer進程中,可以使用下面的命令驗證
ps -A | grep system_server  查看系統服務進程pid
cat /proc/pid/maps |grep services 通過cat查看此進程的內存映射,看看是否services映射到內存里面。

 
這里我們看到信息:/system/framework/oat/x86/services.odex 。odex是Android系統對于dex的進一步優化,目的是為了提升執行效率。從這個信息便可以確定,我們的services.jar確實是跑到這里了,也就是我們的系統服務相關聯的代碼,可以通過調試SystemServer進程進行跟蹤。

 
下來我們來建立調試環境。

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

這時候我們點擊Genymotion模擬器中桌面的一個圖標,啟動新的界面。會發現這時候我們設定的斷點已經生效。

簡單介紹下Android調試

你可以看到斷下來的堆棧信息,以及一些變量值,然后我們可以一步步調試下去,跟蹤啟動的流程。
簡單介紹下Android調試

 
  對于學習系統服務線程來講,通過調試可以快速掌握流程,再結合閱讀源碼,便可以快速學習,掌握系統框架的整個邏輯,從而節省學習的時間成本。

 
  以上我們驗證了系統服務AMS服務代碼的調試,其他服務調試方法也是一樣,具體的線程信息,可以使用下面的命令查看。

ps -T 353
這里353是使用ps -A |grep system_server查出 SystemServer的進程號

億速云的服務器不僅具有高穩定性,高速訪問,而且易于管理,安全和輕松使用,以減少用戶在服務器維護中的能量和時間成本,并專注于自己的業務的開發和推廣。億速云服務器,致力于為用戶提供性價比最高的服務器!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吐鲁番市| 岫岩| 雷山县| 修文县| 马公市| 拜泉县| 桂东县| 青河县| 札达县| 宁南县| 莆田市| 珲春市| 拜泉县| 册亨县| 胶州市| 容城县| 林州市| 德令哈市| 临澧县| 大庆市| 高雄县| 辰溪县| 连山| 桐庐县| 凤凰县| 赤城县| 佳木斯市| 墨脱县| 阿图什市| 峡江县| 山东省| 平舆县| 延津县| 旺苍县| 梓潼县| 思茅市| 丽江市| 南城县| 淮北市| 右玉县| 镇巴县|