Android 10 - 作为存储在应用程序主目录中的子进程启动可执行文件的替代方法
Android 10 - alternative to launching executable as subproccess stored in app home directory
我有一个 android 应用程序(C#,Xamarin)
- 将 python 环境与其 apk 捆绑在一起。
- 将 python 文件提取到应用程序文件目录中。
- 通过将 python 可执行文件作为子进程执行来运行 python 代码。
这工作了很多年,但现在 android 10,我得到:
Write fault on path /[Unknown]
错误(这可能是真正错误的 Xamarin 包装器)。
我认为这是由以下 android 10 处更改引起的:
"Removed execute permission for app home directory"
(虽然如果我 adb
和 runas
应用程序用户,执行 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 targetSdkVersion
从 29
更改为 28
这意味着,即使在 android 10 台设备上也应该可以正常工作,但是它有以下限制:
- 您永远无法升级目标 sdk 版本。
- 在未来的某个时候,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
这种方法的另一个好处是应用程序不必自己提取本机文件,而是在安装时自动完成。这缩短了应用启动时间。
我有一个 android 应用程序(C#,Xamarin)
- 将 python 环境与其 apk 捆绑在一起。
- 将 python 文件提取到应用程序文件目录中。
- 通过将 python 可执行文件作为子进程执行来运行 python 代码。
这工作了很多年,但现在 android 10,我得到:
Write fault on path /[Unknown]
错误(这可能是真正错误的 Xamarin 包装器)。
我认为这是由以下 android 10 处更改引起的: "Removed execute permission for app home directory"
(虽然如果我 adb
和 runas
应用程序用户,执行 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 targetSdkVersion
从 29
更改为 28
这意味着,即使在 android 10 台设备上也应该可以正常工作,但是它有以下限制:
- 您永远无法升级目标 sdk 版本。
- 在未来的某个时候,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
这种方法的另一个好处是应用程序不必自己提取本机文件,而是在安装时自动完成。这缩短了应用启动时间。