【Android(安卓)framework】AndroidManagerService初始化流程
16lz
2021-01-24
源码基于Android 4.4。 system_server的初始化 system_server受AMS管理,负责启动framework-res.apk和SettingsProvider.apk。system_server调用AMS接口初始化需要的成员。
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中获取的systemcontxt是同一个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); //返回ProviderInfoList ——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() // HOMEactivity启动完毕后,该函数被调用 ————————mService.finishBooting(); //AMS的finishBooting函数 ——————————broadcasrIntentLocked(new Intent (Intent.ACTION_BOOT_COMPLETED)) // 发送ACTION_BOOT_COMPLETED
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中获取的systemcontxt是同一个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); //返回ProviderInfoList ——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() // HOMEactivity启动完毕后,该函数被调用 ————————mService.finishBooting(); //AMS的finishBooting函数 ——————————broadcasrIntentLocked(new Intent (Intent.ACTION_BOOT_COMPLETED)) // 发送ACTION_BOOT_COMPLETED
版权所有,转载请注明出处:
http://www.cnblogs.com/sickworm/p/4220149.html
更多相关文章
- Android(安卓)Studio编译使用了Maven的工程卡住的解决方案
- android下xstream转换对象和xml
- android 应用在启动后进行全局的的初始化操作
- Android动画学习笔记-Android(安卓)Animation
- Android(安卓)之Notification 用法
- Binder之bindService
- 《android 利用自带技术解析json字符》
- android 通过uri启动Activity
- Activity 组件的启动流程