在NDK中使用"exec()"

jay*_*red 3 android-ndk

我记得在某处读过不建议在NDK编译的C代码中使用"exec".

推荐的方法是什么?我们是否尝试将EXEC代码推送到Java空间; 也就是说,JNI(或应用程序)会产生新进程(并且在相关时将结果传递回NDK)?

Adr*_*lor 7

首先,不建议使用其中任何一个forkexec.您的所有代码通常都应该存在于单个进程中,这是您的主要Android应用程序进程,由Android框架管理.任何其他进程都可能随时被系统杀死(尽管实际上在目前的Android版本中没有发生,据我所见).

我理解的理由只是Android框架无法正确管理应用程序的生命周期和生命周期,如果你去生成其他进程.

Exec

你没有真正的替代方案,但是要避免启动其他可执行文件.这意味着您需要将可执行代码转换为直接链接到应用程序的库,并使用JNI从Java代码触发的普通NDK函数调用进行调用.

Fork

更难.如果你真的需要一个多进程模型,并希望符合规则的字母,你需要安排Android框架从Zygote进程中分离你.为此,您应该将所有后台代码Service运行在一个不同的背景代码中,该代码在另一个进程中运行AndroidManifest.xml.

为了达到极限,如果出于内存保护和隔离原因需要在不同进程中运行多个相同的代码实例,则可以执行Android Chrome所做的操作:

  • 在子类中运行所有后台/分叉代码 Service
  • 创建多个子类
  • 将每个子类列为每个子类中AndroidManifest.xml具有不同process属性的单独服务
  • 在您的主代码中,请记住您已启动和未启动的服务,并使用startService/ 管理它们stopService.

当然,如果您已将本机代码转换为库而不是可执行文件,那么您可能根本不需要fork.使用的唯一原因fork是实现内存保护/隔离.

在实践中

在实践中,相当多的应用程序忽略了所有这些并直接在其本机代码中使用fork/ exec.目前,它起作用,至少对于短期运行的任务.

  • 这篇文章被[链接](https://issuetracker.google.com/issues/128554619#comment4)作为几乎官方的 Android 开发团队职位。 (4认同)