有没有办法在init.rc中优雅地停止android服务(没有SIGKILL)?

时间:2016-08-08 20:33:23

标签: android linux service signals init

我有一个本机Android服务,它由通过GUI设置的属性启动和停止。 在init.rc中启动和停止服务的命令如下:

service myservice /system/bin/myservice
    class late_start
    user my_service
    disabled

on property:persist.myapp.myservice.enable=1
    start myservice

on property:persist.myapp.myservice.enable=0
    stop myservice

如果服务停止,需要清理JNI内存资源,但似乎服务是通过SIGKILL停止的:

6944  6974 V myservice: IMyProcessA::onTransact()
 712   712 I AP_KERNEL: init: Service 'myservice' is being killed...
 510   510 I ServiceManager: service 'ProcessA.MyService' died
 656   656 V ProcessA: ProcessA::NotificationClient::binderDied()
 656   656 V ProcessA: removeNotificationClient() 0xb6bc60a8, pid 6944
 656   656 V ProcessA: ProcessA::NotificationClient::~NotificationClient()
 712   712 I AP_KERNEL: init: Service 'myservice' (pid 6944) killed by signal 9
 712   712 I AP_KERNEL: init: Service 'myservice' (pid 6944) killing any children in process group 

由于无法拦截SIGKILL进行清理,init.rc是否有任何选项可以停止myservice'例如,可以将终止信号改为我可以像SIGTERM一样拦截的东西吗?

2 个答案:

答案 0 :(得分:1)

您的“无内存泄漏”站在内核方面,但是在一个进程结束之前,需要在用户空间中完成许多工作,例如以下内容,

  • 关闭文件并将缓存的数据刷新到内核层。
  • 删除一些临时文件。
  • 通知我即将死亡的其他进程。
  • 将RAM中的某些数据缓存写入磁盘,否则DISK上的数据将不一致。

...... 对于上述情况,发送SIGKILL非常粗糙。

答案 1 :(得分:0)

在与同事讨论之后,我们的共识是,在SIGKILL之后,内核将回收与该进程相关的所有内存,并且不存在内存泄漏。

如果有任何信息与此相矛盾,请告诉我。