Android源代碼分析之類方法與組件名詞解釋(持續更新)

1. 類方法

1.1 Handler方法

子線程與主線程的消息傳送的方法,用於向消息隊列中插入消息。在子線程中刷新UI,會造成UI更新衝突,線程不安全。

序號 方法描述
1 public final boolean sendMessage (Message msg)。發送消息,返回是否發送成功
2 public void handleMessage(Message msg)。接收消息,用於更新UI

1.2 Looper方法

無限循環方法,用於封裝消息循環和消息隊列的類,用於在線程中進行消息處理。

序號 方法描述
1 private static void prepare(boolean quitAllowed)。創建一個消息循環
2 public static void loop()。開始循環

1.3 Binder

Android進程間的通信機制,與傳統的進程間通信機制相比,Binder進程間通信機制在進程間傳輸數據時,只需要執行一次拷貝操作,不僅提高了效率,而且節省了內容空間。

序號 方法描述
1 public static final int getCallingPid()。獲取遠程Binder調用端的pid
2 public static final native long clearCallingIdentity()。清除遠程Binder調用端uid和pid信息,返回origId變量
3 public static final int getCallingPid()。獲取遠程Binder調用端的uid
4 public static final native void restoreCallingIdentity(long token)。通過origId變量,還原遠程Binder調用端的uid和pid信息

1.4 Instrumentation

具有跟蹤application及activity生命週期的功能,用於android 應用測試框架中,被做爲基類使用。
Instrumentation可以把測試包和目標測試應用加載到同一個進程中運行。既然各個控件和測試代碼都運行在同一個進程中了,測試代碼當然就可以調用這些控件的方法了,同時修改和驗證這些控件的一些數據。
Android instrumentation是Android系統裏面的一套控制方法或者“鉤子”。這些鉤子可以在正常的生命週期(正常是由操作系統控制的)之外控制Android控件的運行。

序號 方法描述
1 public void callActivityOnCreate(Activity activity, Bundle icicle)。鉤住了本應該系統調用的onCreate方法,然後由用戶自己來控制勾住的這個方法什麼時候執行
2 public void callActivityOnDestroy(Activity activity)。鉤住了本應該系統調用的onDestroy方法
3 public void callActivityOnStart(Activity activity)。鉤住了本應該系統調用的onStart方法

2. 組件

2.1 AMS、WMS、Window

Android的framework層主要是由AMS、 WMS和View構成,其中AMS和WMS屬於Android中的系統服務。

2.1.1 AMS作用

  1. 統一調度所有應用程序的Activity的生命週期;
  2. 啓動或殺死應用程序的進程;
  3. 啓動並調度Service的生命週期;
  4. 註冊BroadcastReceiver,並接收和分發Broadcast;
  5. 啓動併發布ContentProvider;
  6. 調度task;
  7. 處理應用程序的Crash;
  8. 查詢系統當前運行狀態。

2.1.2 WMS作用

  1. 爲所有窗口分配Surface。客戶端向WMS添加一個窗口的過程,其實就是WMS爲其分配一塊Surface的過程,一塊塊Surface在WMS的管理下有序的排布在屏幕上。Window的本質就是Surface。
  2. 管理Surface的顯示順序、尺寸、位置;
  3. 管理窗口動畫;
  4. 輸入系統相關:WMS是派發系統按鍵和觸摸消息的最佳人選,當接收到一個觸摸事件,它需要尋找一個最合適的窗口來處理消息,而WMS是窗口的管理者,系統中所有的窗口狀態和信息都在其掌握之中。

2.1.3 Window作用

與窗口相關,窗口是一個抽象的概念,從用戶的角度來講,它是一個界面;從SurfaceFlinger的角度來看,它是一個Layer,承載着和界面有關的數據和屬性;從WMS角度來看,它是一個WindowState,用於管理和界面有關的狀態。

2.1.4 Activity與Window

  1. Activity只負責生命週期和事件處理;
  2. Window只控制視圖;
  3. 一個Activity包含一個Window,如果Activity沒有Window,那就相當於Service。

2.1.5 AMS與WMS

  1. AMS統一調度所有應用程序的Activity;
  2. WMS控制所有Window的顯示與隱藏以及要顯示的位置。

2.2 DVM、ART、JVM

2.2.1 Dalvik虛擬機( Dalvik Virtual Machine,DVM)

DVM是Google專門爲Android平臺開發的虛擬機,它運行在Android運行時庫中。DVM並不是一個Java虛擬機(以下簡稱JVM)。

2.2.2 Android虛擬機(Android Runtime,ART)

Android 4.4發佈,用來替換Dalvik虛擬技,Android 4.4默認採用的還是DVM,系統會提供一個選項來開啓ART。在Android 5.0時,默認採用ART,DVM從此退出歷史舞臺。

2.2.3 Java虛擬機(Java Virtual Machine,JVM)

Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。

2.2.4 DVM與JVM的區別

  1. JVM基於棧則意味着需要去棧中讀寫數據,所需的指令會更多,這樣會導致速度慢,對於性能有限的移動設備,顯然不是很適合。DVM是基於寄存器的,它沒有基於棧的虛擬機在拷貝數據而使用的大量的出入棧指令,同時指令更緊湊更簡潔。但是由於顯示指定了操作數,所以基於寄存器的指令會比基於棧的指令要大,但是由於指令數量的減少,總的代碼數不會增加多少;
  2. 在Java SE程序中,Java類會被編譯成一個或多個.class文件,打包成jar文件,而後JVM會通過相應的.class文件和jar文件獲取相應的字節碼。執行順序爲: .java文件 -> .class文件 -> .jar文件而DVM會用dx工具將所有的.class文件轉換爲一個.dex文件,然後DVM會從該.dex文件讀取指令和數據。執行順序爲:.java文件 –>.class文件-> .dex文件。

2.2.5 ART與DVM的區別

  1. DVM中的應用每次運行時,字節碼都需要通過即時編譯器(JIT,just in time)轉換爲機器碼,這會使得應用的運行效率降低。而在ART中,系統在安裝應用時會進行一次預編譯(AOT,ahead of time),將字節碼預先編譯成機器碼並存儲在本地,這樣應用每次運行時就不需要執行編譯了,運行效率也大大提升;
  2. 與DVM的GC不同的是,ART的GC類型有多種,主要分爲Mark-Sweep GC和Compacting GC。ART的運行時堆的空間根據不同的GC類型也有着不同的劃分,如果採用的是Mark-Sweep GC,運行時堆主要是由四個Space和多個輔助數據結構組成。

2.3 Content Providers

用於在不同的應用程序之間進行數據共享, Content Providers組件是運行在一個獨立的應用程序中,即 它本身也是一個Android應用程序。組件一次傳遞給業務層中的Android應用程序的數據的量可能會非常大的,結合Binder進程間通信機制以及匿名共享內存機制,Content Providers組件就可以高效的將它裏面的數據傳遞給業務層中的Android應用程序訪問了。

2.4 TLS(Transport Layer Security)

HTTPS依賴一種實現方式,目前通用的是SSL,數字證書是支持這種安全通信的文件。另外有SSL衍生出TLS和WTLS,前者是IEFT將SSL標準化之後產生的(TLS1.0),與SSL差別很小,後者是用於無線環境下的TSL。
Android5.0開始默認啓用了TLSv1.1和TLSv1.2,但是從Android4.1開始TLSv1.1和TLSv1.2其實就被支持了,只是默認沒有啓用。
Android P的應用程序要求默認使用加密連接,將禁止 App 使用所有未加密的連接,無論是接收或者發送流量,未來都不能明碼傳輸,需要使用下一代(Transport Layer Security)傳輸層安全協議,而 Android Nougat 和 Oreo 則不受影響。

2.5 應用程序二進制接口(Application binary interface,ABI)

ABI定義了一套規則,允許編譯好的二進制目標代碼能在所有兼容該ABI的操作系統中無需改動就能運行。不同的Android手機使用不同的CPU,因此需要提供對應的二進制接口交互規則(即對應的ABI文件)才能進行交互。部分CPU是能支持多種交互規則,但這是在犧牲性能的前提下所做的兼容。主流的ABI架構:

  1. armeabiv-v7a: 第7代及以上的 ARM 處理器。2011年以後的生產的大部分Android設備都使用它;
  2. arm64-v8a: 第8代、64位ARM處理器,很少設備,三星 Galaxy S6是其中之一;
  3. armeabi: 第5代、第6代的ARM處理器,早期的手機用的比較多;
  4. x86: 平板、模擬器用得比較多;
  5. x86_64: 64位的平板。

2.6 BOOT_COMPLETED廣播-自啓動

  1. 在ActivityManagerService中由系統發送;
  2. 應用可以監聽該廣播,成爲自啓動權限,但是這樣會有很多缺點,最大的缺點就是拖慢開機進度,影響用戶體驗;
  3. 開機狀態會sys.boot_completed,可以通過該屬性狀態得到開機狀態。

3. 另附兩篇Application源碼分析過程中的文章

  1. Android Applicaion組件創建的源代碼分析.https://blog.csdn.net/qq_26906345/article/details/103693846。
  2. 部分源代碼詳解.
    https://blog.csdn.net/qq_26906345/article/details/103695560。

4. 參考文章

[1]: Android的Handler的簡單理解和使用. https://blog.csdn.net/weixin_43548748/article/details/91128791.
[2]: Android消息處理機制:Handler中sendMessage()方法的幾種重載方法. https://blog.csdn.net/fansl410k/article/details/79425765.
[3]: Android系統服務 —— WMS與AMS. https://www.jianshu.com/p/47eca41428d6.
[4]: Android源碼的Binder權限控制. https://blog.csdn.net/bbmcdull/article/details/52046690.
[5]: Binder進程間通信系統. Android系統源代碼情景分析.
[6]: Android進階(三):Application啓動過程(最詳細&最簡單). https://www.jianshu.com/p/4a8f44b6eecb.
[7]: Application初始化過程,基於android10. https://juejin.im/post/5ddb6b0de51d4523307fca86.
[8]: Android內存優化:DVM和ART原理初探. https://blog.csdn.net/weixin_42336002/article/details/80610555.
[9]: Content Provider組件的實現原理. Android系統源代碼情景分析.
[10]: Android HTTPS、TLS版本支持相關解決方案. https://blog.csdn.net/devrecord/article/details/88580235.
[11]: 不同版本的TLS在Android中的支持情況. https://blog.csdn.net/yanzhenjie1003/article/details/80202476.
[12]: 加密傳輸纔是王道!谷歌在 Android P 上默認啓用 TLS. https://www.oschina.net/news/95202/dns-over-tls-support-in-android-p.
[13]: Android instrumentation原理. https://blog.csdn.net/a19891024/article/details/54342799.
[14]: Instrumentation的理解. https://www.jianshu.com/p/5a7768f22b36.
[15]: Android ABI的淺析. https://www.jianshu.com/p/d2119b3880d8.
[16]: 關於BOOT_COMPLETED廣播-自啓動. https://www.jianshu.com/p/679dc03ee650.
[17]: PackageManagerService原理分析文章合集. https://www.douban.com/note/726553288/.
[18]: PackageManagerService服務框架詳解. https://www.jianshu.com/p/ef058fcfcd30.
[19]: Android 插件化原理解析——Hook機制之AMS&PMS.https://www.jianshu.com/p/8632fdc86009.
[20]: 一篇文章看明白 Android PackageManagerService 工作流程.https://blog.csdn.net/freekiteyu/article/details/82774947.

發佈了37 篇原創文章 · 獲贊 63 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章