Android 10 - 作为存储在应用程序主目录中的子进程启动可执行文件的替代方法

Android 10 - alternative to launching executable as subproccess stored in app home directory

我有一个 android 应用程序(C#,Xamarin)

  1. 将 python 环境与其 apk 捆绑在一起。
  2. 将 python 文件提取到应用程序文件目录中。
  3. 通过将 python 可执行文件作为子进程执行来运行 python 代码。

这工作了很多年,但现在 android 10,我得到:

Write fault on path /[Unknown] 错误(这可能是真正错误的 Xamarin 包装器)。

我认为这是由以下 android 10 处更改引起的: "Removed execute permission for app home directory"

(虽然如果我 adbrunas 应用程序用户,执行 python 可执行文件工作正常。)

我的测试表明: 一般来说 运行 子进程仍然有效。 (例如/system/bin/echo) 但是执行存在于 apps home/files 目录中的任何子进程都会生成 Write fault on path /[Unknown] 错误。

在 android 10 个更改文件中,建议的替代方法是:

Apps should load only the binary code that's embedded within an app's APK file.

据我所知,无法获得嵌入式 apk 文件的文件路径。

有没有办法执行(例如Runtime.exec())嵌入在apk中的(binary/native)文件?

这只是一个短期解决方法(而不是正确的答案):

将 android targetSdkVersion29 更改为 28

这意味着,即使在 android 10 台设备上也应该可以正常工作,但是它有以下限制:

  1. 您永远无法升级目标 sdk 版本。
  2. 在未来的某个时候,google Play 商店将不允许上传针对旧 SDK 版本的应用,这意味着您无法 post 升级您的应用。

我找不到执行嵌入在 APK 中的 binary/native 文件的方法。但是,由于 android 在安装时会自动将文件提取到 lib/ABI/ 文件夹中,因此我能够将我的 python 可执行文件放入该文件夹中。

此外,尽管docs 似乎暗示只提取形式为lib<name>.so 的文件,但我发现该文件夹中的所有文件都已提取。 (更新:显然只针对 DEBUG 版本?) 子文件夹始终被忽略且从不提取。

UPDATE:虽然以上内容适用于许多 android 环境,但我发现 chromebook android 环境,只有 lib<name>.so 已安装。即使 lib<name>.so.<version> 格式的文件也会被忽略。


过程是这样的:

  • 将 binary/native 文件放入 APK 的 lib/ABI 文件夹中。

我使用 jar.exe 工具将文件添加到我的 apk。 (对于其他构建环境,有更简单的方法)

  • 在应用程序代码中,找到 apk 的 install 位置。 (不是数据目录)

我用过:

PackageManager.GetApplicationInfo("my.app.name", PackageInfoFlags.SharedLibraryFiles).NativeLibraryDir
  • 从该文件夹执行 binary/native prog。

会是这样的。

/data/app/my.app.name-RmBFingPOpsEA-S577DoZg==/lib/x86_64

这种方法的另一个好处是应用程序不必自己提取本机文件,而是在安装时自动完成。这缩短了应用启动时间。