2016-12-29 89 views
1

我有一个驱动程序(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负载很低的情况下也是如此。理想情况下,我不应该这样做。

暂时保留问题,以防万一有用的答案弹出。

+0

除非启动服务属于用户至少启动一次的应用程序,否则无法启动服务。看[这个答案](http://stackoverflow.com/a/30112243/1953590)。 –

+0

@Kevin:对于从游戏商店或其他地方“安装”的东西,这是真的。这些将是系统服务/应用程序。顺便说一句,作为系统服务安装它们并不能解决这个问题。 – GPS

回答

0

只要我需要我的服务及时执行,我就会创建并保留一个通知图标。

即使电视没有显示通知图标,这对手机/平板电脑版本和Android TV版本都有帮助。当图标从通知中删除时,服务变慢。

我后来想到了这一点,并意识到可能没有服务需要及时做后台任务,但也没有通知图标/控件。例如。在后台播放的音乐播放器通常会将控制权留在通知中。

如果有人找到更好的解决方案,请将其展开。