在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)