Android source 在叉子内使用活页夹

Android source 在叉子内使用活页夹,android-source,hal,android-binder,hidl,Android Source,Hal,Android Binder,Hidl,我正在实现一个HAL组件,我正在为它创建一个测试。 测试实际上是在不同的进程中创建HAL回调的模拟,并将其自身注册到HAL。 换句话说,我模拟HAL的客户端,然后模拟导致事务失败的客户端崩溃,以测试HAL处理错误的能力。 问题是,试图在分叉内使用活页夹IPC会导致SEG故障。 读了这篇文章,从中我了解到HwBinder线程通过链接到libbiner自动启动 假设fork()不复制父线程的运行线程,这意味着fork进程将找不到helper HwBinder线程,或者它假定它存在并尝试使用它 这会产

我正在实现一个HAL组件,我正在为它创建一个测试。 测试实际上是在不同的进程中创建HAL回调的模拟,并将其自身注册到HAL。 换句话说,我模拟HAL的客户端,然后模拟导致事务失败的客户端崩溃,以测试HAL处理错误的能力。 问题是,试图在分叉内使用活页夹IPC会导致SEG故障。 读了这篇文章,从中我了解到HwBinder线程通过链接到libbiner自动启动

假设
fork()
不复制父线程的运行线程,这意味着fork进程将找不到helper HwBinder线程,或者它假定它存在并尝试使用它

这会产生一系列错误,最终导致SEGV_映射错误

我的问题是,是否有必要在我的分叉子线程中重新启动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);
}

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

通常的做法是:

  • 提供默认HAL实现,可能是模拟()
  • 为HAL()实现VTS测试,该测试也可以针对真实的HAL运行
  • 在设备启动时(或仅从
    adb shell
    )运行默认实现,并单独进行VTS测试
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)