1

我正在尝试在 Android 上获取 memfd。当我这样做时,一切似乎都很好:

int getFd() {
    ...
    int fd = syscall(__NR_memfd_create, "none", MFD_CLOEXEC | MFD_ALLOW_SEALING);
    errno = 0;
    write(fd, str.c_str(), str.length());
    logi(strerror(errno));
    lseek(fd, SEEK_SET, SEEK_SET);
    return fd;
}

memfd_create系统调用在较旧的 Android 版本上不存在。所以我试图在libcutils.so中调用ashmem_create_region。(不使用 ASharedMemory_create 因为 minSDK 26 仍然太高) 首先我注入 zygote 以对符号进行 dlsym。

// Should call in zygote through Riru
void initMemoryTools() {
    void *handle = dlopen("/system/lib/libcutils.so", RTLD_LAZY);
#define DLSYM(symbol, type) symbol = reinterpret_cast<type>(dlsym(handle, #symbol))
    DLSYM(ashmem_valid,           int (*)(int));
    DLSYM(ashmem_create_region,   int (*)(const char *, size_t));
    DLSYM(ashmem_set_prot_region, int (*)(int, int));
    DLSYM(ashmem_pin_region,      int (*)(int, size_t, size_t));
    DLSYM(ashmem_unpin_region,    int (*)(int, size_t, size_t));
    DLSYM(ashmem_get_size_region, int (*)(int));
#undef DLSYM
}

然后我将memfd_create替换为ashmem_create_region

int getFd() {
    ...
    int fd = ashmem_create_region("none", sizeof(char) * str.length());
    errno = 0;
    write(fd, str.c_str(), str.length());
    logi(strerror(errno));
    lseek(fd, SEEK_SET, SEEK_SET);
    return fd;
}

我成功地得到了一个 fd(不是 -1),但是 write() 抛出了 EINVAL,在尝试从这个 fd 中读取时也遇到了 EBADF。现在我想知道为什么会发生这种情况,我应该怎么做才能在 Android 7 ~ 11 上获得 memfd?

4

0 回答 0