0%

Android-AmS内部原理

补充文章

https://cloud.tencent.com/developer/article/1029670

AMS 主要功能

1.统一调度各个 App 的 Activity

2.内存管理

3.进程管理

Android内存管理

  • Android内存管理分为2个部分
  • 应用程序关闭之后,后台对应的进程没有真正的关闭,以便下次快速的再启动(温启动)。
  • 当系统内存不够时,Ams(ActivityManagerService)会主动根据一定的优先级规则退出优先级低的进程

关闭与退出

关闭是指进程对应的窗口不显示,而后台的进程还在保存。
Android 关闭的机制除了占用内存之外,基本上不会降低前台应用的程序。

消息分发机制
每一个App的对应一个 ActivityThread,该类初始化后就进入Looper.loop()的无限循环。

ActivityThread

1
2
3
4
5
6
7
8
public static void main(String[] args) {
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
Looper.loop();
}

之后则是靠消息分发机制运行,没有消息则会sleep,阻塞起来,直到有新的msg过来。

1
2
3
4
5
6
7
8
9
public static void loop() {
final Looper me = myLooper();
final MessageQueue queue = me.mQueue;
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}

总结:在Linux的内核调度中,如果一个线程的状态为sleep,除了占用调用本身时间之外,不占用Cpu的时间片。

1
Message msg = queue.next(); // might block

被唤醒的3种情况
定时器中断
用户按键消息(消息线程)
Binder消息(Binder线程)

温启动

温启动时由于app的进程仍然存在,只执行冷启动第二阶段流程

1、创建app对象
2、启动主进程
3、创建MainActivity
4、渲染视图
5、执行onLayout
6、执行onDraw

温启动常见场景:

1、用户双击返回键退出应用
2、app由于内存不足被回收


Android 与 Linux 配合

App 和 AmS 是运行在2个独立的 Java虚拟机(),App申请内存不会通知AmS,AmS也无法感知App申请内存。

Java虚拟机运行时,每一个 App都有各自独立的内存空间。各自独立,进程互斥。

由于 Android 底层的 Linux 的内存机制不是使用 磁盘虚拟内存,所以 RAM=实际的物理内存。
为了在 RAM 中容纳所需的一切,Android 会尝试跨进程共享 RAM 页面。

回收的系统的“”潜规则

OOM Killer

在Android中运行了一个OOM 进程,即Out Of Memory。

该进程启动时会首先向Linux内核中把自己注册为一个OOM Killer,即当Linux内核的内存管理模块检测到系统内存低的时候就会通知已经注册的OOM进程,然后这些OOM Killer就可以根据各种规则进行内存释放了,当然也可以什么都不做。

Android中的OOM Killer进程是仅仅适用于Android应用程序的,该进程在运行时,AmS需要把每一个应用程序的oom_adj值告知给Killer。这个值的范围在-16到15,值越低,说明越重要,这个值类似于Linux系统中的进程nice值,只是在标准的Linux中,有其自己的一套Killer机制。

总结:当发生低内存的条件时,Linux内核管理模块通知OOM Killer,Killer则根据AmS所告知的优先级,强制退出优先级低的应用进程