源码基于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. matlab padarray

    功能:填充图像或填充数组 使用:B = padarray(A,padsize,padval,direction) A表示输入图像,B是填充后的图像,padsize给出了填充的行数和列数,通常用[r c ...

  2. [九省联考2018]IIIDX 贪心 线段树

    ~~~题面~~~ 题解: 一开始翻网上题解看了好久都没看懂,感觉很多人都讲得不太详细,所以导致一些细节的地方看不懂,所以这里就写详细一点吧,如果有不对的or不懂的可以发评论在下面. 首先有一个比较明显 ...

  3. BZOJ4563:[HAOI2016]放棋子——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4563 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列 ...

  4. UVA.357 Let Me Count The Ways (DP 完全背包)

    UVA.357 Let Me Count The Ways (DP 完全背包) 题意分析 与UVA.UVA.674 Coin Change是一模一样的题.需要注意的是,此题的数据量较大,dp数组需要使 ...

  5. 简述JavaScript的类与对象

    JavaScript语言是动态类型的语言,基于对象并由事件驱动.用面向对象的思想来看,它也有类的概念.JavaScript 没有class关键字,就是用function来实现. 1. 实现方式及变量/ ...

  6. Linux环境下用Weblogic发布项目【二】 -- 配置Domain域

    配置注意事项: 修改密码时密码长度最少8位:在"<下一步>"后面为空即表示敲回车: 具体配置步骤如下: [root@GPS-App ~]# [root@GPS-App ...

  7. Codeforces Round #341 (Div. 2)A

    A. Wet Shark and Odd and Even time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  8. Eclipse集成Android NDK及导出Jar和so动态库

    一.安装Cygwin 在Windows环境而又不想使用linux环境,可以安装cygwin(http://www.cygwin.com/ ),为了使用gcc注意cygwin的必选安装包在devel目录 ...

  9. HDU3579 线性同余方程(模板 余数不一定互质)

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  10. javascript功能封装

    实现方式其实很简单,我在代码打上注释,大家就懂了!    var _date=[],dateData=["1月","2月","3月",&qu ...