在Android系统中,通过U-Boot(通常称为uboot)来设置启动参数(如cmdline)或尝试直接将数据传递给应用层(通过系统属性property)是一个较为间接的过程,因为U-Boot主要负责硬件初始化和引导Linux内核,而Android系统属性则是由Android系统服务(如init进程和property服务)管理的。不过,我们可以通过一些间接的方法来实现这一目标。
在U-Boot中设置cmdline是相对直接的,因为它涉及到修改传递给Linux内核的启动参数。然而,在U-Boot中直接设置Android系统属性(如/system/build.prop中的属性)是不可能的,因为这些属性是Android系统初始化过程中由init进程或其他系统服务管理的。
1. 设置cmdline并通过内核传递给Android
a. 在U-Boot中设置cmdline
在U-Boot中,你可以通过setenv命令来设置cmdline环境变量。这个cmdline将在U-Boot引导Linux内核时传递给内核。例如:
setenv bootargs console=ttyO0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait androidboot.mode=charger
这里的androidboot.mode=charger就是一个示例参数,它可以在内核或Android系统启动时被读取。
如下参考方法,设置环境变量并赋值:
/* update lcdid command line */
char lcdid[8];
snprintf(lcdid, sizeof(lcdid), "0x%x", result[0]);
ret = env_set("sub_lcd_id", lcdid);
然后在更新cmdline参数的地方添加自己的参数:
str = env_get("sub_lcd_id");
if (str) {
snprintf(tmpbuf, 128, " sub_lcd_id=%s", str);
strncat(cmdline, tmpbuf, sizeof(cmdline) - strlen(cmdline) - 1);
}
如此就可以在内核获取的cmdline参数中看到添加的参数。
2.在Linux内核中读取cmdline
内核启动时会读取cmdline,并将其内容存储在/proc/cmdline文件中。Android系统(或任何Linux系统)中的应用程序和服务可以读取这个文件来获取启动参数。
3.在Android中读取cmdline
在Android中,可以通过Java的SystemProperties类或者C/C++的__system_property_get函数来读取系统属性,但/proc/cmdline的内容通常不会被直接映射为一个系统属性。不过,你可以在应用或系统服务启动时读取/proc/cmdline文件,并根据需要设置系统属性。
3.1 在应用层读取属性
应用层可以使用Java的SystemProperties类(注意:这个类在Android SDK中不公开,但可以通过反射使用)或C/C++的__system_property_get函数来读取系统属性。
在system/core/init/property_service.cpp中添加并设置属性
static void ProcessKernelCmdline() {
ImportKernelCmdline([&](const std::string& key, const std::string& value) {
if (StartsWith(key, ANDROIDBOOT_PREFIX)) {
InitPropertySet("ro.boot." + key.substr(ANDROIDBOOT_PREFIX.size()), value);
}
if (key == "sub_lcd_id") {
InitPropertySet("ro.disp.subid", value);
}
});
}
4.总结
由于U-Boot和Android系统之间的隔阂,你不能直接从U-Boot设置Android系统属性。相反,你需要在U-Boot中设置cmdline或其他启动参数,然后在Linux内核或Android系统启动时读取这些参数,并根据需要设置系统属性。最后,应用层可以读取这些系统属性以获取所需的数据。
请注意,由于Android的安全和沙箱模型,应用层通常不能直接访问或修改系统属性,除非它们具有相应的权限或通过系统服务进行间接访问。
标签:读取,05,Boot,cmdline,内核,Android,属性 From: https://blog.csdn.net/jiangchaobing_2017/article/details/140733975