Android 8.1 Battery系列(一) BatteryService分析

本文深入剖析Android 8.1的BatteryService,阐述其启动流程,包括Constructor()、onStart()和onBootPhase()方法。BatteryService负责监听电池状态变化,更新电池信息,并通过Broadcast发送给其他组件。文章还详细解析了processValuesLocked()方法,涉及充电类型判断、电池状态更新、低电量处理等多个关键环节。
摘要由CSDN通过智能技术生成

概述

BatteryService负责监听充电状态和电量变化,当电量值或者充电类型改变时,会获取到底层healthd上报的电池状态信息,并更新到BatteryStatsService中进行统计,同时会将这些值存储到Intent中,以广播的形式发送到监听了ACTION_BATTERY_CHANGED的组件中,其他组建可以通过Intent.getExtra()的方式获取到电池信息。

1.BatteryService的启动流程

BatteryService继承于SyetemService,SyetemService是所有系统服务的基类,每个SyetemService的启动流程都具有相同的步骤,他们实现并重写其父类方法。因此,在分析BatteryService之前,先看看SystemServer的启动相关方法。SystemServer启动时调用方法如下,并且都是在SystemServer的main线程中运行:

  • 1.Constructor():构造方法,通过反射的方式调用;
  • 2.onStart():开始运行服务;
  • 3.onBootPhase(int):该方法表示启动阶段,会根据不同的参数(阶段)调用多次,直到PHASE_BOOT_COMPLETED阶段调用后不再调用,表示启动完成,对于每个阶段,可以完成特定的工作;

了解了上述内容后,着手分析BatteryService就容易多了,首先,BatteryService会在SystemServer中进行启动:

/**
 * The main entry point from zygote.
 */
public static void main(String[] args) {
   
    new SystemServer().run();
}

启动SystemServer后,在main()函数中调用了run()方法,在run()方法中,启动三种服务:

private void run() {
   
    ......
// Start services.
    try {
   
    //启动引导服务
        startBootstrapServices();
    //启动核心服务
        startCoreServices();
    //启动其他服务
        startOtherServices();
    //关闭启动线程池
        SystemServerInitThreadPool.shutdown();
    ......
    } catch (Throwable ex) {
   
        throw ex;
    } finally {
   
        traceEnd();
    }
}

startBootstrapServices()中启动的是一些依赖性比较高的系统服务(所以方法名为"引导服务"),如PMS就是在这里进行启动的。
startCoreServices()中启动一些核心服务,从代码中看,启动的核心服务有四种,其中就包括要分析的BatteryService。
startOtherServices()用来启动其他的一些服务。

startCoreServices()中,通过SystemServiceManager中的方法,传入类名作为参数,利用反射机制对BatteryService进行实例化:

public <T extends SystemService> T startService(Class<T> serviceClass) {
   
    try {
   
        final String name = serviceClass.getName();
        ......
        final T service;
        try {
   
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            service = constructor.newInstance(mContext);
        } catch (InstantiationException ex) 
        }
        startService(service);
        return service;
    } finally {
   
    }
}
public void startService(@NonNull final SystemService service) {
   
    // Register it.
    mServices.add(service);
    long time = SystemClock.elapsedRealtime();
    try {
   
        //调用onStart()方法开启服务
        service.onStart();
    } catch (RuntimeException ex) {
   
    }
}

分析到这一步,SystemServive的生命周期方法就剩下onBootPhase()方法了,这个方法也说过了,是负责启动启动服务的过程中分阶段进行一些工作的,也运行在SystemServer的main线程中:

private void startOtherServices() {
   
    ......
    mSystemServiceManager.startBootPhase(
          SystemService.PHASE_LOCK_SETTINGS_READY);
    mSystemServiceManager.startBootPhase(
          SystemService.PHASE_SYSTEM_SERVICES_READY);
    mSystemServiceManager.startBootPhase(
              SystemService.PHASE_ACTIVITY_MANAGER_READY);
    mSystemServiceManager.startBootPhase(
              SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
    mSystemServiceManager.startBootPhase(
              SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
    ......
 }

SystemServiceManager中:

public void startBootPhase(final int phase) {
   
    ......
    mCurrentPhase = phase;
    try {
   
        final int serviceLen = mServices.size();
        for (int i = 0; i < serviceLen; i++) {
   
            final SystemService service = mServices.get(i);
            long time = SystemClock.elapsedRealtime();
            try {
   
                service.onBootPhase(mCurrentPhase);
            } catch (Exception ex) {
   
            }
        }
    
  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值