【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