源码基于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中获取的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

更多相关文章

  1. Android(安卓)Studio编译使用了Maven的工程卡住的解决方案
  2. android下xstream转换对象和xml
  3. android 应用在启动后进行全局的的初始化操作
  4. Android动画学习笔记-Android(安卓)Animation
  5. Android(安卓)之Notification 用法
  6. Binder之bindService
  7. 《android 利用自带技术解析json字符》
  8. android 通过uri启动Activity
  9. Activity 组件的启动流程

随机推荐

  1. Android(安卓)左右滑动切换页面或Activit
  2. ubuntu10.10 编译android2.3源码 sdk adt
  3. 将Android(安卓)Studio默认布局Constrain
  4. adb 的一些简单命令
  5. 【转】android 有关listview的adapter的
  6. Android(安卓)Studio下OpenCV及JNI开发
  7. 【Android(安卓)- 框架】之可悬浮列表Sti
  8. 使用内部(com.android.internal)和隐藏(@
  9. Android如何将程序打成jar包
  10. 笔记68--继续ListView和GridView1