searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

android13中cmdline中属性带=的问题解决

2024-03-29 08:12:24
0
0

最近在android13中遇到例如以下参数kernel启动参数

Kernel command line: ....... vendorboot.net_address=192.168.0.1 vendorboot.test.test1={"key":"afsU=","value":"xxx"} 

此时在系统启动完毕并不能看到属性为test.test1的值,通过查看android13的代码发现在propertyService中,对属性和value的处理方式和之前android9上有些不同,即根据`=`为分隔符来进行判断,如果属性值中出现了`=`则不会被写入到系统中,代码如下:

void ImportKernelCmdline(const std::function<void(const std::string&, const std::string&)>& fn) {
    std::string cmdline;
    android::base::ReadFileToString("/proc/cmdline", &cmdline);

    for (const auto& entry : android::base::Split(android::base::Trim(cmdline), " ")) {
        std::vector<std::string> pieces = android::base::Split(entry, "=");
        if (pieces.size() == 2) {
            fn(pieces[0], pieces[1]);      
    }
}

 

通过`pices.size==2`可以得出启动参数中不能出现多个`=`,如果要支持cmdline中带多个=的方式可以参考下面方式解决:即将第一个=作为key和value的分隔符进行分割:

void ImportKernelCmdline(const std::function<void(const std::string&, const std::string&)>& fn) {
    std::string cmdline;
    android::base::ReadFileToString("/proc/cmdline", &cmdline);

    for (const auto& entry : android::base::Split(android::base::Trim(cmdline), " ")) {
        std::vector<std::string> pieces = android::base::Split(entry, "=");
        if (pieces.size() == 2) {
            fn(pieces[0], pieces[1]);
        } else if (pieces.size() > 2) {
            size_t pos = entry.find("=");
            if (pos != std::string::npos) {
                std::pair kv = std::make_pair(entry.substr(0, pos), entry.substr(pos + 1));
                fn(kv.first, kv.second);
            }
        }        
    }
}

 

0条评论
作者已关闭评论
张****龙
18文章数
0粉丝数
张****龙
18 文章 | 0 粉丝
张****龙
18文章数
0粉丝数
张****龙
18 文章 | 0 粉丝
原创

android13中cmdline中属性带=的问题解决

2024-03-29 08:12:24
0
0

最近在android13中遇到例如以下参数kernel启动参数

Kernel command line: ....... vendorboot.net_address=192.168.0.1 vendorboot.test.test1={"key":"afsU=","value":"xxx"} 

此时在系统启动完毕并不能看到属性为test.test1的值,通过查看android13的代码发现在propertyService中,对属性和value的处理方式和之前android9上有些不同,即根据`=`为分隔符来进行判断,如果属性值中出现了`=`则不会被写入到系统中,代码如下:

void ImportKernelCmdline(const std::function<void(const std::string&, const std::string&)>& fn) {
    std::string cmdline;
    android::base::ReadFileToString("/proc/cmdline", &cmdline);

    for (const auto& entry : android::base::Split(android::base::Trim(cmdline), " ")) {
        std::vector<std::string> pieces = android::base::Split(entry, "=");
        if (pieces.size() == 2) {
            fn(pieces[0], pieces[1]);      
    }
}

 

通过`pices.size==2`可以得出启动参数中不能出现多个`=`,如果要支持cmdline中带多个=的方式可以参考下面方式解决:即将第一个=作为key和value的分隔符进行分割:

void ImportKernelCmdline(const std::function<void(const std::string&, const std::string&)>& fn) {
    std::string cmdline;
    android::base::ReadFileToString("/proc/cmdline", &cmdline);

    for (const auto& entry : android::base::Split(android::base::Trim(cmdline), " ")) {
        std::vector<std::string> pieces = android::base::Split(entry, "=");
        if (pieces.size() == 2) {
            fn(pieces[0], pieces[1]);
        } else if (pieces.size() > 2) {
            size_t pos = entry.find("=");
            if (pos != std::string::npos) {
                std::pair kv = std::make_pair(entry.substr(0, pos), entry.substr(pos + 1));
                fn(kv.first, kv.second);
            }
        }        
    }
}

 

文章来自个人专栏
linux相关
18 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0