在Android上杀死长时间运行的本机代码

时间:2015-07-15 20:09:28

标签: android android-ndk kill-process

当用户按下“取消”按钮而不插入取消检查时,如何立即放弃在Android上的本机代码(在C中)中长时间运行的计算?

解释约束:

  • 此本机代码太复杂,无法插入足够的取消检查或进度信息[1],因此必须强行杀死该进程。
  • Android应用程序的用户界面必须保持运行(因此是一个单独的过程),让用户可以方便地使用不同的参数重试。
  • 一次不需要支持多个这样的计算。

我很清楚Android上流程生命周期的一般立场是您必须让平台为您管理它。尽管如此,我希望在尽可能少的不支持的操作下尽可能接近上述要求。

我有一个解决方案,但我希望有一个更好的解决方案。例如,如果使用<service>上的android:process attribute将服务拆分为额外进程,并且其中一个线程进入深度JNI调用,是否有办法立即终止此类进程,或者从内部退出,而不会导致运行时将其视为意外崩溃?

[1]我尝试过取消支票。它的内存分配和控制流程复杂,超过70,000 SLOC(3.1 MB);它并没有考虑到可中断性。这种方式在后续操作中是双重的free()和难以理解的崩溃。

1 个答案:

答案 0 :(得分:3)

以下是我目前所做的事情:

  • build.gradle中:编译仅限本机的可执行文件,就像用于命令行调用一样。
    • 搜索其他人这样做的神奇字词是ndk "BUILD_EXECUTABLE"
    • 必须将其命名为它是一个库,以说服构建工具将其包含在设备中并将软件包安装程序解压缩。
    • 这在Android Studio Preview NDK support中尚未实现,我真的希望最终版本会以某种迂回的方式打开这扇门。
  • starting the process时,将其复制到我可以chmod +x它的路径,执行此操作,并Runtime.exec()它(我只需要从stdout <1KB)。
  • 要停止此过程,只需在其上调用.destroy()

支持这一点值得怀疑:NDK文档谈论you can build an executable but it won't get installed的方式。然而,根据经验,它与主流Android设备之间至少在v2.1-5.1之间具有广泛的兼容性。它部署在widely-used app(100,000次下载,约47,000次活动)。

失败的环境,可能是在上面的二进制安装恶作剧中,包括: