在 fork 中使用 HwBinder

Using HwBinder inside fork

我正在实施一个正在为其创建测试的 HAL 组件。 该测试实际上是关于在不同的进程中创建 HAL 回调的模拟,并将其自身注册到 HAL。 也就是说,我是在mock HAL的client,然后模拟一个client crash导致事务失败来测试HAL处理错误的能力。 问题是,尝试在 fork 中使用 Binder IPC 会导致段错误。 阅读本文 question and from the documentation 我了解到 HwBinder 线程通过链接到 libbiner 自动启动。

鉴于fork()不复制父进程的运行线程,这意味着分叉进程将找不到helper HwBinder线程,或者假设它存在并尝试使用不管怎样?

这会产生一连串的错误,最终会出现 SEGV_MAPERR。

我的问题是,有没有办法在我的分叉子进程中重新启动 HwBinder 线程而不必使用 exec

这是我的代码:

pid_t pid = fork();
if (pid == 0) {
    using namespace ::android::hardware;
    using namespace testing;
   /**
    * Crash happens here
    */
    android::sp<IMyHal> iMyHal = IMyHal::getService();

    IMyHal->deregisterMyHalCallback();
    sp<MockIMyHalCallback> callbackMock(new MockIMyHalCallback());
    iMyHal->deregisterMyHalCallback(callbackMock);
    Status hidlStatus;
    hidlStatus.setException(Status::EX_TRANSACTION_FAILED, "Transaction Failed");
    EXPECT_CALL(*callbackMock, testFunction(Eq("1"), _))
        .WillOnce(DoAll(testing::Return(ByMove(android::hardware::Return<void>(hidlStatus)))))
        .Times(Exactly(1));
} else if (pid > 0) {
    /**
     * This will trigger iMyHal to call callbackMock.testFunction();
     */
    mProxy->callTestFunction("1", 2);
}

这会导致此错误:

2020-10-30 19:18:31.440 18917-18917/? A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xef400000 in tid 18917 (vendor.xxx.remo), pid 18917 (vendor.xxx.remo)

您打算测试您的 HAL 或跨进程 HwBinder 实现吗?在第一种情况下,您可能不需要创建一个完整的单独进程来测试您的 HAL。

通常的做法是:

  • 提供默认的 HAL 实现,可能是模拟 (example)
  • 为 HAL (example) 实施 VTS 测试,也可以 运行 针对真正的 HAL
  • 运行设备启动时的默认实现(或仅来自 adb shell)和 VTS 单独测试