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