2016-12-29 4 views
1

У меня есть драйвер (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: Обнаружено, что если я сделаю свой сервис «передним планом», эта проблема планирования будет уменьшаться.

Меня озадачивает тот факт, что приоритет «Сервисный процесс» недостаточен, чтобы позволить ему выполнять достаточно часто даже при других низких загрузках процессора. В идеале мне не нужно это делать.

Оставленный вопрос сейчас открыт, если появится полезный ответ.

+0

Вы не можете запускать сервис при загрузке, если он не принадлежит к приложению, которое было запущено пользователем хотя бы один раз. См. [Этот ответ] (http://stackoverflow.com/a/30112243/1953590). –

+0

@Kevin: Это верно для вещей, которые вы «устанавливаете» в игровом магазине или в другом месте. Это будут системные службы/приложения. Кстати, установка их в качестве системного сервиса не помогает в этой проблеме. – GPS

ответ

0

До тех пор, пока мне нужно мое обслуживание, чтобы выполнить своевременно, я создаю и сохраняю значок уведомления.

Это помогает как в версии телефона/планшета, так и в версиях Android TV, даже если на телевизоре нет значков уведомлений. Когда значок удаляется из уведомлений, обслуживание становится медленным.

Позже я подумал об этом и понял, что, вероятно, нет служб, которые должны выполнять фоновые задачи своевременно, но также не имеют значков/элементов уведомлений. Например. музыкальные проигрыватели, которые играют в фоновом режиме, обычно оставляют элементы управления в уведомлении.

Если кто-то находит лучшее решение, пожалуйста, принесите его на свет.