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 \ ......................
深圳宝安华美居