Android 无法从 /lib/<arch> 执行 Android API 29 (Android 10) 的进程

Android can't execute process for Android API 29 (Android 10) from /lib/<arch>

在 Android API 29 中,由于 W^X 违规,我们无法从数据文件夹执行进程。 Google 似乎建议我们必须从 /lib/[arch] 文件夹中执行它们。但是,只会安装格式为 lib[name].so 的文件,即使包含在 APK 中也是如此。此外,当尝试执行恰好以该格式命名的文件时,它只会 returns 退出代码 1,无一例外。程序不执行。

这个答案表明了类似的东西,但没有提到执行“错误命名”的文件:

据我所知,运行 APK 中包含的本机可执行文件现在是不可能的,而不仅仅是在定位时调用共享库 API 29。这是正确的,还是有什么具体我们需要做的。

Google are aware 我们需要以违反直觉的方式重命名我们的可执行文件以匹配 lib….so 模式,但他们似乎对此感到满意,并且有几次他们表示决心不这样做通过 Runtime.exec() 中断对 运行 本机可执行文件的支持。实际上,期望他们更改自 Android Cupcake.

以来制定的命名约定可能为时已晚。

这就是说,有一些额外的事情需要处理:

  • 确保文件已提取(默认情况下, android:extractNativeLibs="false" 构建捆绑包时)。

  • 确保可执行文件没有未满足的依赖项 (例如 c++_shared)。

  • 如果您的可执行文件需要 non-system 个库(加载时或通过 dlopen()),您必须将 LD_LIBRARY_PATH 提供给您的 lib 目录(不像 System.loadLibrary(),这没有解决 你)。

  • 不要硬编码 exec() 的路径,使用 getApplicationInfo().nativeLibraryDir.