zoukankan      html  css  js  c++  java
  • 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 
        ......................
  • 相关阅读:
    采用闭锁(CountDownLatch)控制线程的先后顺序(一)
    采用java信号量(semaphore)让线程轮流打印
    生产者消费者模式的java实现(实现四)
    生产者消费者模式的java实现(实现三)
    生产者消费者模式的java实现(实现二)
    生产者消费者模式的java实现(实现一)
    求最大子串和 最长子串的java写法
    Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process 异常处理
    定时任务服务器不定时重启原因解析
    centos 6.3 + gerrit-2.8.6 + repo 实践
  • 原文地址:https://www.cnblogs.com/tid-think/p/12165273.html
Copyright © 2011-2022 走看看