首页 > 其他分享 >【Android驱动05】通过U-Boot来设置启动参数cmdline将数据传递给应用层的方法

【Android驱动05】通过U-Boot来设置启动参数cmdline将数据传递给应用层的方法

时间:2024-07-27 13:30:02浏览次数:8  
标签:读取 05 Boot cmdline 内核 Android 属性

在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

相关文章