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
.
在 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
.