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

Tom*_*Tom 6 android xamarin android-10.0

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

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

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

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

我认为这是由以下 android 10 更改引起的: “删除了应用主目录的执行权限”

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

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

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

应用应仅加载嵌入在应用 APK 文件中的二进制代码。

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

有没有办法执行(例如 Runtime.exec())嵌入在 apk 中的(二进制/本机)文件?

Tom*_*Tom 3

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

此外,尽管文档似乎暗示仅lib<name>.so提取该表单的文件,但我发现该文件夹中的所有文件都被提取。(更新:显然仅适用于调试版本?)子文件夹始终被忽略并且从不提取。

更新:虽然上述内容对于许多 Android 环境都是正确的,但我发现 chromebook Android 环境仅lib<name>.so安装以下形式的文件。甚至该表单的文件lib<name>.so.<version>也会被忽略。


过程是这样的:

  • 将二进制/本机文件放在lib/ABIAPK 的文件夹中。

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

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

我用了:

PackageManager.GetApplicationInfo("my.app.name", PackageInfoFlags.SharedLibraryFiles).NativeLibraryDir
Run Code Online (Sandbox Code Playgroud)
  • 从该文件夹执行二进制/本机程序。

会是这样的。

/data/app/my.app.name-RmBFingPOpsEA-S577DoZg==/lib/x86_64
Run Code Online (Sandbox Code Playgroud)

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