源码基于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. [剑指Offer] 45.扑克牌顺子

    题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决 ...

  2. WPF 分页控件的实现 -用户控件

    效果图:

  3. WPF中DataGrid的应用-绑定,增改删,分页,样式

    参考以下网址: http://www.cnblogs.com/fwbnet/archive/2012/05/08/2490974.html

  4. HTML5拖拽练习

    HTML5提供专门的拖拽与拖放的API,以后实现这类效果就不必乱折腾了 相关属性和事件如下: 1.DataTransfer 对象:退拽对象用来传递的媒介,使用一般为Event.dataTransfer ...

  5. CS6的安装与破解

    大家在Mac下肯定也少不了对图片进行修改,那也就少不了Photoshop这款软件. 今天在这里分享下苹果下的Adobe PhotoshopCS6,这个软件大家应该都很熟悉,主要功能什么我就不多做介绍了 ...

  6. BZOJ 1040 骑士(环套树DP)

    如果m=n-1,显然这就是一个经典的树形dp. 现在是m=n,这是一个环套树森林,破掉这个环后,就成了一个树,那么这条破开的边连接的两个顶点不能同时选择.我们可以对这两个点进行两次树形DP根不选的情况 ...

  7. 【hdu4507】吉哥系列故事——恨7不成妻 数位dp

    题目描述 求 $[L,R]$ 内满足:数位中不包含7.数位之和不是7的倍数.本身不是7的倍数 的所有数的平方和 mod $10^9+7$ . 输入 输入数据的第一行是case数T(1 <= T ...

  8. 51nod 1286 三段子串(树状数组+拓展kmp)

    题意: 给定一个字符串S,找到另外一个字符串T,T既是S的前缀,也是S的后缀,并且在中间某个地方也出现一次,并且这三次出现不重合.求T最长的长度. 例如:S = "abababababa&q ...

  9. JS详细图解作用域链与闭包

    JS详细图解作用域链与闭包 攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你 ...

  10. bzoj 1862: [Zjoi2006]GameZ游戏排名系统 & bzoj 1056: [HAOI2008]排名系统

    傻叉了一晚上,把t打成x,然后这题神奇在于输出一段数,不足的不用输出,一开始我的是直接找没有后面就退,然后这样会格式错误囧……然后最后zj的还卡了下空间,于是不用string就过了……string毁一 ...