ActivityManagerService启动过程分析
之前讲Android的View的绘制原理和流程的时候,讲到过在Android调用setContentView之后,Android调用了一个prepreTravle的方法,这里面就提到了ActivityManagerService。
ActivityManagerService提供的主要功能:
(1)统一调度各应用程序的Activity
(2)内存管理
(3)进程管理
上一篇我们分析Android启动过程的文章中我们分析到了SystemServer,当时我们只是简单的描述了下,Android启动过程分析,我们还是来看一张启动的流程图,
System Server代码位于://frameworks\base\services\java\com\android\server\SystemServer.java
我们来看一段启动的代码:
private void run() { // 准备SystemServer运行环境:设置线程优先级,创建主线层Looper,ActivityThread和SystemContext android.os.Process.setThreadPriority(); Looper.prepareMainLooper(); // 创建systemserver上进程的ActivityThread和SystemContext createSystemContext(); // 增加SystemServiceManager:统一管理system services的创建,启动和生命周期,多用户切换 mSystemServiceManager = new SystemServiceManager(mSystemContext); // Start services. // 1.创建AMS mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); // Start the Power Manager service mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class); // Start the package manager service mPackageManagerService = PackageManagerService.main(); // 2.将SystemServer进程可加到AMS中调度管理 mActivityManagerService.setSystemProcess(); // 3.将相关provider运行在systemserver进程中:SettingsProvider mActivityManagerService.installSystemProviders(); // final Watchdog watchdog = Watchdog.getInstance(); watchdog.init(context, mActivityManagerService); // Start Window Manager wm = WindowManagerService.main(); // 4.直接保存wms对象,与WMS交互 mActivityManagerService.setWindowManager(wm); // 5.通过WMS 弹出“正在启动应用”框 // R.string.android_upgrading_starting_apps ActivityManagerNative.getDefault().showBootMessage(); // 6. AMS作为Framework核心,做好准备就绪后就开始启动应用层,和对AMS有依赖的服务 mActivityManagerService.systemReady(new Runnable(){ //启动SystemUI startSystemUi(context); //启动WatchDog监控核心服务状态 Watchdog.getInstance().start(); // mmsServiceF.systemRunning(); }); // Loop forever. Looper.loop(); }
上面的6个步骤就是SystemServer中关于AMS的调用,完成AMS的创建和系统的初始化,以及与WMS交互等流程。
一、ActivityManagerService 创建过程
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
通过SystemServiceManager这样一个模板类来创建运行在SystemServer中的Framework服务。并将创建的服务统一保存在队列管理。
public ActivityManagerService(Context systemContext) { // 1.系统Context 和 ActivityThread (将systemserver进程作为应用进程管理) mContext = systemContext; mFactoryTest = FactoryTest.getMode(); mSystemThread = ActivityThread.currentActivityThread(); // 2.AMS工作的线程和Handler,处理显示相关的UiHandler ---》知识点HandlerThread和Handler mHandlerThread = new ServiceThread(TAG, android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); mHandlerThread.start(); mHandler = new MainHandler(mHandlerThread.getLooper()); mUiHandler = new UiHandler(); // 3. 广播队列BroadcastQueue初始化:前台广播队列和后台广播队列 mFgBroadcastQueue = new BroadcastQueue(this, mHandler,"foreground", BROADCAST_FG_TIMEOUT, false); mBgBroadcastQueue = new BroadcastQueue(this, mHandler,"background", BROADCAST_BG_TIMEOUT, true); mBroadcastQueues[0] = mFgBroadcastQueue; mBroadcastQueues[1] = mBgBroadcastQueue; // 4. Service 和 Provider 管理 mServices = new ActiveServices(this); mProviderMap = new ProviderMap(this); // 5.系统数据存放目录:/data/system/ File dataDir = Environment.getDataDirectory(); File systemDir = new File(dataDir, "system"); systemDir.mkdirs(); // 电池状态信息,进程状态 和 应用权限管理 mBatteryStatsService = new BatteryStatsService(systemDir, mHandler); mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats")); mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler); // 6.多用户管理 mStartedUsers.put(UserHandle.USER_OWNER, new UserState(UserHandle.OWNER, true)); mUserLru.add(UserHandle.USER_OWNER); updateStartedUserArrayLocked(); // 7.最近任务,Activity,Task管理 mRecentTasks = new RecentTasks(this); mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks); mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks); // 创建一个新线程,用于监控和定时更新系统CPU信息,30分钟更新一次CPU和电池信息 mProcessCpuTracker.init(); mProcessCpuThread = new Thread("CpuTracker") {} // 加入Watchdog监控起来 Watchdog.getInstance().addMonitor(this); Watchdog.getInstance().addThread(mHandler); }
二、将SystemServer进程可加到AMS中调度管理
public void setSystemProcess() { // 将服务加入到ServiceManager中 ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true); ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats); ServiceManager.addService("meminfo", new MemBinder(this)); ServiceManager.addService("gfxinfo", new GraphicsBinder(this)); ServiceManager.addService("dbinfo", new DbBinder(this)); // 设置application info LoadedApkinfo 有关 framework-res.apk ApplicationInfo info = mContext.getPackageManager().getApplicationInfo( "android", STOCK_PM_FLAGS); mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader()); //给SystemServer进程创建ProcessRecord,adj值,就是将SystemServer进程加入到AMS进程管理机制中,跟应用进程一致 synchronized (this) { ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0); app.persistent = true; app.pid = MY_PID; app.maxAdj = ProcessList.SYSTEM_ADJ; app.makeActive(mSystemThread.getApplicationThread(), mProcessStats); synchronized (mPidsSelfLocked) { mPidsSelfLocked.put(app.pid, app); } updateLruProcessLocked(app, false, null); updateOomAdjLocked(); } }
这一步就是给SystemServer进程创建ProcessRecord,adj值,就是将SystemServer进程加入到AMS进程管理。
三、创建运行在SystemServer进程中Provider
mActivityManagerService.installSystemProviders();
取出进程名为"system",user_id为SYSTEM_UID的进程信息 ,生成运行在system进程中的providerInfo,并交给上下文的Provider。这段代码的任务就是查询与安装Content Provider并且发布,其中查询出来的provider为SettingsProvider
public final void installSystemProviders() { List<ProviderInfo> providers; synchronized (this) { //取出进程名为"system",user_id为SYSTEM_UID的进程信息 ProcessRecord app = mProcessNames.get("system", Process.SYSTEM_UID); //生成运行在system进程中的providerInfo,表示一个Content Provider。 providers = generateApplicationProvidersLocked(app); if (providers != null) { for (int i=providers.size()-1; i>=0; i--) { ProviderInfo pi = (ProviderInfo)providers.get(i); //过滤掉非系统apk if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) { Slog.w(TAG, "Not installing system proc provider " + pi.name + ": not system .apk"); providers.remove(i); } } } } if (providers != null) { //安装provider mSystemThread.installSystemProviders(providers); } //监听Settings数据库变化。 mCoreSettingsObserver = new CoreSettingsObserver(this); //mUsageStatsService.monitorPackages();
四、AMS systemReady过程
mActivityManagerService.systemReady();
发送ACTION_PRE_BOOT_COMPLETE方法,清理启动的persistent进程,读取Settings配置,运行runnable接口,启动SystemUI,启动persistent应用程序,启动home,发送ACTION_BOOT_COMPLETE广播
public void systemReady(final Runnable goingCallback) { synchronized(this) { if (mSystemReady) { goingCallback.run(); } …… // 1.升级相关处理:发送PRE_BOOT_COMPLETED广播 等待升级处理完成才能继续 // Check to see if there are any update receivers to run. if (!mDidUpdate) { // 等待升级完成,否则直接返回 if (mWaitingUpdate) { return; } // 发送PRE_BOOT_COMPLETED广播 final ArrayList<ComponentName> doneReceivers = new ArrayList<ComponentName>(); mWaitingUpdate = deliverPreBootCompleted(new Runnable() { // 等待所有接收PRE_BOOT_COMPLETED广播者处理完毕 public void run() { synchronized (ActivityManagerService.this) { mDidUpdate = true; } showBootMessage(mContext.getText( R.string.android_upgrading_complete), false); // 将系统版本号和处理过的广播写入文件:/data/system/called_pre_boots.dat文件 writeLastDonePreBootReceivers(doneReceivers); // 继续systemReady流程 systemReady(goingCallback); } }, doneReceivers, UserHandle.USER_OWNER); if (mWaitingUpdate) { return; } mDidUpdate = true; } mSystemReady = true; } // 2. 收集已经启动的进程并杀死,除过persistent常驻进程 ArrayList<ProcessRecord> procsToKill = null; synchronized(mPidsSelfLocked) { for (int i=mPidsSelfLocked.size()-1; i>=0; i--) { ProcessRecord proc = mPidsSelfLocked.valueAt(i); if (!isAllowedWhileBooting(proc.info)){ if (procsToKill == null) { procsToKill = new ArrayList<ProcessRecord>(); } procsToKill.add(proc); } } } synchronized(this) { if (procsToKill != null) { for (int i=procsToKill.size()-1; i>=0; i--) { ProcessRecord proc = procsToKill.get(i); Slog.i(TAG, "Removing system update proc: " + proc); removeProcessLocked(proc, true, false, "system update done"); } } // Now that we have cleaned up any update processes, we // are ready to start launching real processes and know that // we won't trample on them any more. mProcessesReady = true; } // 3.系统准备好后回调传入的Runnable: if (goingCallback != null) goingCallback.run(); // 4. 发送账户启动的广播,涉及多用户 long ident = Binder.clearCallingIdentity(); Intent intent = new Intent(Intent.ACTION_USER_STARTED); broadcastIntentLocked(intent); intent = new Intent(Intent.ACTION_USER_STARTING); broadcastIntentLocked(intent); Binder.restoreCallingIdentity(ident); // 5. 启动桌面Home Activity mBooting = true; startHomeActivityLocked(mCurrentUserId, "systemReady"); mStackSupervisor.resumeTopActivitiesLocked(); }
参考:
http://www.cnblogs.com/bastard/p/5770573.html
http://blog.csdn.net/u010083774/article/details/50620355
ActivityManagerService启动过程分析的更多相关文章
- 开机SystemServer到ActivityManagerService启动过程分析
开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /** ...
- [Android5.1]ActivityManagerService启动过程分析
ActivityManagerService(简称AMS)是Android系统的关键服务之中的一个.它的主要作用例如以下: 管理系统中全部应用进程的整个生命周期 管理应用进程中的Activity.Se ...
- Activity启动过程分析
Android的四大组件中除了BroadCastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadCastReceiver来说,它既可以在AndroidMa ...
- startActivity启动过程分析(转)
基于Android 6.0的源码剖析, 分析android Activity启动流程,相关源码: frameworks/base/services/core/java/com/android/serv ...
- ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]
入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...
- 【Android】应用程序Activity启动过程分析
在Android系统中,有两种操作会引发Activity的启动,一种用户点击应用程序图标时,Launcher会为我们启动应用程序的主Activity:应用程序的默认Activity启动起来后,它又可以 ...
- Neutron分析(2)——neutron-server启动过程分析
neutron-server启动过程分析 1. /etc/init.d/neutron-server DAEMON=/usr/bin/neutron-server DAEMON_ARGS=" ...
- linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)
回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...
- Spark Streaming应用启动过程分析
本文为SparkStreaming源码剖析的第三篇,主要分析SparkStreaming启动过程. 在调用StreamingContext.start方法后,进入JobScheduler.start方 ...
随机推荐
- vue项目开发中遇到的问题总结--内部分享
1.路由变化页面数据不刷新问题 这种情况一般出现在vue-router的history模式下,初次进入会执行钩子函数,再次进入时则不会. 解决方案: 监听路由变化 watch : { "$ ...
- pentaho cde 自定义复选下拉框 checkbox select
pentaho 自带的component 虽多,但是当用户需要在一个表格中查看多个组别的数据时,pentaho自带的单选框就不能实现了,所以复选下拉框势在必行,实现效果如下: 实现原理是借用了jqu ...
- Linux下查看alert日志文件的两种方法
--linux下查看alert日志文件的两种方法: --方法1: SQL> show parameter background_dump_dest; NAME TYPE VALUE ------ ...
- AnyConnect使用说明(电脑版Windows)
一.下载客户端 Anyconnect支持Windows.Mac电脑. 二.安装 1.双击打开下载的文件,点“Next”开始安装. 2.选择“I accept …”,再点下一步. 3.点“Install ...
- ACM 最小公倍数
给定两个正整数,计算这两个数的最小公倍数. Input 输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.Output对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行. ...
- Go 语言基础语法
Go 标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.如以下 GO 语句由 6 个标记组成: fmt.Println("Hello, World!") ...
- Objective-C的继承与组合
Objective-C的继承与组合 Objective-C与Java继承上的区别 区别 Objective-C Java 成员变量 Objective-C继承不允许子类和父类拥有相同名称的成员变量 J ...
- Android简易实战教程--第四十一话《vitamio网络收音机》
在Android初级教程专栏里面,介绍了Android原生的VideoView和vitamio框架Android视频媒体相关,VideoView和开源框架vitamio.并演示了播放网络视频的对应的D ...
- ant编译mysql驱动
修改驱动源码后需要重新编译构建,由于mysql编译需要两个jdk版本且还需要hibernate4和junit,这里记录下. 安装ant. 配置两个jdk,5和8.并修改build.xml配置,如下: ...
- REFRESH删除POSTGRESQL
sudo apt-get install python-psycopg2sudo apt-get install postgresql sudo su - postgres createuser -- ...