总结 判断uwb服务启动问题

有一个问题,就是配置了uwb,如果在没有uwb的机器上,会不停的启动uwb的服务.

1
2
3
09-29 10:19:45.885 1 1 E init : Control message: Could not find 'aidl/android.hardware.uwb.IUwb/default' for ctl.interface_start from pid: 441 (/system/bin/servicemanager)
09-29 10:19:45.942 441 29301 W libc : Unable to set property "ctl.interface_start" to "aidl/android.hardware.uwb.IUwb/default": PROP_ERROR_HANDLE_CONTROL_MESSAGE (0x20)
09-29 10:19:45.948 1725 4002 W ServiceManagerCppClient: Waited one second for android.hardware.uwb.IUwb/default (is service started? Number of threads started in the threadpool: 32. Are binder threads started and available?)

网络上的一个类似的方案:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15

static bool HandleControlMessage(std::string_view message, const std::string& name,pid_t from_pid) {
+  if("aidl/android.hardware.biometrics.fingerprint.IFingerprint/default" == name){
+    return true;
+  }

std::string cmdline_path = StringPrintf("proc/%d/cmdline", from_pid);
    std::string process_cmdline;
    if (ReadFileToString(cmdline_path, &process_cmdline)) {
        std::replace(process_cmdline.begin(), process_cmdline.end(), '\0', ' ');
        process_cmdline = Trim(process_cmdline);
    } else {
        process_cmdline = "unknown process";
    }
}

那么进过验证,对uwb没有作用.
进过调试,如果把支持uwb 的feature删除, 确认服务是不会启动的.所以我们在pms里增加的打印堆栈

通过堆栈,我们发现是在SystemServer中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    /**
     * Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.
     */
    private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
        t.traceBegin("startOtherServices");

        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_UWB)) {
            t.traceBegin("UwbService");
            mSystemServiceManager.startServiceFromJar(UWB_SERVICE_CLASS, UWB_APEX_SERVICE_JAR_PATH);
            t.traceEnd();
        }

所以我们的修改方案就是在没有uwb的机器上,如果需要获取hasSystemFeature的地方,给返回false.

frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16

    public boolean hasSystemFeature(String name, int version) {
        // allow instant applications

        if("android.hardware.uwb".equals(name)) {
            //Log.d("PackageManagerService wentao", "wentao hasSystemFeature uwb" +Log.getStackTraceString(new Throwable()));

            //getprop ro.hw.mcu.mac
            String mcuMac = SystemProperties.get("ro.hw.mcu.mac", "(unknown)");
            Log.d("PackageManagerService", "mcuMac: " + mcuMac);
            if("(unknown)".equals(mcuMac)) {
                return false;
            }else{
                return true;
            }
        }

这个判断uwb的判断条件一定要在systemserver startOtherServices 之前,不然时序不对.

0%