У меня есть драйвер (Android HAL) и служба, которые общаются друг с другом через unix-сокет. У обоих есть поток для поддержания соединения с использованием биения. HAL - это демон socket, а служба - клиент сокета.Проблема планирования потоков с сервисом Android
HAL нагрузка на багажник. Сервис загружается, когда приложение привязывается к нему. Это приложение ничего не делает.
Я наблюдаю, что до тех пор, пока приложение видно, потоки как клиента, так и демона являются точными. Но когда я нажимаю приложение на фоновое изображение (например, нажав кнопку «домой»), я наблюдаю кучу тайм-аутов в потоке клиента, сообщаемых потоком демона (потому что пульс не отправляется достаточно быстро).
Я сделал некоторые измерения времени и обнаружил, что пока приложение видимо, служба ведет себя правильно, но когда приложение невидимо, поток обслуживания ведет себя беспорядочно. Это почти так, как если бы планировщик не выполнял поток в службе достаточно часто.
В настоящее время других приложений в системе Android нет.
Такое поведение было проверено с Nexus 7 (2013) и Nexus 5X работает M и Nexus плеер под управлением Android N
Если приложение запускает услугу, а не связываться с ней, планирование Bad нить сохраняется. Единственное отличие состоит в том, что теперь состояние видимости приложения не влияет на выполнение потока обслуживания (он всегда медленный.)
Есть ли способ сделать поток услуг быстрее?
В основном, поток просто вызывает вызов select() в течение 10 мс, а затем некоторый бухгалтерский учет в цикле. псевдо-код следующим образом:
while(running) {
if not_connected {
connect()
}
if send_heartbeat_timeout_elapsed
send_heartbeat()
}
if recv_heartbeat_timeout_elapsed {
close_connection()
}
if connected {
wait_for_daemon_msg(10 ms)
if msg_received {
process_msg()
}
}
}
Edit 1: Может быть, это полезно упомянуть, в выпускную систему, мне нужно, чтобы иметь возможность «начать» услуги по загрузке, и не должно быть никакого приложения. Мне нужно, чтобы в этом сценарии правильно выполнялись служебные потоки.
Редактировать 2: Обнаружено, что если я сделаю свой сервис «передним планом», эта проблема планирования будет уменьшаться.
Меня озадачивает тот факт, что приоритет «Сервисный процесс» недостаточен, чтобы позволить ему выполнять достаточно часто даже при других низких загрузках процессора. В идеале мне не нужно это делать.
Оставленный вопрос сейчас открыт, если появится полезный ответ.
Вы не можете запускать сервис при загрузке, если он не принадлежит к приложению, которое было запущено пользователем хотя бы один раз. См. [Этот ответ] (http://stackoverflow.com/a/30112243/1953590). –
@Kevin: Это верно для вещей, которые вы «устанавливаете» в игровом магазине или в другом месте. Это будут системные службы/приложения. Кстати, установка их в качестве системного сервиса не помогает в этой проблеме. – GPS