thermal-engine 与手机发烫、卡顿

我自己编译AOSP已经很久了,也陆续刷机到Nexus 5和Pixel上,虽然之前也有遇到过缺失系统库文件一类的问题,但也都解决了。

不过,一直以来有个问题困扰着我,那就是在Nexus 5上的耗电问题。时间稍久一些,就会出现机身发烫。同时,伴随手机响应迟钝,应用频繁ANR的情况。

今天调查一个问题,需要查看实时的Kernel日志:

$ cat /proc/kmsg

结果看到大量如下日志输出:

<4>[10714.584355] _cpu_up: attempt to bring up CPU 1 failed
<4>[10714.584992] _cpu_up: attempt to bring up CPU 2 failed
<4>[10714.585608] _cpu_up: attempt to bring up CPU 3 failed

整个屏幕里不断输出上面的信息,而且时不时还会有这样的日志:

<5>[10863.303087] init: Starting service 'thermal-engine'...
<5>[10863.315344] init: Service 'thermal-engine' (pid 27507) exited with status 1
<5>[10863.315358] init: Service 'thermal-engine' (pid 27507) killing any children in process group

从上面的日志,我大致推断:

  1. CPU 1、2、3无法打开
  2. thermal-engine频繁创建和死亡

可是这二者之间有什么联系吗?这个问题得从thermal-engine进行调查。

Thermal Engine是Android系统的温度控制核心,其制定了一些策略,来根据不同部件的温度,控制CPU内核的开启与关闭,还有CPU频率的降低和升高。

了解到了这个信息,那不妨推测,thermal-engine无法正常工作,导致CPU的三个内核无法正常开启。
同时,又因为thermal-engine不断重启,持续地增加系统电量开销,导致待机时间缩短,而且还吃掉了仅剩下的一个CPU内核的计算能力,导致其他APP卡顿。

接下来就是去调查,为什么thermal-engine无法正常工作,我注意到了xda-developers论坛里的一篇帖子

If you experience issues on Omni 6 on hammerhead, there is a missing file in /vendor/lib that causes runtime linking failures for /system/bin/thermal-engine-hh.
As a result, your system won’t be doing thermal management properly and will feel laggy and possibly unstable.

尽管这个帖子里所列举的软硬件环境,与我的实际情况并不完全相符,但是观察其日志,则基本形同。
于是,我也去检查手机上是否存在/system/vendor/lib/libthermalioctl.so。

果不其然,该文件真的不存在,但是该文件是否就一定要存在呢?不妨拿到factory image的文件来调查下。我从官方下载到6.0.1 M4B30X系统固件,并从中解压出system.img,接下里的流程就跟How to solve QSEECOMD on AOSP一模一样了。果然在官方固件里找到了libthermalioctl.so,参照之前的流程,把该文件拷贝到手机系统里。

重启之后,整机表现果然焕然一新,不再烫手了,App响应也快得多了。

我尝试一下获取一下系统温度,在/sys/devices/virtual/thermal/,有一批thermal_*文件夹,其中的temp文件就是记录温度数值的。但是由于匆忙,没有记下之前的旧值,所以就失去了对比的机会。

解决这次的问题,纯属巧合,对Thermal Engine的理解,仅仅是皮毛,后续合适的时间里,我会继续研究。


参考

  1. Android ANR-Thermal condition
  2. 高通Thermal debug

Leave a comment

Your comment