【问题标题】:What path to put executable to run on Android 29?在 Android 29 上运行可执行文件的路径是什么?
【发布时间】:2020-11-11 12:54:03
【问题描述】:

我的 Android 应用包含一组可执行文件,这些可执行文件在首次运行时被提取到应用目录 (/data/data/%package%/)。如果针对 Android 28 (targetSdkVersion),它工作得很好。自 2020 年 11 月 2 日起,它不允许在 Google Play 中使用,所有应用程序 must 的目标为 29。因此它停止与 permission exception 合作。

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

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

【问题讨论】:

  • 我想知道那将是什么权限。即使在 29 上,您也可以在没有任何权限的情况下将任何文件复制到该目录。
  • @blackapps 执行权限

标签: android executable android-security


【解决方案1】:

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/issues/128554619

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

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

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

谢谢,杰罗姆

【讨论】:

  • 我可以确认它正在工作。然而,这种方法的另一个显着缺点(除了需要创建符号链接)是 apk 本质上是 zip 文件,并且压缩率比 7zip 差(如果归档到原始文件并以编程方式提取)。在某些极端情况下,它会使 apk 文件大小超过 150mb,这可能是个问题。任何建议表示赞赏。
猜你喜欢
  • 1970-01-01
  • 2013-10-27
  • 2020-02-11
  • 2017-01-18
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多