我有一个驱动程序(Android HAL)和一个通过unix socket相互通信的服务。它们都有一个线程来维持心跳连接。 HAL是套接字守护程序,服务是套接字客户端。
HAL在启动时加载。应用程序绑定时加载服务。这个应用程序没有做任何其他事情。
我观察到只要App可见,客户端和守护进程线程就可以了。但是当我将应用程序推送到后台时(例如,通过按下主页按钮),我会在守护程序线程报告的客户端线程中观察到一堆超时(因为心跳的发送速度不够快)。
我做了一些计时测量,发现只要app可见,Service就行为正常,但是当app不可见时,服务线程表现不正常。它几乎就像调度程序不经常在服务中执行线程一样。
此时,Android系统上没有其他应用。
此行为已通过Nexus 7(2013)和运行Android N的运行M和Nexus Player的Nexus 5X验证
如果应用程序启动服务,而不是绑定到它,则错误的线程调度仍然存在。唯一不同的是,现在App可见性状态不会影响服务线程执行(它总是很慢。)
有没有办法让服务线程运行得更快?
主要是,线程只执行select()调用10ms,然后在循环中进行一些簿记。 psuedo-code如下:
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 :(得分:0)
只要我需要我的服务及时执行,我就会创建并保留一个通知图标。
这对手机/平板电脑版本和Android TV版本都有帮助,即使电视没有显示通知图标。从通知中删除图标时,服务会变慢。
我后来考虑过这一点,并意识到可能没有及时提供后台任务的服务,但也没有通知图标/控件。例如。在后台播放的音乐播放器通常会在通知中保留控件。
如果有人找到了更好的解决方案,请将其曝光。