Android 上的外部进程终止,退出代码为 159(使用 SIGSYS 异常终止?)

问题描述 投票:0回答:1

我正在编写一个生成外部进程的应用程序(一个移植的 Linux 应用程序,它又生成其他进程)。这最终将在单独的线程中完成,但是出于测试目的,我从 UI 线程生成该进程(在单独的线程中处理输出)。

外部进程二进制文件是用 OCaml 编写的,并被构建为具有相同 ABI 的 Linux 目标的静态二进制文件。

在 Anbox(基于 Android 7)上,这按预期工作并且该过程正常完成。在运行 LineageOS 18.1 (Android 11) 的真实设备上,该进程启动并产生一些输出,但几秒钟后结束,返回退出代码 159。

根据我的研究,这表明信号 31(退出代码负 128)异常终止(退出代码 > 128)。

在 Linux 上,31 是 x86 和 ARM 平台上

SIGSYS
以及
SIGUNUSED
的代码。不确定 Android 是否对信号使用相同的数值,但我怀疑它从 Linux 继承了它们。

SIGSYS
表示进程向系统调用传递了错误的参数,或者违反了 Linux Seccomp 规则(source)。 Android 从版本 8 开始在 zygote 中引入了 seccomp-bpf(source)。因此,在 Android 8+ 上(以及在 LOS 设备上)违反 seccomp-bpf 规则的操作本身不会在 Android 上导致错误 <=7 (and thus on Anbox), which further corroborates my suspicion.

logcat 没有提供任何关于进程终止原因的线索。

如何查明该进程是否确实违反了 seccomp-bpf 策略,如果是,则违反策略的详细信息?

免责声明:我知道 Google 不鼓励我所做的事情(具体来说,从应用程序启动外部进程),并且主动选择不遵循建议并规避限制。任何遵循我的示例的人都应该意识到,生成的应用程序将违反 Play 商店政策(针对低于最低要求的 API 版本),并且将依赖于旧功能,该功能可能会在未来的 Android 版本中完全被切断,从而导致应用程序无法使用.

android linux signals seccomp
1个回答
0
投票

这很可能是由 libpthread 在初始化期间调用

set_robust_list
引起的,即即使您没有在二进制文件中创建线程。最简单的方法可能是手动修补 ELF 文件并用 nops 替换调用。

我解决这个问题的方法是使用

strace
中的
adb shell
并做出有根据的猜测。

© www.soinside.com 2019 - 2024. All rights reserved.