网站开发和软件开发哪个好,中国建筑业发展现状,怎么用ps做网站幻灯片,电子商务网站建设设计原则该系列文章总纲链接#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 说明#xff1a; 说明#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容分析过多#xff0c;因此拆成2个章节#xff0c;本章节是第一章节专题总纲目录 Android Framework 总纲 本章关键点总结 说明 说明本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容分析过多因此拆成2个章节本章节是第一章节第二章节文章链接为
Android Framework AMS02AMS启动及相关初始化5-8
systemserver在启动AMSActivityManagerService时不仅仅是做简单的AMS服务启动还有很多的其他初始化相关操作这里我们以SystemServer启动流程为主线对AMS启动及相关逻辑进行初始化操作进行分析接下来我们通过代码来看看具体的操作逻辑。相关代码如下 // SystemServer//...// 定义系统服务的成员变量private ActivityManagerService mActivityManagerService;private SystemServiceManager mSystemServiceManager;private PowerManagerService mPowerManagerService;private PackageManagerService mPackageManagerService;//...private void startBootstrapServices() {// 启动引导服务这些服务在系统启动的早期阶段被启动// ...// 关键点1启动ActivityManagerService服务mActivityManagerService mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();// 关键点2为ActivityManagerService设置系统服务管理器mActivityManagerService.setSystemServiceManager(mSystemServiceManager);// 启动PowerManagerService服务mPowerManagerService mSystemServiceManager.startService(PowerManagerService.class);// 关键点3初始化电源管理mActivityManagerService.initPowerManagement();// 关键点4将当前进程设置为系统进程mActivityManagerService.setSystemProcess();// ...}//...private void startCoreServices() {// 启动核心服务// ...// 为ActivityManagerService设置UsageStatsManager服务mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));// ...}//...private void startOtherServices() {// 启动其他服务// ...WindowManagerService wm null;// ...// 关键点5安装系统提供的ContentProvidersmActivityManagerService.installSystemProviders();// 初始化看门狗监控watchdog.init(context, mActivityManagerService);// 创建WindowManagerService服务wm WindowManagerService.main(context, inputManager,mFactoryTestMode ! FactoryTest.FACTORY_TEST_LOW_LEVEL,mActivityManagerService);// 关键点6为ActivityManagerService设置WindowManagermActivityManagerService.setWindowManager(wm);final boolean safeMode wm.detectSafeMode();if (safeMode) {// 检测安全模式// 进入安全模式mActivityManagerService.enterSafeMode();// 禁用JIT编译VMRuntime.getRuntime().disableJitCompilation();} else {// 启用JIT编译VMRuntime.getRuntime().startJitCompilation();}if (safeMode) {// 如果处于安全模式显示安全模式覆盖层mActivityManagerService.showSafeModeOverlay();}// ...// 通知PowerManagerService系统已准备好mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());// 关键点7当ActivityManagerService准备好后执行的操作mActivityManagerService.systemReady(new Runnable() {Overridepublic void run() {// 启动系统服务管理器的下一个启动阶段mSystemServiceManager.startBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY);try {//关键点8开始监控本地崩溃mActivityManagerService.startObservingNativeCrashes();} catch (Throwable e) {// 报告错误reportWtf(observing native crashes, e);}// ...WebViewFactory.prepareWebViewInSystemServer();try {// 尝试启动系统用户界面startSystemUi(context);} catch (Throwable e) {reportWtf(starting System UI, e);}try {//尝试通知挂载服务系统已准备就绪if (mountServiceF ! null) mountServiceF.systemReady();} catch (Throwable e) {reportWtf(making Mount Service ready, e);}//...//其他各种服务准备就绪//...}});// ...} 以上代码通过关键点的标注共列出了8个重要的调用并对这些调用进行了简单的描述。整理如下
关键点1启动ActivityManagerService服务。关键点2为ActivityManagerService设置系统服务管理器。关键点3初始化电源管理。关键点4将当前进程设置为系统进程。关键点5安装系统提供的ContentProviders。关键点6为ActivityManagerService设置WindowManager。关键点7当ActivityManagerService准备好后执行的操作。关键点8开始监控本地崩溃。
接下来针对这8个关键点进行详细的解读。本章节主要关注关键点1-4部分下一篇关注关键点5-8部分。
1 启动ActivityManagerService服务
这里从代码
mActivityManagerService mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
开始分析这里涉及的ActivityManagerService.Lifecycle是ActivityManagerService的一个内部类它实现了 SystemService 接口。它的代码实现如下
//ActivityManagerServicepublic static final class Lifecycle extends SystemService {private final ActivityManagerService mService;public Lifecycle(Context context) {super(context);mService new ActivityManagerService(context);}Overridepublic void onStart() {mService.start();}public ActivityManagerService getService() {return mService;}}
接下来分析mSystemServiceManager.startService的代码实现具体如下
//SystemServiceManager//...//关键流程step1public SystemService startService(String className) {final ClassSystemService serviceClass;//...serviceClass (ClassSystemService)Class.forName(className);//...return startService(serviceClass);}//关键流程step2public T extends SystemService T startService(ClassT serviceClass) {final String name serviceClass.getName();// 创建服务实例if (!SystemService.class.isAssignableFrom(serviceClass)) {throw new RuntimeException(... SystemService.class.getName());}final T service;ConstructorT constructor serviceClass.getConstructor(Context.class);// 使用构造函数创建服务实例传入mContext作为参数service constructor.newInstance(mContext);//...mServices.add(service); // 将服务实例添加到服务列表中//...service.onStart(); // 调用服务的onStart方法服务在这里进行初始化工作//...return service; // 返回创建的服务实例}
这里首先会调用的Lifecycle的构造器实际上就是创建了一个ActivityManagerService对象然后是执行Lifecycle的onStart方法实际上是调用ActivityManagerService的start方法start方法内容如下
//ActivityManagerServiceprivate void start() {// 移除所有进程组。在Unix中进程组是一个或多个进程的集合它们可以一起接收信号。// 这个调用确保在AMS启动时系统中不会有遗留的进程组影响新的系统服务。Process.removeAllProcessGroups();// 启动处理CPU信息的线程。mProcessCpuThread是一个监控CPU使用情况的后台线程// 用于收集和更新CPU使用相关的统计信息。mProcessCpuThread.start();// 发布电池状态服务。电池状态服务BatteryStatsService负责监控设备的电池使用情况// 包括应用程序对电池的消耗等信息。mBatteryStatsService.publish(mContext);// 发布应用操作服务。应用操作服务AppOpsService负责管理应用的操作记录// 比如访问位置、联系人等敏感信息的权限检查。mAppOpsService.publish(mContext);// 将AppOpsService添加到本地服务中以便其他系统组件可以访问它。LocalServices.addService(ActivityManagerInternal.class, new LocalService());}
start方法在AMS启动时执行一系列初始化操作包括移除进程组、启动CPU监控线程、发布电池状态服务和应用操作服务以及添加本地服务。这些步骤确保了AMS及其依赖的服务能够正确初始化并为其他系统组件提供必要的服务和信息。
注意mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class)这里返回的是一个Lifecycle类型的对象最后通过Lifecycle的getService拿到创建好的ActivityManagerService对象。
整个过程中主要是做了一些ActivityManagerService初始化相关工作start方法然后返回了一个ActivityManagerService对象赋值给成员变量mActivityManagerService。
2 为ActivityManagerService设置系统服务管理器
这里从代码
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
开始分析代码实现上很简单如下所示
//ActivityManagerServicepublic void setSystemServiceManager(SystemServiceManager mgr) {mSystemServiceManager mgr;}
但我们要了解这样设计背后的意义SystemServiceManager是负责启动和维护系统服务的关键组件。在ActivityManagerService中调用setSystemServiceManager(mSystemServiceManager)的目的主要是
通信和协调ActivityManagerServiceAMS作为Android系统中的核心服务之一负责管理应用程序的生命周期。它需要与其他系统服务如PowerManagerService、WindowManagerService等紧密协作。通过设置SystemServiceManagerAMS可以确保这些服务之间能够顺利通信和协调工作这对于整个系统的稳定性和性能至关重要。管理生命周期系统服务的生命周期管理是SystemServiceManager的重要职责之一。AMS通过SystemServiceManager来控制其他服务的启动、运行和停止确保在系统启动和关闭过程中所有服务都能够按照正确的顺序进行初始化和清理。提供服务上下文SystemServiceManager持有系统级的上下文ContextAMS需要这个上下文来执行其管理应用程序和进程的职责。系统级上下文提供了对系统资源和权限的访问这对于AMS来说是必不可少的。
总之设置一个系统服务管理器的引用这样AMS就可以在需要时获取和控制其他系统服务从而实现整个系统服务的协调和管理。
3 初始化电源管理
这里从代码
mActivityManagerService.initPowerManagement();
开始分析对应代码实现如下
//ActivityManagerServicepublic void initPowerManagement() {mStackSupervisor.initPowerManagement();mBatteryStatsService.initPowerManagement();}
接下来分成2个部分来解读
mStackSupervisor.initPowerManagement();mBatteryStatsService.initPowerManagement();
3.1 mStackSupervisor.initPowerManagement解读
mStackSupervisor.initPowerManagement()的代码实现如下
//ActivityStackSupervisorvoid initPowerManagement() {// 获取系统服务中的电源管理器服务PowerManager pm (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE);// 创建一个WakeLock用于防止设备进入睡眠状态// PARTIAL_WAKE_LOCK: 用于防止CPU进入睡眠但允许屏幕关闭// ActivityManager-Sleep: WakeLock的标签用于识别这个WakeLockmGoingToSleep pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ActivityManager-Sleep);// 创建另一个WakeLock用于在启动活动时防止设备进入睡眠状态// ActivityManager-Launch: WakeLock的标签mLaunchingActivity pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ActivityManager-Launch);// 设置mLaunchingActivity这个WakeLock为非引用计数模式// 这意味着即使只有一个持有者释放了WakeLock它也不会被释放mLaunchingActivity.setReferenceCounted(false);}
mStackSupervisor.initPowerManagement方法的主要作用是初始化ActivityManagerService中使用的电源管理相关的WakeLock。这些WakeLock用于在特定情况下防止设备进入睡眠状态确保系统的稳定性和响应性。通过创建和管理这些WakeLockActivityManagerService可以更好地控制设备的电源状态特别是在处理活动启动和睡眠过程中。
3.2 mBatteryStatsService.initPowerManagement解读
mBatteryStatsService.initPowerManagement()的代码实现如下
//BatteryStatsServicepublic void initPowerManagement() {// 获取PowerManagerInternal服务的实例mPowerManagerInternal LocalServices.getService(PowerManagerInternal.class);// 注册当前ActivityManagerService作为低功耗模式的观察者// 这样当系统低功耗模式发生变化时AMS可以接收到通知并作出相应的调整。mPowerManagerInternal.registerLowPowerModeObserver(this);// 记录当前低功耗模式是否启用,这有助于系统分析和优化电源使用。mStats.noteLowPowerMode(mPowerManagerInternal.getLowPowerModeEnabled());// 创建并启动一个WakeupReasonThread线程,该线程用于监控和分析设备唤醒的原因// 这对于电源管理和系统性能优化很有帮助(new WakeupReasonThread()).start();}
mBatteryStatsService.initPowerManagement方法在AMS中初始化电源管理相关的功能包括获取电源管理器内部服务、注册低功耗模式观察者、记录低功耗模式状态以及启动一个线程来监控设备唤醒的原因。这些步骤有助于AMS更好地管理系统的电源使用优化系统性能同时确保设备在需要时能够及时响应用户操作。
4 将当前进程设置为系统进程
这里从代码
mActivityManagerService.setSystemProcess();
开始分析对应代码实现如下
//ActivityManagerServicepublic void setSystemProcess() {try {// 向ServiceManager注册ActivityManagerService使其能被其他组件访问ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);// 向ServiceManager注册ProcessStats服务用于监控进程统计信息ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);// 向ServiceManager注册内存信息服务ServiceManager.addService(meminfo, new MemBinder(this));// 向ServiceManager注册图形信息服务ServiceManager.addService(gfxinfo, new GraphicsBinder(this));// 向ServiceManager注册数据库信息服务ServiceManager.addService(dbinfo, new DbBinder(this));// 如果启用了监控CPU使用率则注册CPU信息服务if (MONITOR_CPU_USAGE) {ServiceManager.addService(cpuinfo, new CpuBinder(this));}// 向ServiceManager注册权限服务ServiceManager.addService(permission, new PermissionController(this));// 获取系统应用android的ApplicationInfoApplicationInfo info mContext.getPackageManager().getApplicationInfo(android, STOCK_PM_FLAGS);// 安装系统应用的ApplicationInfomSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());synchronized (this) {// 创建系统进程记录ProcessRecord app newProcessRecordLocked(info, info.processName, false, 0);app.persistent true; // 系统进程是持久的app.pid MY_PID; // 设置进程ID为当前进程IDapp.maxAdj ProcessList.SYSTEM_ADJ; // 设置进程的调整级别为系统级别// 激活系统进程app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);// 将系统进程记录添加到进程名称map中mProcessNames.put(app.processName, app.uid, app);synchronized (mPidsSelfLocked) {mPidsSelfLocked.put(app.pid, app); // 将PID与进程记录关联}// 更新最近最少使用的(LRU)进程缓存updateLruProcessLocked(app, false, null);// 更新OOM调整级别updateOomAdjLocked();}} catch (PackageManager.NameNotFoundException e) {throw new RuntimeException(Unable to find android system package, e);}}
setSystemProcess方法在AMS中将当前进程设置为系统进程并注册了一系列关键服务。这些服务包括活动管理、进程统计、内存信息、图形信息、数据库信息、CPU信息和权限控制。此外该方法还负责创建和激活系统进程记录确保系统进程在系统中具有最高的优先级和持久性。这个过程是Android系统启动的关键部分确保了系统服务能够正确注册和初始化。
同时这里对 获取系统应用android的ApplicationInfo 和安装系统应用的ApplicationInfo做进一步的解读。
代码通过调用getPackageManager().getApplicationInfo()方法并传入参数android获取的是系统应用本身的ApplicationInfo。这里的android指的是系统应用的包名。
系统应用android包是Android操作系统的核心组成部分它包含了Android框架的基本类库和系统服务。这些类库和系统服务为所有应用提供了运行时环境包括但不限于以下内容
核心库如android.app、android.content、android.view等。系统服务如ActivityManagerService、WindowManagerService、PackageManagerService等。系统资源如系统字体、颜色、样式等。
接下来对获取系统应用android的ApplicationInfo 和安装系统应用的ApplicationInfo 这2句话的目的和用途进行更详细的解读
初始化系统环境这两步操作确保了系统应用的环境被正确设置为系统服务的运行提供了必要的上下文和资源。提供系统服务访问权限通过安装ApplicationInfo系统服务获得了对系统应用资源的访问权限这对于执行系统级别的任务是必要的。确保系统应用的类加载为系统应用设置正确的类加载器确保系统服务可以加载系统应用的类这对于系统服务的扩展性和模块化设计至关重要。系统服务的自我识别在Android系统中系统服务本身也是以应用的形式运行的。通过获取和安装ApplicationInfo系统服务能够识别自己的身份和角色从而正确地执行其职责。
总结来说这两步操作是系统服务启动和初始化过程的一部分确保了系统服务能够正确地访问系统应用的资源并为其执行系统级别的任务提供了必要的环境和权限。