2016-12-29 2 views
1

유닉스 소켓을 통해 서로 통신하는 드라이버 (Android HAL)와 서비스가 있습니다. 둘 다 하트 비트를 사용하여 연결을 유지하는 스레드가 있습니다. HAL은 소켓 데몬이며 서비스는 소켓 클라이언트입니다.안드로이드 서비스 스레드 스케줄링 문제

부팅시 HAL이로드됩니다. 앱이 앱을 바인딩하면 서비스가로드됩니다. 이 응용 프로그램은 다른 작업을 수행하지 않습니다.

App이 보이면 클라이언트와 데몬 스레드 모두 정상적으로 작동합니다. 하지만 앱을 백그라운드로 밀면 (예 : 홈 버튼을 눌러서) 데몬 스레드가보고 한 클라이언트 스레드에서 많은 시간 초과가 발생합니다 (하트 비트가 충분히 빨리 전송되지 않기 때문에).

몇 가지 타이밍을 측정했는데 응용 프로그램이 표시되는 동안 서비스가 올바르게 작동하지만 앱이 보이지 않을 때 서비스 스레드가 비정상적으로 작동하는 것으로 나타났습니다. 거의 스케줄러가 서비스 스레드를 자주 실행하지 않는 것과 같습니다.

현재 Android 시스템에는 다른 앱이 없습니다.

이 동작은 넥서스 7 (2013)와 넥서스 5 배 M을 실행하고 넥서스 플레이어 앱이 서비스를 시작하면 안드로이드 N

을 실행하는 대신에 그것을 결합 확인하고, 나쁜 쓰레드 스케줄링은 지속됩니다. 차이점은 이제 앱 표시 상태가 서비스 스레드 실행에 영향을 미치지 않습니다 (항상 느림).

서비스 스레드를 더 빨리 실행할 수있는 방법이 있습니까?

주로 스레드는 10ms 동안 select() 호출을 수행하고 루프에서 일부 장부 보관을합니다. 사이비 코드를 다음과 같이

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() 
     } 
    } 
} 

편집 1 : 아마도 그것을 언급하는 데 유용합니다 , 최종 시스템에서, 나는 부팅 서비스를 "시작"할 수 있어야하고, 어떤 응용 프로그램이있을 수 없다. 이 시나리오에서 제대로 실행하려면 서비스 스레드가 필요합니다.

편집 2 : 서비스를 "전경 서비스"로 만들면이 예약 문제가 줄어들게됩니다.

서비스 프로세스의 우선 순위로 인해 CPU가 많이로드되지 않아도 충분히 자주 실행될 수 없다는 사실에 당혹 스럽습니다. 이상적으로 나는 이것을 할 필요가 없다.

유용한 질문이있는 경우를 대비하여 지금 질문을 남겨 두십시오.

+0

적어도 한 번 사용자가 시작한 응용 프로그램에 속하지 않으면 부팅 할 때 서비스를 시작할 수 없습니다. [이 답변] (http://stackoverflow.com/a/30112243/1953590)을 참조하십시오. –

+0

@ 케빈 : 당신이 플레이 스토어 또는 다른 곳에서 "설치"하는 것에 해당됩니다. 이것들은 시스템 서비스/애플 리케이션이 될 것입니다. BTW, 그들을 시스템 서비스로 설치해도이 문제에 도움이되지 않습니다. – GPS

답변

0

서비스를 적기에 수행해야하는 경우 알림 아이콘을 만들고 유지하십시오.

TV가 알림 아이콘을 표시하지 않더라도이 기능은 휴대 전화/태블릿 버전과 Android TV 버전 모두에서 도움이됩니다. 알림에서 아이콘이 제거되면 서비스가 느려집니다.

나는 이것에 대해 나중에 생각해 보았고, 적시에 배경 작업을 수행 할 필요가없는 서비스가 있음을 알았지 만 알림 아이콘/컨트롤도 가지고 있지 않습니다. 예 : 백그라운드에서 재생되는 음악 플레이어는 일반적으로 컨트롤에 컨트롤을 남깁니다.

누군가가 더 좋은 해결책을 찾으면 그것을 가져 오십시오.