首页 > 解决方案 > 在 Android 29 上运行可执行文件的路径是什么?

问题描述

我的 Android 应用程序包含一组可执行文件,这些可执行文件在第一次运行时被提取到应用程序目录 (/data/data/%package%/)。如果针对 Android 28 ( targetSdkVersion),它工作得很好。自 2020 年 11 月 2 日起,它不允许在 Google Play 中使用,并且所有应用程序都必须针对 29。因此它停止了权限异常的工作。

现在应该将可执行文件放在哪个目录?

PS。一些类似的应用程序也有同样的问题

标签: androidexecutableandroid-security

解决方案


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

当面向 API 29 (Android 10 / Q) 或更高版本时,不再可能对存储在应用程序主目录 (data) 中的文件拥有执行权限,这正是您所描述的 (/data/data/%package% /)。

此 Android 10 修改是在提交中引入的:https ://android-review.googlesource.com/c/platform/system/sepolicy/+/804149 ,然后在此处由 Google 正式确认:https ://issuetracker.google.com /问题/128554619

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

以下示例显示了如何处理此更改,在 Termux 中,在 android-10 分支中提交f6c3b6f或在此其他项目中显示如何通过将 .zip 存档中的所有文件提取到jniLibs/中来在 Android 上运行 Erlang 运行时abi”子目录(“abi”是 64 位 ARM 的 arm64-v8a,32 位 ARM 的 armeabi-v7a 等),具有Android 平台预期的强制lib___.so 文件名格式。可执行文件可以简单地手动移动到正确的项目文件夹中,重要的是使用 lib___.so 格式的文件名。

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

谢谢,杰罗姆


推荐阅读