在 Android 29 上将可执行文件放到 运行 的路径是什么?

What path to put executable to run on Android 29?

我的 Android 应用程序包含一组可执行文件,这些可执行文件在第一个 运行 上被提取到应用程序目录 (/data/data/%package%/)。如果针对 Android 28 (targetSdkVersion),它工作得很好。自 2020 年 11 月 2 日起,Google Play 和所有应用 must target to 29. So it stopped working with permission exception.

不允许使用它

现在可执行文件应该放在什么目录?

PS。一些类似的应用有 the same issue.

https://developer.android.com/about/versions/10/behavior-changes-10#execute-permission

当定位 API 29 (Android 10 / Q) 或更高版本时,不再可能对存储在应用程序主目录(数据)中的文件具有执行权限,这正是你在描述什么(/data/data/%package%/)。

此 Android 10 修改已在提交中引入:https://android-review.googlesource.com/c/platform/system/sepolicy/+/804149 and was then confirmed officially by Google here: https://issuetracker.google.com/issues/128554619

各种项目正在讨论这一重大变化,例如 termux/termux-app#1072。一种推荐且(希望)面向未来的方法是 将程序二进制文件提取到应用程序的本机 lib 目录(android:extractNativeLibs=true), 文件仍然可以执行但以只读方式存储以提高安全性。

以下示例展示了如何处理此更改,在 Termux 中提交 f6c3b6f in the android-10 branch or in this other project showing how to run the Erlang runtime on Android,将 .zip 存档中的所有文件提取到 jniLibs/"abi" 子目录(“abi”对于 64 位 ARM 是 arm64-v8a,对于 32 位 ARM 是 armeabi-v7a,等等)具有强加的 lib___.so 文件名格式 Android 平台。可执行文件可以简单地手动移动到正确的项目文件夹中,重要的部分是使用 lib___.so 文件名格式。

在 Android 清单文件中,设置属性 android:extractNativeLibs="true" 将在安装时提取这些 lib___.so 文件在正确的本机 lib 目录中,支持执行权限。如果需要,最终可以在通常的应用程序目录中创建符号链接,以使用常规可执行文件名称,而不是更难操作的 lib___.so 版本。

谢谢,杰罗姆