【Android framework】AndroidManagerService初始化流程

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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。