我有一个驱动程序(Android HAL)和一个通过unix套接字相互通信的服务。他们都有一个线程来保持连接使用心跳。 HAL是套接字守护进程,服务是套接字客户端。Android服务的线程调度问题
HAL在启动时加载。服务在应用程序绑定时加载。这个应用程序不会做任何事情。
我注意到,只要应用程序可见,客户端和守护程序线程都可以。但是当我将应用程序推到后台时(例如通过按回家键),我观察到由守护线程报告的客户端线程中有一堆超时(因为心跳发送不够快)。
我做了一些时间测量,发现只要应用程序可见,服务的行为是正确的,但是当应用程序不可见时,服务线程表现不正常。这几乎就像调度程序不经常在服务中执行线程一样。
目前,Android系统上没有其他应用程序。
此行为不符合的Nexus 7(2013)和Nexus 5X运行M和Nexus Player游戏运行Androidň
如果应用程序启动的服务,而不是绑定到它验证,坏线程调度仍然存在。唯一不同的是,现在应用程序可见性状态不影响服务线程执行(它总是很慢)。
有没有办法让服务线程运行得更快?
主要是,线程只是做一个select()调用10ms,然后循环一些书籍。伪代码如下:
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: 也许是必要提一下,在最终的系统,我需要能够在启动“开始”的服务,并不得有应用。在这种情况下,我需要Service线程才能正确执行。
编辑2: 发现如果我让我的服务成为“前台服务”,这个调度问题就会消退。
我很困惑,一个服务进程的优先级不足以让它足够频繁地执行,即使在CPU负载很低的情况下也是如此。理想情况下,我不应该这样做。
暂时保留问题,以防万一有用的答案弹出。
除非启动服务属于用户至少启动一次的应用程序,否则无法启动服务。看[这个答案](http://stackoverflow.com/a/30112243/1953590)。 –
@Kevin:对于从游戏商店或其他地方“安装”的东西,这是真的。这些将是系统服务/应用程序。顺便说一句,作为系统服务安装它们并不能解决这个问题。 – GPS