Android: 充电模式启动简要流程

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 背景

本文分析基于 Android 6.0.1,仅供参考。

3. 充电模式启动简要流程

/*
 * 首先,在 u-boot 里面传递 androidboot.mode=charger 给内核命令行。
 * 我们这里没有内核代码的描述,因为这不是我们的重点。
 */
 u-boot 启动 kernel
 	kernel 启动 init 程序
 		main() /* system/core/init/init.cpp */
 			/* 解析kernel传递过来的command line(/proc/cmdline) */
			process_kernel_cmdline()
				import_kernel_cmdline(false, import_kernel_nv) /*  /proc/cmdline */
					...
					import_kernel_nv()
						...
						/* 设定启动模式属性为 charger */
						property_set("ro.boot.mode", "charger")
				
			/* 设定kernel boot模式属性: ro.bootmode = charger */
			export_kernel_boot_props()
				...
			/*
	 	 	 * charger boot 模式不需要启动更多的程序, charger 即可.
	 	 	 *
	 	 	 * on charger
     	 	 * 		class_start charger
	 	 	 *
	 	 	 * service charger /charger # 这里的 /charger 程序是 healthd 的符号链接
     	 	 * 		class charger
     	 	 * 		seclabel u:r:healthd:s0
	 	 	 */
			if (property_get("ro.bootmode", bootmode) > 0 && strcmp(bootmode, "charger") == 0) {
        		action_for_each_trigger("charger", action_add_queue_tail);
        			...
        			/* 
        	 		 * 触发 healthd 程序入口 main():
        	 		 * 看后面 healthd 程序流程。
        		 	 */
			} else {
    			...
    		}   	 

healthd 程序流程:

main()	@ system/core/healthd/healthd.cpp
	static struct healthd_mode_ops charger_ops = {
		.init = healthd_mode_charger_init,
		.preparetowait = healthd_mode_charger_preparetowait,
		.heartbeat = healthd_mode_charger_heartbeat,
		.battery_update = healthd_mode_charger_battery_update,
	};
			 	
	/* 按情况设定回调函数簇: 用来处理电池的状态更新 */
	healthd_mode_ops = &android_ops / &charger_ops / &recovery_ops
        		
	/* 初始化 */
	healthd_init()
		epollfd = epoll_create(MAX_EPOLL_EVENTS)
        			
		healthd_mode_ops->init(&healthd_config)
			healthd_mode_charger_init() /* system/core/healthd/healthd_mode_charger.cpp */
		wakealarm_init()
		uevent_init()
				    
		gBatteryMonitor = new BatteryMonitor()
		gBatteryMonitor->init(&healthd_config)
        		
		/* 事件状态更新循环 */
		healthd_mainloop()
			while (1) {
				mode_timeout = healthd_mode_ops->preparetowait()
					healthd_mode_charger_preparetowait()
        				
				/* 读取事件 */
				nevents = epoll_wait(epollfd, events, eventct, timeout)
        				
				/* 处理事件 */
				for (int n = 0; n < nevents; ++n) { 
					/* 事件处理回调 */
				}
        				
				/* 电池状态画面更新 */
				healthd_mode_ops->heartbeat()
					healthd_mode_charger_heartbeat()
			}

4. 后记

之所以研究了Android充电模式启动流程,是源于实际项目需求。在一款VR产品上,公司加入了TypeC的充电接口,需要在充电模式下,显示充电动画,而芯片厂家的原生SDK不支持,因此需要了解如何进入充电启动模式、以及充电模式启动流程,然后添加需要的修改。

安卓设备的充电流程一般包括以下步骤: 1. 插入充电器并连接电源 当用户将充电器插入安卓设备并连接电源,系统会检测到电源连接事件,然后启动相应的服务和线程来处理充电流程。 2. 开始充电流程 系统会根据充电器的类型和电池的状态,选择合适的充电模式,并开始充电流程。在此过程中,系统会监测电池的状态,包括电量、温度、电压等,并动态调整充电电流和电压等参数,以保证充电过程的安全和稳定。 3. 监测充电状态 系统会持续监测充电状态,包括电池电量、充电电流、充电电压等,并将这些信息通知给用户和应用程序。用户可以通过系统设置界面或者充电图标来查看电池电量和充电状态,应用程序可以通过BatteryManager类获取电池状态信息。 4. 充电完成 当电池充满电,系统会停止充电流程,并通知用户和应用程序。通常情况下,系统会将充电电流降低到一个很小的值,以防止电池过充或者损坏。 5. 断开电源 当用户拔出充电器或者电源故障,系统会检测到电源断开事件,并停止充电流程。此,系统会根据电池的状态和充电模式,选择合适的电池管理策略,例如保持当前电量、降低电量等级、关闭不必要的应用程序等。 总的来说,安卓设备的充电流程是一个复杂的系统过程,需要多个服务和线程协同工作,以保证充电过程的安全、稳定和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值