Android 8.1 Battery系列(一) BatteryService分析

BatteryService电池服务及客制化 BatteryService电池服务 阅读详情

概述

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) {
   
   
            }
        }
    } finally 
android8.0中:Settings->Battery一直显示Battery usage data isn’t availa(不显示apk耗电百分比) 代码路径在包/应用/设置/ SRC / COM /机器人/设置/ fuelgauge / PowerUsageSummary.java  每次进这个界面都会走refreshUi(),看里面的实现发现averagePower一直返回0.1,不管你电池用了多久。所以下面的代码都不会走,就不会显示应用程序用电量。 protected void refreshUi() { final... 阅读详情

相关推荐

BatteryService服务分析

BatteryService是在systemServer启动核心服务的时候启动的。 同样我们按照PMS启动的流程来分析BatteryService的启动流程。 1.BatteryService的构造方法 BatteryService的构造方法比较简单,只是从资源中获取一些预定的值 电量统计服务 mBatteryStats = BatteryStatsService.getServi

zhenjie.Chang的专栏 5427

Android BatteryService学习文档

分析了framework中battery相关知识。

【STM32单片机】RS485通信—基于STM32G474芯片

做项目需要用485通信来控制Go电机参考资料:【【STM32F103C8T6系列】10. 实验例程——485(USART串口)通讯实验】 https://www.bilibili.com/video/BV19w411r7ka/?PDF: STM32G474 开发指南 正点原子 DMG474 开发板教程 第28章485只是物理层,代码逻辑还是UART串口通信,相当于是电路有RS485转换芯片,所以还是用UART串口通信方式。

m0_48808835的博客 3647

SAP ABAP实战:如何用CVI_EI_INBOUND_MAIN批量更新BP邮箱(附完整代码)

本文深入解析了SAP ABAP中CVI_EI_INBOUND_MAIN函数在业务伙伴(BP)邮箱地址批量维护场景下的应用。通过详细讲解数据结构构建、关键参数(如任务参数'5')配置及完整代码示例,为开发者提供了一套高效、稳定的批量更新解决方案,并分享了性能优化与错误处理的最佳实践。

weixin_29228781的博客 77

淘宝扫码登录避坑指南:如何避免异地登录风控并稳定获取Cookie(附Python代码)

本文深入解析了淘宝扫码登录的风控机制,提供了从环境仿真到代码实现的完整避坑指南。通过精细化伪装请求头、管理会话与IP策略,并附上Python示例代码,帮助开发者稳定获取Cookie,有效避免异地登录风控,实现自动化流程的可靠集成。

l6m7n8的博客 592

【YOLOv7-环境搭建】PyTorch安装后输出版本显示No module named ‘Torch’的解决方法

【YOLOv7-环境搭建】PyTorch安装后输出版本显示No module named ‘Torch’的解决方法:①检查PyCharm导入的环境是否错误②添加Torch包

qq_59942266的博客 4970

【板栗糖GIS】新装ArcGIS必调的12个隐藏设置——【效率翻倍指南】

本文详细介绍了新装ArcGIS后必调的12个隐藏设置,涵盖性能优化、路径管理、显示调校、工作流定制等方面,帮助用户显著提升GIS工作效率。从关闭后台地理处理到启用硬件加速,再到个性化快捷键配置,这些实用技巧能让ArcGIS运行更流畅,操作更便捷。

weixin_42524945的博客 545

从零搭建ROS机械臂仿真环境:Ubuntu 20.04+Noetic下配置睿尔曼RM65的完整流程

本文详细介绍了在Ubuntu 20.04系统中,基于ROS Noetic搭建睿尔曼RM65机械臂的完整仿真环境。从环境准备、工作空间创建到MoveIt!配置与Gazebo仿真环境集成,提供了完整的流程和优化建议,帮助开发者高效实现机械臂仿真与调试。

v6b7n8m9q0的博客 933

Nvidia Orin Driveos Camera 介绍及调试详解

自动驾驶-nvidia orin driveos Camera 驱动详解及调试

u011803281的博客 2992

Python爬虫实战:手把手教你如何抓取农作物品种名录,构建标准化种业索引数据库!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 291

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: [设计模式] 工厂方法模式
下一篇: Android 8.1 Battery系列(二) BatteryStatsService分析
FightFightFight
博客等级 码龄11年 508粉丝 174原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值