유닉스 소켓을 통해 서로 통신하는 드라이버 (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가 많이로드되지 않아도 충분히 자주 실행될 수 없다는 사실에 당혹 스럽습니다. 이상적으로 나는 이것을 할 필요가 없다.
유용한 질문이있는 경우를 대비하여 지금 질문을 남겨 두십시오.
적어도 한 번 사용자가 시작한 응용 프로그램에 속하지 않으면 부팅 할 때 서비스를 시작할 수 없습니다. [이 답변] (http://stackoverflow.com/a/30112243/1953590)을 참조하십시오. –
@ 케빈 : 당신이 플레이 스토어 또는 다른 곳에서 "설치"하는 것에 해당됩니다. 이것들은 시스템 서비스/애플 리케이션이 될 것입니다. BTW, 그들을 시스템 서비스로 설치해도이 문제에 도움이되지 않습니다. – GPS