Android 服务名称规则invalid service name 限制16字符以内

今天调试网络服务的时候为了区分,修改了原有服务名称,同时新增了两个服务。

系统运行的时候报错找不到对应的服务

init: no such service 'wpa_supplicant_common'

cat init.rc文件,查看对应的服务是否存在对应的rc文件。

# wifi service
# wifi sta service
service wpa_supplicant_common  /system/bin/wpa_supplicant p2p_supported=false 
        -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf 
        -I/system/etc/wifi/wpa_supplicant_overlay.conf 
        -O/data/misc/wifi/sockets -e/data/misc/wifi/entropy.bin
        class main
        socket wpa_wlan0 dgram 660 wifi wifi
        disabled
        oneshot

# wifi sta p2p concurrent service
service p2p_supplicant_common  /system/bin/wpa_supplicant p2p_supported=true 
        -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf 
        -e/data/misc/wifi/entropy.bin -N 
        -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf 
        -I/system/etc/wifi/wpa_supplicant_overlay.conf 
        -O/data/misc/wifi/sockets
        class main
        socket wpa_wlan0 dgram 660 wifi wifi
        disabled
        oneshot

# for rtl wifi
service p2p_supplicant_rtl /system/bin/wpa_supplicant 
     -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin -N 
     -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf
     class main
     socket wpa_wlan0 dgram 660 wifi wifi
     group wifi inet
     disabled
     oneshot

service wpa_supplicant_rtl /system/bin/wpa_supplicant 
     -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf 
     -e/data/misc/wifi/entropy.bin
     class main
     socket wpa_wlan0 dgram 660 wifi wifi
     group wifi inet
     disabled
     oneshot

确认服务是已经添加到了对应的文件。

手动启动服务再测试一下,同样显示找不到对应的服务。

setprop ctl.start wpa_supplicant_common                     
[  126.046251] init: no such service 'wpa_supplicant_common'
dolphin-fvd-p1:/ # setprop ctl.start wpa_supplicant_rtl                        
[  136.016232] init: no such service 'wpa_supplicant_rtl'
.589306] init: no such service 'wpa_supplicant_common'      

查看系统开机的init log,提示无效的服务名。

[    1.816434] init: /init.sun8iw7p1.rc: 291: invalid service name 'wpa_supplicant_common'
[    1.825430] init: /init.sun8iw7p1.rc: 304: invalid service name 'p2p_supplicant_common'
[    1.834409] init: /init.sun8iw7p1.rc: 313: invalid service name 'p2p_supplicant_rtl'
[    1.843091] init: /init.sun8iw7p1.rc: 322: invalid service name 'wpa_supplicant_rtl'

原本的服务名是

wpa_supplicant
p2p_supplicant

但是为了适应不同的wifi模块所以新加后缀方便区分。

查看init源码,检查服务名称invalid的判定规则。

bool ServiceParser::ParseSection(const std::vector<std::string>& args,        
 789                                  std::string* err) {                          
 790     if (args.size() < 3) {                                                    
 791         *err = "services must have a name and a program";                     
 792         return false;                                                         
 793     }                                                                         
 794                                                                               
 795     const std::string& name = args[1];                                        
 796     if (!IsValidName(name)) {                                                 
 797         *err = StringPrintf("invalid service name '%s'", name.c_str());       
 798         return false;                                                         
 799     }                                                                         
 800                                                                               
 801     std::vector<std::string> str_args(args.begin() + 2, args.end());          
 802     service_ = std::make_unique<Service>(name, "default", str_args);          
 803     return true;                                                              
 804 } 

bool ServiceParser::IsValidName(const std::string& name) const {              
 819     if (name.size() > 16) {                                                   
 820         return false;                                                         
 821     }                                                                         
 822     for (const auto& c : name) {                                              
 823         if (!isalnum(c) && (c != '_') && (c != '-')) {                        
 824             return false;                                                     
 825         }                                                                     
 826     }                                                                         
 827     return true;                                                              
 828 } 

从上可以看出android的服务名称限制如下:

1、必须小于等于16个字符。

2、只允许数字、字母及下划线、中划线。

查看修改后的服务名称明显都超出了16个字符,所以只需要服务名称再16个字符内即可。

[    1.816434] init: /init.sun8iw7p1.rc: 291: invalid service name 'wpa_supplicant_common'
[    1.825430] init: /init.sun8iw7p1.rc: 304: invalid service name 'p2p_supplicant_common'
[    1.834409] init: /init.sun8iw7p1.rc: 313: invalid service name 'p2p_supplicant_rtl'
[    1.843091] init: /init.sun8iw7p1.rc: 322: invalid service name 'wpa_supplicant_rtl'

重新修改后名称如下,验证已解决。

# wifi service
# wifi sta service
service wpa_supp_com  /system/bin/wpa_supplicant p2p_supported=false 
 .............

# wifi sta p2p concurrent service
service p2p_supp_com  /system/bin/wpa_supplicant p2p_supported=true 
 ....................
# for rtl wifi
service p2p_supp_rtl /system/bin/wpa_supplicant 
 .............

service wpa_supp_rtl /system/bin/wpa_supplicant 
    ......................
原文地址:https://www.cnblogs.com/tid-think/p/12165273.html