android工作机制和内核,android内核剖析学习笔记:AMS(ActivityManagerService)内部原理和工作机制...

一、ActivityManagerService提供的主要功能:

(1)统一调度各应用程序的Activity

(2)内存管理

(3)进程管理

二、启动一个Activity的方式有以下几种:

(1)在应用程序中调用startActivity启动指定的Activity

(2)在Home程序中单击一个应用图标,启动新的Activity

(3)按“Back”键,结束当前Activity,返回到上一个Activity

(4)长按“Home”键,显示出当前正在运行的程序列表,从中选择一个启动

这四种启动方式的主体处理流程都会按照第一种启动方式运行,后面三种方式只是在前端消息处理上各有不同。

三、进程数据类ProcessRecord

该类的源代码在~\frameworks\base\services\java\com\android\server\am路径下。

一般情况下,一个APK文件运行时会对应一个进程,ProcessRecord用来记录一个进程中的相关信息,主要包含的变量有:

(1)进程文件信息:与该进程对应的APK文件的内部信息,如

final ApplicationInfo info; // all about the first app in the process

final String processName;   // name of the process

final ArrayMap pkgList

= new ArrayMap();   //保存进程中所有APK文件包名

(2)进程的内存状态信息:用于Linux系统的out of memory(OOM)情况的处理,当发生内存紧张时,Linux系统会根据进程的内存状态信息杀掉低优先级的进程,包括的变量有

int maxAdj;                 // Maximum OOM adjustment for this process

int curRawAdj;              // Current OOM unlimited adjustment for this process

int setRawAdj;              // Last set OOM unlimited adjustment for this process

int curAdj;                 // Current OOM adjustment for this process

int setAdj;                 // Last set OOM adjustment for this process

变量中Adj的含义是调整值(adjustment)

(3)进程中包含的Activity、Provider、Service等,如下

final ArrayList activities = new ArrayList();

final ArraySet services = new ArraySet();

final ArraySet executingServices = new ArraySet();

final ArraySet connections = new ArraySet();

final ArraySet receivers = new ArraySet();

final ArrayMap

pubProviders = new ArrayMap

ContentProviderRecord>();

final ArrayList conProviders = new ArrayList();

四、ActivityRecord数据类(Android 2.3以前版本叫HistoryRecord类)

ActivityManagerService使用ActivityRecord数据类来保存每个Activity的信息,ActivityRecord类基于IApplicationToken.Stub类,也是一个Binder,所以可以被IPC调用。

主要包含的变量有:

(1)环境信息:Activity的工作环境,比如进程名称、文件路径、数据路径、图标、主题等,这些信息一般是固定的,比如以下变量

final String packageName; // the package implementing intent's component

final String processName; // process where this component wants to run

final String baseDir;   // where activity source (resources etc) located

final String resDir;   // where public activity source (public resources etc) located

final String dataDir;   // where activity data should go

int theme;              // resource identifier of activity's theme.

int realTheme;          // actual theme resource we will use, never 0.

(2)运行状态数据信息:如idle、stop、finishing等,一般为boolean类型,如下

boolean haveState;      // have we gotten the last activity state?

boolean stopped;        // is activity pause finished?

boolean delayedResume;  // not yet resumed because of stopped app switches?

boolean finishing;      // activity in pending finish list?

boolean configDestroy;  // need to destroy due to config change?

五、TaskRecord类

ActivityManagerService中使用任务的概念来确保Activity启动和退出的顺序。

TaskRecord中的几个重要变量如下:

final int taskId;       // 每个任务的标识.

Intent intent;          // 创建该任务时对应的intent

int numActivities;   //该任务中的Activity数目

final ArrayList mActivities = new ArrayList();  //按照出现的先后顺序列出该任务中的所有Activity

六、ActivityManagerService中一些重要的与调度相关的变量

(1)记录最近启动的Activity,如果RAM容量较小,则记录的最大值为10个,否则为20个,超过该值后,Ams会舍弃最早记录的Activity

static final int MAX_RECENT_TASKS = ActivityManager.isLowRamDeviceStatic() ? 10 : 20;

(2)当Ams通知应用程序启动(Launch)某个Activity时,如果超过10s,Ams就会放弃

static final int PROC_START_TIMEOUT = 10*1000;

(3)当Ams启动某个客户进程后,客户进程必须在10s之内报告Ams自己已经启动,否则Ams会认为指定的客户进程不存在

static final int PROC_START_TIMEOUT = 10*1000;

(4)等待序列:

当Ams内部还没有准备好时,如果客户进程请求启动某个Activity,那么会被暂时保存到该变量中,

final ArrayList mPendingActivityLaunches

= new ArrayList();

(5)优先启动,其次再停止。进程A1包含两个Activity,启动顺序为A1->A2,当用户请求启动A2时,如果A1正在运行,Ams会先暂停A1,然后启动A2,当A2启动后再停止A1。

private final ArrayList mRecentTasks = new ArrayList();

七、startActivity()的流程

当用户单击某个应用图标后,执行程序会在该图标的onClick()事件中调用startActivity()方法,该方法会调用

startActivityForResult(),在这个方法内部会调用Instrumentation对象的

executeStartActivity()方法,每个Activity内部都有一个Instrumentation对象的引用,它就是一个管

家,ActivityThread要创建或者暂停某个Activity都是通过它实现的。

流程图如下所示:

61503516_1

下面附上ActivityManagerService的完整源代码,有兴趣的童鞋可以深入研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从.Net到Java学习第四篇——spring boot+redis

从.Net到Java学习系列目录 “学习java已经十天,有时也怀念当初.net的经典,让这语言将你我相连,怀念你......”接上一篇,本篇使用到的框架redis、FastJSON。 环境准备 安装redis,下图是我本机的redis绿色版,…

hdu 4409 Family Name List LCA +stl

http://acm.hdu.edu.cn/showproblem.php?pid4409 赛后才过只能说悲剧了,知道思路,stl不熟悉,所以导致写的很慢....占据了很多时间,手速代码准确度。。哎。。。 题意: 给你一个家谱,n个人的姓名&#xff0c…

mysql杂记

1、 mysql安装完成后需要将mysql里面的bin目录加到环境变量里之后,才能在cmd窗口里使用mysql命令 2、 在CMD命令窗口敲入命令 mysql -hlocalhost -uroot -ppassword进入mysql数据库 这里我的用户名是root,密码是123456 转载于:https://www.cnblogs.com/y…

android包名更换后升级方案,Android增量升级方案

背景随着业务的发展,安装包的体积也在不断的增大,这时候,如果要版本更新,用户不得不去下载完整的安装包。但是如果使用增量升级方案,用户只需要下载新旧版本的差异包,然后在本地合成就行,这样省…

Linux 学习 Ubuntu 12.04 配置指南

关于Ubuntu 就不在此详细的叙述, 安装方法: 硬盘安装,速度效果都还不错 http://www.nenew.net/ubuntu-12-04-hard-disk-install-tutorial.html 详细的方法可以去这里看一下 U盘安装:这个就更加的简单,我一般都是使用 U…

vue created 生命周期

在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el属性目前不可见。 methods、data、watch等可以…

android cne服务,Android内存优化-了解内存篇

查看系统内存文件shellaries:/ $ cat /proc/meminfoMemTotal: 1970216 kBMemFree: 83756 kBBuffers: 156020 kBCached: 702516 kBSwapCached: 0 kBActive: 1160284 kBInactive: 397932 kBActive(anon): 778932 kBInactive(anon): 2228 kBActive(file): 381352 kBInactive(file)…

《鸟哥的linux私房菜-服务器篇 第三版》 RHCA亲授

经典再现,《鸟哥的linux私房菜-服务 器篇(第三版)》远程班隆重推出! 鸟哥的linux的私房菜是linux教材中的 经典中的经典!是学习linux的绝佳资 料! 上课时间: 周一到周五 上课方式:全…

装饰者模式

装饰者模式的实现有两个要求:1.装饰者类与目标类要实现相同的借口,或者继承自相同的抽象类。2.装饰者类中要有目标类的引用作为成员变量,具体的赋值一般通过带参构造器完成。 按着这两个要求我们进行类的编写。 目标类: //接口 pa…

子弹类

import pygame # pygame2d游戏 import time from pygame.locals import *class HeroPlane(object):def __init__(self,screen_temp):self.x210self.y700self.screenscreen_tempself.image pygame.image.load("./feiji/hero1.png")self.bullet_list[]def display(sel…

Shell中的特殊字符

通配符 当需要用命令处理一组文件,例如file1.txt、file2.txt、file3.txt……,用 户不必一一输入文件名,可以使用Shell通配符。Shell命令的通配符含义如下表 引号 在 Shell 中引号分为 2 种:单引号、双引号。 ( 1 &…

树莓派换源、vim更新:树莓派更换国内可用镜像源

参考:树莓派vim更新:树莓派更换国内可用镜像源 作者:丶PURSUING 发布时间:2021-02-01 22:40:48 网址:https://blog.csdn.net/weixin_44742824/article/details/113530423?spm1001.2014.3001.5502 Ubuntu18.04换源更新…

android的帧布局,七、Android帧布局FrameLayout和霓虹灯效果

帧布局容器为每个加入其中的组件创建一个空白的区域(称为一帧),所有每个子组件占据一帧,这些帧都会根据gravity属性执行自动对齐。FrameLayout的常用XML属性和相关方法XML属性相关方法说  明android:foregroundsetForeground(Drawable)设置该帧布局容器…

flutter能开发游戏吗_Steam上架游戏开发软件,不用代码也能制作游戏,而且还是免费的...

时代在变化,科技在进步,曾几何时我们一度以为的高科技,在现在看来也不过是平常到不能再平常的东西。游戏开发也一样,以前需要代码才能开发制作而成,现如今都不需要了,直接编辑就OK,Steam商城这次…

Flask之flask-session

简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保存数据的一种工具,五大类型。非关系型数据库memcachedfilesy…

快速构建Windows 8风格应用10-设备方向

本篇博文主要介绍常用支持Windows 8操作系统设备的方向、如何获取当前设备方向、DisplayProperties类 常用支持Windows 8操作系统设备的方向在我们常用的设备当中,Windows 8是通过什么来监控设备方向呢?答案是方向传感器,那么对于设备的不同方…

android viewpager fragment传值,Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题...

前言之前在做一个Viewpager上面加载多个Fragment时总会实例化已经创建好的Fragmnet对象类似viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {Overridepublic Fragment getItem(int position) {switch(position){case 0:fragmentsnew Fragmnet01(…

CSDN怎么转载别人的博客

参考:CSDN怎么转载别人的博客 作者:zhongjianblackberry 发布时间:2018-03-06 11:57:59 网址:https://blog.csdn.net/zhongjianblackberry/article/details/79456338 目录转载CSDN博客步骤:Markdown和HTML相关小知识Ma…

青岛西海岸惠普大数据_青岛西海岸新区用好卫星大数据 为城市治理全面赋能...

来源:环球网为推进城市治理数字化程度,提升城市治理的智能化和精细化水平,青岛西海岸新区搭建了人工智能搜索视觉分析平台,以月度更新的频率,汇聚了新区0.5米高分辨率卫星影像数据,通过数据资源共享系统为各…

总结jenkins Android自动打包遇到的坑

一、ndk-build报错 [roothejianlai-jenkins LearnGradle]# ndk-build /usr/local/android-ndk-r8/ndk-build: /usr/local/android-ndk-r8/prebuilt/linux-x86/bin/make: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 解决方法:安装glibc.i6…