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

2023-11-27

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

  1. 将 python 环境与其 apk 捆绑在一起。
  2. 将 python 文件提取到 app 文件目录中。
  3. 通过将 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/ABIAPK 的文件夹。

我使用 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(使用前将#替换为@)

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

随机推荐

  • angularjs 支持哪些版本的 Firefox?

    In the AngularJS 文档 他们说 Angular 支持 Webkit Firefox IE gt 8 但 Firefox 到底是哪些版本呢 我需要创建一个支持 Firefox 25 的应用程序 那可能吗 我知道这是一个旧线程
  • 如何在Vim中高效地交错多组线条?

    我正在尝试交错三组文本行 例如 以下文本 a a a b b b c c c 将被转化为 a b c a b c a b c 有没有有效的方法来做到这一点 在我内心深处的某个地方 vim文件我有一个 Interleave命令 附在下面 不带
  • 使用空格分隔符和最大长度分割字符串

    我想以类似的方式分割字符串 split 因此产生一个列表 但以更智能的方式 我希望它将其分割成最多 15 个字符的块 但不会分割中间的单词 因此 string A string with words splitting process ta
  • 如何在 BQ 命令行中设置 Bigquery 需要分区过滤器

    在 Big Query Web GUI 中创建新的空分区表架构时 您可以设置需要分区过滤器选项 使用 bq 命令行工具创建表时如何设置相同的选项 现在我的命令是 bq mk table time partitioning field eve
  • Bash 终端输出 - 突出显示包含某些文本的行

    当我在 bash 中得到输出时 我得到了标准的 2 色屏幕 默认情况下 如果某行包含一些关键文本输出 有什么方法可以突出显示该行吗 例如 如果它包含单词 FAIL 则该行颜色为红色 我读过这个https unix stackexchange
  • 如何索引 PDF 文件并搜索关键字?

    我有一堆 PDF 几百个 它们没有适当的结构 也没有特定的领域 他们所拥有的只是大量的文字 我正在尝试做的事情 对 PDF 建立索引并根据索引搜索一些关键字 我有兴趣查找该特定关键字是否在 PDF 文档中 如果是 我想要找到该关键字的行 如
  • 用 UI 对话框替换提示

    如何用简单的 UI 对话框替换此代码中的提示以实现相同的效果 使用提示时 IE 会发出安全警告 HTML
  • vh / % 单位和移动设备上的键盘

    我对像这样的单位有问题vh 对于高度 当有任何input处于活动状态时 移动设备上的键盘会更改元素高度 我正在寻找在键盘处于活动状态时将其更改为静态高度的解决方案 jsfiddle 在移动设备上打开 这个问题很简单 我们以前都经历过 幸运的
  • iPad 上捕获视图上下文的质量低

    我需要捕获特定的 UIView 但结果质量低下 如何解决此问题并提高质量 UIGraphicsBeginImageContext captureView bounds size captureView layer renderInConte
  • 在 C# 中使用 WMI 更改用户家长控制设置

    我对 WMI 和 COM 真的很陌生 我想更改用户帐户家长控制的一些参数和 唯一可用的 API 是 WMI 要使用的 WMI 提供程序类是 WpcUserSettings 我不明白如何修改每个用户的参数 我必须创建一个 每个用户都有此类的
  • 如何防止 WordPress 剥离摘录中的 HTML 标签

    我正在使用 wp trim words 修剪主页上的一些摘录 它工作正常 只是它从摘录中删除了 HTML 标签 我需要能够将摘录的某些部分加粗 使用 strong 按照说明进行操作here 我尝试删除 wp trim words 函数并使用
  • Laravel - 作业在一台服务器上调度,在另一台服务器上处理

    我正在研究 Laravel 应用程序的日志记录方面 amd 计划将数据发送到 SQS 以便稍后检索 但是 我想将作业从生产服务器分派到 AWS 队列 然后让队列在侦听队列的单独日志服务器上工作 我了解如何设置队列工作程序来监听队列 但是 L
  • Jetty:以编程方式停止会导致“1 个线程无法停止”

    我有一个嵌入式 Jetty 6 1 26 实例 我想通过 HTTP GET 发送到来关闭它 shutdown 所以我创建了一个JettyShutdownServlet Override protected void doGet HttpSe
  • 通过超时取消 C# 4.5 TcpClient ReadAsync

    通过超时取消 TcpClient ReadAsync 操作并捕获 NET 4 5 中的此超时事件的正确方法是什么 TcpClient ReadTimeout 似乎适用于同步只读 UPDATE 尝试应用此处描述的方法取消异步操作 var bu
  • VS2015CE中显示多余的空行,无法去掉

    当我使用
  • R 中的交互式散点图,覆盖/悬停摘要/工具提示作为用户提供的绘图函数

    我一直在研究 R 中的交互式绘图 我知道有几个包可以创建交互式绘图 特别是散点图 但我正在寻找某种功能 例如这个情节 人们可以将鼠标悬停在按钮上以获得该点后面数据的小数字摘要 即工具提示 当您拥有包含更多变量的数据集时 通常最好探索 可视化
  • Android TextView 文本未换行

    谁能告诉我文字出了什么问题 超过一行的文本不会换行到下一行 而是超出屏幕 以下是代码
  • R-3.2.1 无法加载共享对象 internet.so

    将 R 从 3 1 3 升级到 3 2 1 后 我无法从 CRAN 安装软件包 错误信息是共享对象internet so无法加载 install packages randomForest Installing package into g
  • 具有输入/输出流的 Java 进程

    我下面有以下代码示例 您可以在 bash shell 中输入命令 即echo test并让结果回显 然而 读完第一遍之后 其他输出流不起作用 为什么会这样或者我做错了什么 我的最终目标是创建一个线程计划任务 定期向 bash 执行命令 以便
  • Android 10 - 作为存储在应用程序主目录中的子进程启动可执行文件的替代方案

    我有一个 Android 应用程序 C Xamarin 将 python 环境与其 apk 捆绑在一起 将 python 文件提取到 app 文件目录中 通过将 python 可执行文件作为子进程执行来运行 python 代码 这已经工作了