我有一个 Android 应用程序(C#、Xamarin)
- 将 python 环境与其 apk 捆绑在一起。
- 将 python 文件提取到 app 文件目录中。
- 通过将 python 可执行文件作为子进程执行来运行 python 代码。
这已经工作了很多年,但现在在 android 10 上,我得到:
Write fault on path /[Unknown]
错误(这可能是真正错误的 Xamarin 包装器)。
我认为这是由以下 android 10 更改引起的:“删除了应用程序主目录的执行权限”
(虽然如果我adb
in and runas
应用程序用户,执行 python 可执行文件工作正常。)
我的测试表明:
一般来说,运行子进程仍然有效。 (例如/system/bin/echo)
但是执行应用程序主目录/文件目录中存在的任何子进程都会生成Write fault on path /[Unknown]
error.
在 android 10 更改文件中,建议的替代方法是:
应用程序应该只加载嵌入在应用程序中的二进制代码
APK 文件。
据我所知,无法获取嵌入式 apk 文件的文件路径。
有没有办法执行(例如 Runtime.exec())嵌入在 apk 中的(二进制/本机)文件?
我无法找到执行嵌入在 APK 中的二进制/本机文件的方法。但是,由于 android 自动提取 lib/ 中的文件ABI/ 安装时的文件夹,我能够将我的 python 可执行文件放在该文件夹中。
此外,尽管docs似乎暗示只有以下形式的文件lib<name>.so
解压后,我发现该文件夹中的所有文件都被解压了。
(更新:显然仅适用于调试版本?)
子文件夹始终被忽略并且从不提取。
UPDATE:虽然上述内容对于许多 Android 环境都是正确的,但我发现 chromebook Android 环境只有以下形式的文件lib<name>.so
已安装。甚至是以下形式的文件lib<name>.so.<version>
被忽略。
过程是这样的:
- 将二进制/本机文件放在
lib/ABI
APK 的文件夹。
我使用 jar.exe 工具将文件添加到我的 apk 中。 (对于其他构建环境,可能有更简单的方法)
- 在应用程序代码中,找到installapk 的位置。 (不是数据目录)
I used:
PackageManager.GetApplicationInfo("my.app.name", PackageInfoFlags.SharedLibraryFiles).NativeLibraryDir
会是这样的。
/data/app/my.app.name-RmBFingPOpsEA-S577DoZg==/lib/x86_64
这种方法的另一个好处是应用程序不必自行提取本机文件,而是在安装时自动完成。这可以缩短应用程序的启动时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)