手机关机充电时,会通过lk加载bootimage 并挂载根文件系统,最终运行到kernel 的init 进程。这时init 会挂载systemimage ,但并没有切换到是主文件系统,所以主文件系统中的东西是不能用的。
bootimage 是由kernel img 与 ramdisk 打包成的,这里ramdisk 是根文件系统,是打包的root 目录下内容。systemimage是主文件系统,打包的是/system下内容。
init 进程加载/default.prop 文件,挂载systemimage。
android属性文件值读取顺序通常为 /default.prop,/system/build.prop,/system/default.prop,/data/local.prop,文件也会生成在不同的位置。default.prop生成在root目录下,其他在对应的/system,/data目录下。default.prop与build.prop都是由通过编译目录下的build/core/Makefile文件生成的。
所以 ADDITIONAL_DEFAULT_PROPERTIES 与PRODUCT_DEFAULT_PROPERTY_OVERRIDES 定义的属性都可以使用到root目录,即ramdisk中。
PRODUCT_PROPERTY_OVERRIDES 定义的属性生成在/system/build.prop下,只能用于根文件系统。
init.rc 中
on charger
mount ext4 /dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system ro wait
chmod 0666 /dev/kmsg
Write /sys/devices/platform/battery_meter/FG_daemon_log_level 7
start fuelgauged
start kpoc_charger start servicemanager
service kpoc_charger /vendor/bin/kpoc_charger class charger
在init 进程中会启动kpoc_charger 服务,关机充电这个时候由于运行的是ramdisk 。
在根文件系统中
vendor -> /system/vendor
所以根文件系统 /vendor/bin/kpoc_charger 充电服务就对应着主文件/system/vendor/bin/kpoc_charge
系统的服务必须生成在root目录下或者以上边的形式链接到主文件系统下才能使用。
vendor\mediatek\proprietary\external\charger\charging_control.cpp
static int on_uevent(const char *buf, int len_buf)
{
#ifdef VERBOSE_OUTPUT
KPOC_LOGI("on_uevent, %s\n", buf);
#endif
if (!strcasestr(buf, UEVENT_BATTERY_CHANGE))
return 1;
//if ac or usb online
if (is_charging_source_available())
{
int ret = -1;
char value[PROP_VALUE_MAX];
int is_support_breath_plus = 0;
bc = get_capacity();
ret = __system_property_get("ro.dyf.breathe.plus", value);
if (ret > 0){
is_support_breath_plus = strcmp(value, "1") ? 0 : 1;
}else if (ret == 0){
//is_support_breath_plus = 1;
KPOC_LOGI("is_support_breath_plus =0, %s\n", value);
}
if ((is_support_breath_plus == 1) || (bc >= 90)) {
lights_full();
} else {
if (nCurrentState != LIGHTS_STATE_CHGON)
set_light_state(LIGHTS_CHGON);
#ifdef BREATH_PLUS_SUPPORT
lights_full();
#else
lights_on();
#endif
}
}
else
exit_charger(EXIT_CHARGING_MODE);
return 1;
}
如果kpoc_charger 使用属性,这个时候必须在root目录下有对应的属性。
ADDITIONAL_DEFAULT_PROPERTIES += ro.dyf.breathe.plus=1
或者在Android.mk 中用宏控制。
ifneq ($(filter S12 S32 S21 S32LTE,$(TARGET_PRODUCT)),)
#LOCAL_CFLAGS += -DBREATH_PLUS_SUPPORT
endif