Есть ли способ остановить сервисы Android в init.rc изящно (без SIGKILL)?
У меня есть собственный сервис Android, который запускается и останавливается с помощью свойства, установленного через графический интерфейс. Команды для запуска и остановки службы в 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 'stop myservice', которые могут изменить сигнал завершения на что-то, что я могу перехватить, например, SIGTERM, например?
1 ответ
После обсуждения этого с коллегой мы пришли к выводу, что после SIGKILL ядро освободит всю память, связанную с процессом, и что утечки памяти не будет.
Если у кого-то есть информация, противоречащая этому, пожалуйста, дайте мне знать.
Ваша "утечка памяти" не стоит на стороне ядра, но многие работы должны быть выполнены в пользовательском пространстве, прежде чем завершится один процесс, например,
- закрыть файлы и сбросить кэшированные данные в слой ядра.
- удалите несколько временных файлов.
- уведомить другой процесс, что я собираюсь умереть.
- записать некоторое кеширование данных в RAM на диск, иначе данные на DISK будут противоречивыми.
...... Для вышесказанного, отправка SIGKILL очень сырая.