其他分享
首页 > 其他分享> > 在Android上杀死长时间运行的本机代码

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

作者:互联网

当用户按下“取消”按钮时,如何在不插入取消检查的情况下立即放弃使用Android中本机代码(以C语言编写)的长期运行?

解释约束:

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

我很清楚,Android上流程生命周期的总体立场是必须让平台为您管理它.尽管如此,我希望通过尽可能少的不受支持的操作来尽可能接近上述要求.

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

[1]我尝试过取消检查.超过70,000 SLOC(3.1 MB)的C语言,其内存分配和控制流非常复杂.它在编写时并未考虑中断性.这样就存在double-free()和后续操作中难以理解的崩溃.

解决方法:

这是我目前正在做的事情:

>在build.gradle中:编译仅本机可执行文件,就好像命令行调用一样.

>搜寻其他这样做的魔术词是ndk “BUILD_EXECUTABLE”.
>必须说出它是库的名称,才能说服构建工具将其包括在内,并在设备上安装软件包安装程序以解压缩它.
>这在Android Studio Preview NDK support中尚无法实现,我真的希望最终版本能够以某种round回的方式将这扇门敞开.

>当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个活动状态).

可能在上述二进制安装过程中失败的环境包括:

> App Runtime for Chrome
> Blackberry

标签:kill-process,android-ndk,android
来源: https://codeday.me/bug/20191120/2040640.html