源码基于Android 4.4。
 
system_server的初始化
system_server受AMS管理,负责启动framework-res.apk和SettingsProvider.apk。system_server调用AMS接口初始化需要的成员。
 

system_server.java::ServerThread.run()


context = ActivityManagerService.main();                         //获得一个context,提供给system_server做运行环境
——AThread thr = new AThread().start();                          //创建AMS对象,此线程名为ActivityManager
————new ActivityManagerService();
————Lopper.loop();                                                     //消息循环
——ActivityManagerService m = thr.mService;                                             //通过运行AThread得到的AMS实例
——mSelf = m;
——ActivityThread at = ActivityThread.systemMain();      //创建ActivityThread对象,提供给system_server做运行环境
————ActivityThread thread = new ActivityThread();
————thread.attach();                                                   //创建Instrumentation,Application和Context(ContextImpl)对象。一个进程支持多个Application,保存在mApplications中
——————app.onCreate();                                           //调用Application的onCreate函数
——m.mContext = at.getSystemContext();                      //得到一个system的Context对象,单例模式(只有为null的时候才会初始化)
————LoadedApk info = newLoadApk();                      //代表一个加载到系统中的apk
————context.init();                                                     //此处初始化没有绑定ApplicationInfo,仅仅创建一个运行环境
——m.MainStact = new ActivityStack();                          //ActivityStack管理Activity的启动和调度
——m.startRunning();                                                      //标记变量,启动systemReady()(此次不启动)
————systemReady();
 
ActivityManagerService.setSystemProcess();                    //这样system_server可加到AMS中,并被他管理
——ServiceManager.addService();                                   //添加activity,meminfo,gfxinfo,cpuinfo,permission服务
——Application info = mSelf.mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS)     //使用AMS的context对象,查询名为android的ApplicationInfo,即frameworks-res.apk
——mSystemThread.installSystemApplicationInfo();         //载入framework-res.apk
————ContextImpl context = getSystemContext();      //和在AMS的main中获取的system contxt是同一个Context,由于在上面已经初始化,这里就直接return mSystemContext了
————context.init();                                                     //此处重新初始化,加入了来源于framewrok-res.apk的ApplicationInfo
——ProcessRecord app = mSelf.newProcessRecordLocked();     //进程的信息都保存在这,此处该ProcessRecord名为system。ProcessRecord会初始化电量统计batteryStats,ApplicationInfo,进程名processName,与应用进程交互的IApplicationThread(调用schdduleLaunchActivity,scheduleStopActivity等方法),调度优先级,OOM_adj,进程是否常驻persistent(AMS为system_server设置了常驻)
——mSelf.mProcessNames.put(app...);                             //保存ProcessRecord对象
——mSelf.mPidsSelfLocked.put(app...);                            //保存ProcessRecord对象
——mSelf.updateLruProcessLocked(app);                        //调整进程调度优先级和OOM_Adj
 
ActivityManagerService.installSystemProviders();              //将SettingsProvider放到system_server进程中来运行,和framework-res.apk运行在一起,这就是多个APK运行在一个线程的实例
——ProcessRecord app = mSelf.mProcessNames.get("system", Process.SYSTEM_UID);     //查询满足条件的ProviderInfo信息,将他分别保存到AMS和ProcessRecord中
——providers = mSelf.generateApplicationProcidersLocked(app);                //返回ProviderInfo List
——mSystemThread.installSystemPrividers(providers);                                 //为该进程安装ContentProvider(该函数是标准的ContentProvider安装时调用的程序),此处为SettingsProvider,因为SettingsProvider的uid为android.uid.system,processName为system。framework-res.apk中也是这样的。这两个apk放在同一个进程里,提高了通信效率。
//此处不再区分系统进程还是应用进程,只和ActivityThread交互
 
ActivityManagerService.self().setWindowManager();         //内部保存WMS
//暂无分析
 
ActivityManagerService.self().systemReady();
第一阶段
——new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
——broadcastIntentLocked();                                            //发送ACTION_PRE_BOOT_COMPLETED广播,暂时没有接收该广播的地方,估计和系统升级有关。
第二阶段
——removeProcessLocked();                                             //将AMS还未启动完毕就先启动的应用进程杀掉。
——retrieveSettings();                                                       //从Settings数据库中获取配置信息,这里只获取了4个设置:debug_app,wait_for_debugger,always_finish_activities,font_scale
第三阶段
——goingCallback.run();                                                    //调用回调函数
————startSystemUi();                                                   //启动SystemUi.apk,即系统的状态栏
————*.systemReady();                                                  //调用其他服务的systemReady()
————Watchdog.getInstance().start();                            //启动Watchdog
——addAppLocked(info);                                                  //启动ApplicationInfo对应的Application所在的进程。在这里persistent为1的App都会被启动。
——mMainStack.resumeTopActivityLocked(null);              //启动位于ActivityStack最上方Activity,如果为空则启动HOME
————mService.startHomeAcgtivityLocked();                //因为这是系统初次启动,所以ActivityStack为空。mService即AMS
——————(ActivityStack.java)activityIdleInternal()        //HOME activity启动完毕后,该函数被调用
————————mService.finishBooting();                      //AMS的finishBooting函数
——————————broadcasrIntentLocked(new Intent (Intent.ACTION_BOOT_COMPLETED))          //发送ACTION_BOOT_COMPLETED
 

版权所有,转载请注明出处:

http://www.cnblogs.com/sickworm/p/4220149.html

 

【Android framework】AndroidManagerService初始化流程的更多相关文章

  1. Android中G-Sensor相关流程

    1.使G-sensor正常工作需要做的事: G-sensor driver文件包括: driver/i2c/chips/lis331dl.c driver/i2c/chips/sensorioctl. ...

  2. [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...

  3. [Android][Framework]裁剪SystemServer服务以及关闭SystemFeature

    本文链接 http://wossoneri.github.io/2018/08/30/[Android][Framework]crop-SystemServer-and-SystemFeature/ ...

  4. Android之SystemUI载入流程和NavigationBar的分析

    Android之SystemUI载入流程和NavigationBar的分析 本篇仅仅分析SystemUI的载入过程和SystemUI的当中的一个模块StatusBar的小模块NavigationBar ...

  5. Android FrameWork 学习之Android 系统源码调试

    这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...

  6. Android的开机启动流程

    1.Android的开机启动流程 Android的层次框架图,如下所示: 图片清晰地展示了Android的五层架构,从上到下依次是:应用层.应用框架层.库层.运行时层以及Linux内核层.Androi ...

  7. MTK Android Framework用SystemProperties通过JNI调用访问系统属性

    1.导包 import android.os.SystemProperties; 2. Android SystemProperties设置/读取 #设置 Systemproperties.set(n ...

  8. Android FrameWork学习(二)Android系统源码调试

    通过上一篇 Android FrameWork学习(一)Android 7.0系统源码下载\编译 我们了解了如何进行系统源码的下载和编译工作. 为了更进一步地学习跟研究 Android 系统源码,今天 ...

  9. 前阿里技术总监手打:452页Android Framework 精编内核解析

    众所周知,Android是一个基于Linux实现的操作系统.但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其他运行在内核之上的应用程序没有任何区别. 所以Andro ...

随机推荐

  1. ASP.NET MVC4计划任务实现方法(定时执行某个功能)

    系统中定时执行某个任务是比较常用的功能,如一个部门定期向上级部门上报数据是一个典型的例子,下面就简单说说在.net mvc中如何实现定时执行某个功能的方法. 1.首先修改Glocal.asax文件,在 ...

  2. 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树

    题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...

  3. windows下本地调试hadoop代码,远程调试hadoop节点。

    1.在github上搜索下载winutils.exe相关的一套文件,下载对应hadoop的版本. 2.将所有文件复制到hadoop的bin目录下 3.将hadoop.dll复制到windows\sys ...

  4. [洛谷P1369]矩形

    题目大意:有$n(n\leqslant300)$个点,每个点坐标范围在$[1\sim100]$,求一个矩阵,使得边界上的点最多. 题解:做一遍二维前缀和,直接暴力枚举两个顶点 卡点:无 C++ Cod ...

  5. BZOJ2223:[Coci2009]PATULJCI——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2223 Description Sample Input 10 3 1 2 1 2 1 2 3 2 3 ...

  6. [Leetcode] longest valid parentheses 最长的有效括号

    Given a string containing just the characters'('and')', find the length of the longest valid (well-f ...

  7. c++ linux 判断string是中文的 or 英文的 字符串。

    #include <iostream> #include <string.h> #include <stdio.h> #include <stdlib.h&g ...

  8. The Usage of Pymongo

    Install pymongo document install pymongo from the tar package download from website python setup.y i ...

  9. mysql jdbc 连接url

    jdbc url连接地址格式: jdbc:mysql://[host][,failoverhost...][:port]/[database] [?propertyName1][=propertyVa ...

  10. apache的作用和tomcat的区别

    经常在用apache和tomcat等这些服务器,可是总感觉还是不清楚他们之间有什么关系,在用tomcat的时候总出现apache,总感到迷惑,到底谁是主谁是次,因此特意在网上查询了一些这方面的资料,总 ...