天天看點

大廠 Framework 面試必備 Handler&Binder 面試題

前一陣子在和一位技術總監閑談中了解到,現在 Android Framework 成為頭部公司必不缺少的技術棧]之一,尤其是熟悉 Franmework 源碼的 Android 開發者,在面試中往往會占到很大的優勢

那我今天就帶來一部分有關:Framework 比較高刷的 Handler&Binder 兩塊技術點面試題分享

大廠 Framework 面試必備 Handler&Binder 面試題

Handler 篇

looper,loop() 為什麼不會阻塞主線程?

  • 因為主線程的 Looper 是在 ActivityThread 裡面準備出來,建立出來的,那麼其實我們 Android 程式也就是 Java 程式,你啟動它,進入 main 方法,執行完所有的方法,也就會退出了
  • 我們寫的代碼就是通過 Handler 驅動起來的,我們 Activity 的 onCreate、onResume、onStop 等等這些生命周期方法,包括我們的 UI 繪制的信号,這些UI繪制的事件都是通過 Handler Looper 循環内部發起的,來調用回調我們的各個 Activity,各個 Fragment 等等這樣的一些元件裡面的各個生命周期方法,我們的代碼就是在循環裡面執行的,是以不會阻塞

簡述 Handler 的實作原理

  • Android 應用是通過消息驅動運作的,在 Android 中一切皆消息,包括觸摸事件,視圖的繪制、顯示和重新整理等等都是消息
  • Handler 是消息機制的上層接口,平時開發中我們隻會接觸到 Handler 和 Message,内部還有 MessageQueue 和 Looper 兩大助手共同實作消息循環系統。

延遲消息是怎麼實作的?

  • 無論是即時消息還是延遲消息,都是計算出具體的時間,然後作為消息的 when 字段程序指派
  • 在 MessageQueue 中找到合适的位置(安排 when 小到大排列),并将消息插入到 MessageQueue 中;這樣, MessageQueue 就是一個按照消息時間排列的一個連結清單結構

為什麼 Handler 會報記憶體洩漏?

  • 因為是内部類持有外部類的對象, sendMessage 的時候會調用到 Handler 的 enqueueMessage 方法,msg.target = this; Message 會持有 handler,而 handler 持有調用 handler 的對象,是以 gc 不能回收

Binder 篇

Binder 的定向制導,如何找到目标 Binder,喚起程序或者線程呢?

Binder 實體服務其實有兩種:

  • 一是通過 addService 注冊到 ServiceManager 中的服務,比如 ActivityManagerService、PackageManagerService、PowerManagerService 等,一般都是系統服務;
  • 還有一種是通過 bindService 拉起的一些服務,一般是開發者自己實作的服務

這裡先看通過 addService 添加的被 ServiceManager 所管理的服務

ServiceManager 是比較特殊的服務,所有應用都能直接使用,因為 ServiceManager 對于 Client 端來說 Handle 句柄是固定的,都是 0,是以 ServiceManager 服務并不需要查詢,可以直接使用

Binder 為什麼會有兩棵 binder_ref 紅黑樹?

  • Binder_proc 中存在兩棵 binder_ref 紅黑樹,其實兩棵紅黑樹中的節點是複用的,隻是查詢方式不同,一個通過 Handle 句柄,一個通過 node 節點查找
  • refs_by_node 紅黑樹主要是為了 Binder驅動往使用者空間寫資料所使用的,而 refs_by_desc 是使用者空間向 Binder 驅動寫資料使用的,隻是方向問題

比如在服務 addService 的時候,binder 驅動會在在 ServiceManager 程序的 binder_proc 中查找 binder_ref 結構體

Binder 是如何做到一次拷貝的

  • 使用者空間的虛拟記憶體位址是映射到實體記憶體中的
  • 對虛拟記憶體的讀寫實際上是對實體記憶體的讀寫,這個過程就是記憶體映射

這個記憶體映射過程是通過系統調用 mmap() 來實作的 Binder借助了記憶體映射的方法,在核心空間和接收方使用者空間的資料緩存區之間做了一層記憶體映射,就相當于直接拷貝到了接收方使用者空間的資料緩存區,進而減少了一次資料拷貝

Binder機制是如何跨程序的

  • 在核心空間建立一塊接收緩存區,
  • 實作位址映射:将核心緩存區、接收程序使用者空間映射到同一接收緩存區

發送程序通過系統調用(copy_from_user)将資料發送到核心緩存區;由于核心緩存區和接收程序使用者空間存在映射關系,故相當于也發送了接收程序的使用者空間,實作了跨程序通信

就舉例這麼多了,面試題也不是幾個就能全部覆寫的,畢竟面試官不是吃素的,他會換着花樣問你;有想跳槽拿高薪的 Android 開發的朋友,我這裡分享一份 Handler、Binder 精選面試 PDF 文檔;私信發送"面試" 直達擷取;想拿高薪的人很多,就看你肯不肯努力了

面試題 PDF 文檔内容展示:

Handler 機制之 Thread

大廠 Framework 面試必備 Handler&Binder 面試題

Handler 機制之 ThreadLocal

大廠 Framework 面試必備 Handler&Binder 面試題

Handler 機制之 SystemClock 類

大廠 Framework 面試必備 Handler&Binder 面試題

Handler 機制之 Looper 與 Handler 簡介

大廠 Framework 面試必備 Handler&Binder 面試題

Android 跨程序通信 IPC 之 Binder 之 Framewor k層 C++ 篇

大廠 Framework 面試必備 Handler&Binder 面試題

Android 跨程序通信 IPC 之 Binder 之 Framework 層 Java 篇

大廠 Framework 面試必備 Handler&Binder 面試題

Android 跨程序通信 IPC 之 Binder 的補充

大廠 Framework 面試必備 Handler&Binder 面試題

Android 跨程序通信 IPC 之 Binder 總結

大廠 Framework 面試必備 Handler&Binder 面試題

小夥伴們如果有需要以上這些資料:可以私信發送“面試” 直達擷取,承諾100%免費!