有一个问题,就是配置了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 之前,不然时序不对.