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

发布了45 篇原创文章 · 获赞 23 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Easyhood/article/details/104088477