Android AMS面試題

語言: CN / TW / HK

在Android面試中,經常會遇到與ActivityManagerService相關的面試題,ActivityManagerService是Activity的管理類,會延伸出很多的問題,下面總結如下:

1、簡述ActivityManagerService的作用,什麼時候初始化?

ActivityManagerService 主要負責系統中四大元件的啟動、切換、排程及應用程序的管理和排程等工作,其職責與作業系統中的程序管理和排程模組類似。

ActivityManagerService進行初始化的時機很明確,就是在SystemServer程序開啟的時候,就會初始化ActivityManagerService, 可以在SystemServer類中找到相關的啟動程式碼。

2,簡述ActivityThread和ApplicationThread,以及關係和區別

ActivityThread

ActivityThread在Android中代表Android的主執行緒,但是並不是一個Thread類。ActivityThread類是Android 程序的初始類,它的main函式是這個App程序的入口。當建立完新程序之後,main函式被載入,然後執行一個loop的迴圈使當前執行緒進入訊息迴圈。

ApplicationThread

ApplicationThread是ActivityThread的內部類, 是一個Binder物件。在此處它是作為IApplicationThread物件的server端等待client端的請求然後進行處理,最大的client就是AMS。

首先,我們看一下Activity的啟動邏輯過程:Applicationthread的ScheduleActivity通過一個叫H的Handler傳送了一個啟動Activity資訊。handleLaunchActivity接收了這個訊息,然後做處理,處理的邏輯是讓PreformLaunchActivity處理,並最終執行Activity的啟動。

3,Instrumentation是什麼,和ActivityThread是什麼關係

Instrumentation 是Android系統中一系列控制方法的集合(hook),這些方法可以在正常的生命週期之外控制Android控制元件的執行,也可以控制Andoroid如何載入應用程式。

事實上,AMS與ActivityThread之間諸如Activity的建立、暫停等的互動工作都是由Instrumentation操作的。並且每個Activity都持有一個Instrumentation物件的一個引用, 整個程序中是隻有一個Instrumentation。當startActivityForResult()呼叫之後,實際上還是呼叫了mInstrumentation.execStartActivity()。

它們之間的關係如下: AMS是大BOSS資本,負責指揮和排程的,ActivityThread是企業老闆,雖然說企業的事自己說了算,但是需要聽從AMS的指揮,而Instrumentation則是CTO,負責專案的大事小事,但是一般不拋頭露面,聽老闆ActivityThread的安排。

4,ActivityManagerService和zygote程序通訊是如何實現的

應用啟動時,Launcher程序請求AMS,AMS傳送建立應用程序請求,Zygote程序接受請求並fork應用程序。而AMS傳送建立應用程序請求呼叫的是 ZygoteState.connect() 方法,ZygoteState 是 ZygoteProcess 的內部類。

public static ZygoteState connect(LocalSocketAddress address) throws IOException { DataInputStream zygoteInputStream = null; BufferedWriter zygoteWriter = null; final LocalSocket zygoteSocket = new LocalSocket(); try { zygoteSocket.connect(address); zygoteInputStream = new DataInputStream(zygoteSocket.getInputStream()); zygoteWriter = new BufferedWriter(new OutputStreamWriter( zygoteSocket.getOutputStream()), 256); } catch (IOException ex) { try { zygoteSocket.close(); } catch (IOException ignore) { } throw ex; } return new ZygoteState(zygoteSocket, zygoteInputStream, zygoteWriter, Arrays.asList(abiListString.split(","))); } Zygote 處理客戶端請求:Zygote 服務端接收到引數之後呼叫 ZygoteConnection.processOneCommand() 處理引數,並 fork 程序。

最後通過 findStaticMain() 找到 ActivityThread 類的 main() 方法並執行,子程序就這樣啟動了。

### 5, ActivityRecord、TaskRecord和ActivityStack Android AMS主要石負責系統中四大元件的啟動、切換、排程及應用程序的管理和排程等工作,其職責與作業系統中的程序管理和排程模組相類似。

在7.0及之前,AMS通過代理模式來完成Binder通訊,而在8.0之後,AMS通過AIDL完成Binder通訊。而在通過AIDL完成Binder通訊時,會涉及ActivityRecord、TaskRecord和ActivityStack三個物件。

下面我們看幾個概念:

ActivityRecord

Activity管理的最小單位,它對應著一個使用者介面。ActivityRecord是應用層Activity元件在AMS中的代表,每一個在應用中啟動的Activity,在AMS中都有一個ActivityRecord例項來與之對應,這個ActivityRecord伴隨著Activity的啟動而建立,也伴隨著Activity的終止而銷燬。

TaskRecord

TaskRecord即任務棧, 每一個TaskRecord都可能存在一個或多個ActivityRecord,棧頂的ActivityRecord表示當前可見的介面。一個App是可能有多個TaskRecord存在。

一般情況下,啟動App的第一個activity時,AMS為其建立一個TaskRecord任務棧。特殊情況,啟動singleTask的Activity,而且為該Activity指定了和包名不同的taskAffinity, 也會為該activity建立一個新的TaskRecord。

ActivityStack

ActivityStack,ActivityStack是系統中用於管理TaskRecord的,內部維護了一個ArrayList。ActivityStackSupervisor內部有兩個不同的ActivityStack物件:mHomeStack、mFocusedStack,用來管理不同的任務。我們啟動的App對應的TaskRecord由非Launcher ActivityStack管理,它是在系統啟動第一個app時建立的。

image.png

6,ActivityManager、ActivityManagerService、ActivityManagerNative的關係

ActivityManager

ActivityManager服務是對Activity管理、執行時功能管理和執行時資料結構的封裝,程序(Process)、應用程式、服務(Service)、任務(Task)資訊等。

ActivityManagerService

是與系統所有正在執行著的Acitivity進行互動,對系統所有執行中的Activity相關資訊(Task,Memory,Service,App)進行管理和維護。

ActivityManagerService/ActivityManagerProxy

ActivityManagerNative是個抽象類,真正發揮作用的是它的子類ActivityManagerService。ActivityManagerProxy代理類是ActivityManagerNative的內部類;ActivityManager持有的是這個ActivityManagerPorxy代理物件,這樣,只需要操作這個代理物件就能操作其業務實現的方法。那麼真正實現其也業務的則是在ActivityManagerService中。

不過,ActivityManagerNative在API 26 已經過時了,現在對Activity的管理都使用的是ActivityManager。