首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android 10 -替代可执行文件作为存储在app主目录中的子进程启动

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

Stack Overflow用户
提问于 2020-06-15 15:38:53
回答 2查看 2.1K关注 0票数 6

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

  1. 用apk捆绑python环境。
  2. 将python文件解压缩到应用程序文件目录中。
  3. 通过将python可执行文件作为子进程执行,运行python代码。

这已经成功了很多年,但是现在在android 10上,我得到了:

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

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

(虽然如果我adb in和runas应用程序用户,那么执行python可执行文件就可以了。)

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

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

应用程序应该只加载嵌入到应用程序APK文件中的二进制代码。

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

有执行的方法吗?Runtime.exec()是嵌入在apk中的(二进制/本机)文件?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-15 18:36:18

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

此外,尽管文档似乎意味着只提取表单lib<name>.so的文件,但我发现该文件夹中的所有文件都已被解压。(更新:显然只用于调试生成?)子文件夹总是被忽略,并且从未提取。

UPDATE:虽然上面的内容适用于很多安卓环境,但我发现chromebook android环境中只安装了表单lib<name>.so的文件。甚至表单lib<name>.so.<version>的文件也会被忽略。

这个过程是这样的:

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

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

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

我用:

代码语言:javascript
复制
PackageManager.GetApplicationInfo("my.app.name", PackageInfoFlags.SharedLibraryFiles).NativeLibraryDir
  • 从该文件夹执行二进制/本机程序。

会是这样的。

代码语言:javascript
复制
/data/app/my.app.name-RmBFingPOpsEA-S577DoZg==/lib/x86_64

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

票数 3
EN

Stack Overflow用户

发布于 2020-06-15 16:06:05

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

将android targetSdkVersion29更改为28

这意味着,即使在android 10设备上,事情也应该有效,但是它有以下限制:

  1. 您永远无法升级目标sdk版本。
  2. 在将来的某个时候,google play商店将不允许针对较旧的sdk版本的应用程序上传,这意味着您不能发布对应用程序的升级。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62391811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档