Android ndk C++;不带addService()的活页夹 有可能使用C++绑定器API在两个非特权进程之间通信吗?

Android ndk C++;不带addService()的活页夹 有可能使用C++绑定器API在两个非特权进程之间通信吗?,android-ndk,android-binder,Android Ndk,Android Binder,我发现的所有示例(例如)都依赖于通过ServiceManager->addService()注册服务,在非根电话上执行时会引发以下错误: E/ServiceManager﹕ add_service('my.test.service',0x48) uid=2000 - PERMISSION DENIED 在文件frameworks/native/cmds/servicemanager/service_manager.c中的AOSP(Android开源项目)内部 您可以找到以下方法: int sv

我发现的所有示例(例如)都依赖于通过
ServiceManager->addService()
注册服务,在非根电话上执行时会引发以下错误:

E/ServiceManager﹕ add_service('my.test.service',0x48) uid=2000 - PERMISSION DENIED
在文件frameworks/native/cmds/servicemanager/service_manager.c中的AOSP(Android开源项目)内部 您可以找到以下方法:

int svc_can_register(uid_t uid, const uint16_t *name)
{
    size_t n;

    if ((uid == 0) || (uid == AID_SYSTEM))
        return 1;

    for (n = 0; n < sizeof(allowed) / sizeof(allowed[0]); n++)
        if ((uid == allowed[n].uid) && str16eq(name, allowed[n].name))
            return 1;

    return 0;
}
再往下看:

if (!svc_can_register(uid, s)) {
    ALOGE("add_service('%s',%x) uid=%d - PERMISSION DENIED\n",
         str8(s), handle, uid);
    return -1;
}
结论:/system/bin/servicemanager中的系统二进制文件不允许这样做。(出于安全原因) 可能的解决办法:

  • 终止并重用列出的PID和服务名称
  • 重新编译您自己的servicemanager二进制文件并使用此二进制文件
  • 将您的代码注入此二进制文件,以允许所有人
  • 更改PID servicemanager读取(更改servicemanager在binder.h(相同目录)中获取的ioctl响应)
  • 或者在具有根权限的二进制文件中启动服务器。客户端可以不使用root进行连接,但服务器需要它
if (!svc_can_register(uid, s)) {
    ALOGE("add_service('%s',%x) uid=%d - PERMISSION DENIED\n",
         str8(s), handle, uid);
    return -1;
}