在Android Q中對AMS的改動

在Android Q中對AMS的改動

1.有39個檔案從am目錄刪除,大多移動到wm目錄下,主要是activityTask,activityRecord.

2.am目錄增加10個檔案,主要是broadcast,oomadj相關檔案。

3.AMS分裂

在這裏插入圖片描述

4.爲什麼把Activity,task,stack移動到WMS中

1>AMS功能越來越多

Split-Screen,Pip,freefrom multi-window
multi-display,keyguard,management

2>如果改動到Activity和window,很多情況下要同時(重複)修復到WMS和AMS
3>AMS和我WMS交互的邏輯需要再把不同的同步到

. AMS的同步要同時到很多地方
.set策要做原子操作十分困難

5.移動到WMS中的改動

1>增加RootActivityContainer,作爲root activity的容器類

.從ActivityStackSupervisor爆出
.以後會和WMS中的RootWindowContainer合併

2>增加WindowProcessController,用來和AMS同步進程狀態
3>

在這裏插入圖片描述
移除AMS同步鎖,使用mAtmService.mGloballLock

6. Offload Broadcast Quene

1>增加offloadBroadcastQuene分流重載

broadcast

.默認boot complete 廣播在這個quene
.Ap發送的廣播可以自行添加flag

Intent.FLAG_RECEIVER_OFFLOAD
//來指定放到這個quene裏面

7. 多個Activity同時處於Resume

1>在Q上multi-window/multi-display下,可以有多個Activity同事處於resume狀態
2>

/framework/base/core/java/android/app/servertransaction/

中增加
TopResumedActivityChangeltem表示top resumed activity changed callback

8. 前臺Service被細化類型

<attr name = "foregrandServiceType">
	<flag name ="dataSync" value = "0x01"/>
	<flag name ="mediaplaybacl" value = "0x02"/>
	<flag name ="phonecall" value = "0x04"/>
	<flag name ="location" value = "0x08"/>
	<flag name ="connectedpevice" value = "0x10"/>
</attr>

目前代碼中,只看到location有在使用,其他的都還沒使用

9. Detail Change

1>增加offloadBroadcastQuene分流重載

1.增加和CotentCaptureManager(Q新增)的交互,用來通知那邊Activity的狀態
2.增加registerActivityLifecycleCallback,App可以監聽Activity生命週期的變化
3.增加生命週期函數

mTopResumedActivityChanged
//當 top resume activity發生變化的時候回調

. 在Q上multi-window / multi-display 下,可以有多個Activity同時處在resume狀態

2>增加ActivityTaskManager。從原來的AMS中抽取出來用來管理task,activity 生命週期
3>增加 OomAdjuster,OomAdjProfiler用來管理adj算法

. 算法從AMS中抽出
. 在計算adj結果的時候,同事進行內存壓縮和整理

10. 內存壓縮和整理

1> 增加針對進程級別的內存壓縮機制

.在java進程進入後臺進程的時候,針對單個AP進程壓縮
.也有針對non-zygote進程壓縮

系統啓動完成時
MountService做idle磁盤整理的時候

2> 壓縮方式

. 寫入“/proc/”+pid+“relcaim”+action(file,acon,all)
. 由內核完成壓縮,並梳理空閒page

3> 減少LMK工作的次數

11. AppZygote用法

<application android : ZygotePreloadName = ". ZygotePreload"> // ①
	<uses-library android :name = "android.test.runer"/>
	<Service
		android : name = ".IsolatedService"
		android : isolatedorocess = "true" //②
		android : exported = "false"
		android : useAppZygote = "ture"> //③

這個Service會從Application Zygote中初始化出來
Application Zygote 會初始化Application class Loader
然後調用doPreload加載特定資源(比如 shared lib)
優點:多個isolated Service共用這個app zygote加快service啓動時間
缺點:多了一個App Zygote進程
實際的效果取決於Ap定義了多少isolated Service,這些Service通過app zygote預加載資源和share memory節省了多少memory

12. Broadcast Dispatcher

1> 增加BroadcastDipatcher,用來管理有序廣播的發送策略,對於較忙的Ap. 會採取延遲發送廣播的策略

在這裏插入圖片描述
如果前一個廣播處理時間超過5S,Ap超過就會添加到延遲列表中

13. 特例

1> ACTION_PRE_BOOT_COMPLETED廣播可以不觸發ANR

. 自動添加 timeoutExempt = true

14. AMS.getMemoryInfo

1> Ap只能查詢自己的 memrory info
2> 查詢間隔不能超過5min,否則查詢結果不會更新

15. Restrictions to backgrand activity starts

1> 僅僅前往Services不能叫起activity
2> 所有Ap都受這個限制
3>關閉這個功能Navigate to

①Settings > Developer Options and disable
to Allow background activity starts
②adb shell settings put global
background_activity_starts_enable 0

16.調試AMS

1> 開AMS LOG

adb shell dumpsys activity log x on

2> 打印當前Activity Stack的信息

adb shell dumpcys activity activities > stack.txt

3> 打印所有oom adj值

adb shell dumpsys activity oom > oom.txt

17.AMS主要log

. ActivityManager,ActivityTaskManager
. ActivityThread
. BroadcastQuene
.am_xx (比如 event_log中的am_proc_start)

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