Android核心技术【SystemServer加载AMS】

83 阅读5分钟

启动流程

  • Init 初始化Linux 层,处理部分服务

    • 挂载和创建系统文件

    • 解析rc文件:

      • rc 文件中有很多action
    • 进入无限循环

      1. 执行action:zygote 进程就在这里启动

        • for循环去解析参数,根据rc 文件中的action 执行相应操作
      2. 检测并重启需要的进程

      3. 接收子进程的SIGCHLD信号,执行响应的方法

        • 防止子进程成为僵尸进程
  • zygote 层:

    • native 部分:

      • 初始化android 运行时环境(ART),因为Java 代码需要运行在虚拟机中;
      • 初始化 JNI ,因为native 层与 Java 层需要通信
      • 执行ZygoteInit.main 方法,进入Java 部分
    • Java 部分:

      • 创建 socket:实现通信
      • 执行预加载:加快进程的启动速度
      • 通过fork 创建 SystemServer 进程
      • 进入循环:等待AMS 的通知,并根据通知创建对应的进程

SystemServer 进程的创建过程

  • 前情提要:

    • 从ZygoteInit.java 中的main 方法。进入forkSystemServer类;此时,属于Zygote 进程
    • 进程实际上是没有native,java之分的;我们常说Zygote 进程在native 层,SystemServer 进程在Java 层,这可看做一种约定。
  • 第一步:参数赋值

    • 通过字符串数组args 进行赋值:包含uid,gid,nice-name(进程名)
  • 第二步:创建子进程,拿到pid

    • 通过Zygote.forkSystemServer 调用fork(),创建子进程并返回pid

SystemServer 进程的执行过程:

  • 前情提要:

    • 业务需求:需要启动SystemServer.main()

    • 代码入口:进入SystemServer 进程

      if(pid == 0){//此时在SystemServer 进程中
           …………
           return handleSystemServerProcess(parsedArgs);
       }
      

      Java

      Copy

    • handleSystemServerProcess() 通过反射启动SystemServer.main()

      • 源码依据:

        • 先是拿到了ClassLoader,接着调用了ZygoteInit.zygoteInit();

启动Binder线程池和SystemServiceManager

并且启动各种系统服务

SystemServer.main() 初始化SystemServer对象,然后调用run()

new SystemServer().run()

SystemServer.run()

//其他代码省略
 createSystemContext();//加载系统资源
 startBootstrapServices(t);//启动引导服务
 startCoreServices(t);//启动核心服务
 startOtherServices(t);//启动其他服务

SystemServer.createSystemContext()

//系统资源加载 
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();//ContextImpl
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
​
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);

ActivityThread.systemMain()

//ResourcesManager.getInstance()获取资源管理实例
ActivityThread thread = new ActivityThread();
​
thread.attach(true, 0);
return thread;

thread.attach(true, 0);

mInstrumentation = new Instrumentation();
mInstrumentation.basicInit(this);
/**
getSystemContext()单例模式创建ContextImpl对象mSystemContext-->createSystemContext-->创建LoadedApk对象(创建ApplicationInfo(),创建ClassLoader)
createAppContext()利用刚创建的LoadedApk对象创建新的ContextImpl对象
**/
ContextImpl context = ContextImpl.createAppContext(this,getSystemContext().mPackageInfo);
/**
initializeJavaContextClassLoader() 设置当前的线程ContextClassLoader
newApplication()
public Application newApplication(ClassLoader cl, String className, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    //创建Application对象
    Application app = getFactory(context.getPackageName())
        .instantiateApplication(cl, className);
    //将新创建的ContextImpl对象保存到Application父类成员变量mBase
    //将新创建的LoadedApk对象保存到Application的成员变量mLoadedApk
    app.attach(context);
    return app;
    }
**/
mInitialApplication = context.mPackageInfo.makeApplication(true, null);
mInitialApplication.onCreate();

SystemServer.startBootstrapServices()

// SystemServiceManager 专门管理各种服务启动(java层各种服务)
​
ActivityTaskManagerService atm = mSystemServiceManager.startService(
        ActivityTaskManagerService.Lifecycle.class).getService();
        
// 在SystemServiceManager.startService()中new Lifecycle()-->new ActivityManagerService(),且回调Lifecycle.onStart()
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
        mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
//设置AMS的APP安装器
mActivityManagerService.setInstaller(installer);
//开启PMS服务
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
//初始化AMS相关的PMS服务
mActivityManagerService.initPowerManagement();
//添加C/C++各种服务
mActivityManagerService.setSystemProcess();

new ActivityManagerService(context, sAtm) 启动相关服务 创建UI线程 创建ActiveServices 创建CpuTracker线程 Lifecycle.start()

//移除所有的进程组
removeAllProcessGroups();
//启动CpuTracker线程
mProcessCpuThread.start();
//启动电池统计服务
mBatteryStatsService.publish();
//启动APP操作信息服务
mAppOpsService.publish();
//添加到LocalServices中
LocalServices.addService(ActivityManagerInternal.class, mInternal);

ActivityManagerService.setSystemProcess();

/**
ServiceManager c/c++服务
​
activity AMS
procstats 进程统计
meminfo 内存信息
gfxinfo 图像信息
dbinfo 数据库
cpuinfo 
permission
processinfo 进程信息
cacheinfo 缓存信息
**/
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_HIGH);
ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
ServiceManager.addService("dbinfo", new DbBinder(this));
if (MONITOR_CPU_USAGE) {
ServiceManager.addService("cpuinfo", new CpuBinder(this),
    /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
    }
ServiceManager.addService("permission", new PermissionController(this));
ServiceManager.addService("processinfo", new ProcessInfoService(this));
ServiceManager.addService("cacheinfo", new CacheBinder(this));
/**
getSystemContext().installSystemApplicationInfo(info, classLoader);
getSystemUiContext().installSystemApplicationInfo(info, classLoader);
mProfiler = new Profiler();
**/
mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
//创建ProcessRecord对象
ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
                        false,
                        0,
                        new HostingRecord("system"));

ActivityThread.installSystemApplicationInfo(info,getClass().getClassLoader());

//最终调用LoadedApk的installSystemApplicationInfo(),加载名为android的包
getSystemContext().installSystemApplicationInfo(info, classLoader);
getSystemUiContext().installSystemApplicationInfo(info, classLoader);
//创建用于性能统计Profiler对象
mProfiler = new Profiler();

SystemServer.startOtherServices(t);

//与AMS相关,其他代码省略
/**
安装系统Provider
创建CoreSettingsObserver,用于监控Settings的改变
**/
mActivityManagerService.installSystemProviders();
//
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,new PhoneWindowManager(),mActivityManagerService.mActivityTaskManager);
//加入到底层服务中
ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
//WMS管理
mActivityManagerService.setWindowManager(wm);
/**
startSystemUi()启动系统UI
执行一系列服务的systemReady()
**/
mActivityManagerService.systemReady();
​
//至此80多个服务初始化完成

文末

以上就是Android开发技术中比较核心的技术点;SystemServer加载AMS的一些原理及解析;更多Android开发进阶可以查看传送直达↓↓↓ :link.juejin.cn/?target=htt…里面技术点上千个,能够帮助你在Android开发岗位中深造。

SystemServer中启动服务列表

服务类名称作用描述启动模式
EntropyService提供伪随机数1.0
PowerManagerService电源管理服务1.2/3
ActivityManagerService最核心的服务之一,管理 Activity自定义
TelephonyRegistry通过该服务注册电话模块的事件响应,比如重启、关闭、启动等1.0
PackageManagerService程序包管理服务3.3
AccountManagerService账户管理服务,是指联系人账户,而不是 Linux 系统的账户1.0
ContentServiceContentProvider 服务,提供跨进程数据交换3.0
BatteryService电池管理服务1.0
LightsService自然光强度感应传感器服务1.0
VibratorService震动器服务1.0
AlarmManagerService定时器管理服务,提供定时提醒服务1.0
WindowManagerServiceFramework 最核心的服务之一,负责窗口管理3.3
BluetoothService蓝牙服务1.0 +
DevicePolicyManagerService提供一些系统级别的设置及属性1.3
StatusBarManagerService状态栏管理服务1.3
ClipboardService系统剪切板服务1.0
InputMethodManagerService输入法管理服务1.0
NetStatService网络状态服务1.0
NetworkManagementService网络管理服务NMS.create()
ConnectivityService网络连接管理服务2.3
ThrottleService暂不清楚其作用1.3
AccessibilityManagerService辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果1.0
MountService挂载服务,可通过该服务调用 Linux 层面的 mount 程序1.0
NotificationManagerService通知栏管理服务, Android 中的通知栏和状态栏在一起,只是界面上前者在左边,后者在右边1.3
DeviceStorageMonitorService磁盘空间状态检测服务1.0
LocationManagerService地理位置服务1.3
SearchManagerService搜索管理服务1.0
DropBoxManagerService通过该服务访问 Linux 层面的 Dropbox 程序1.0
WallpaperManagerService墙纸管理服务,墙纸不等同于桌面背景,在 View 系统内部,墙纸可以作为任何窗口的背景1.3
AudioService音频管理服务1.0
BackupManagerService系统备份服务1.0
AppWidgetServiceWidget 服务1.3
RecognitionManagerService身份识别服务1.3
DiskStatsService磁盘统计服务1.0