MTK 驅動(38)---MTK 待機問題分析
mtk 平臺待機問題分析:
1 待機問題分類 1)無法待機:
1. 需要確認 APK 是否有 partial_wakelock
2. kernel 是否持有 wakeup source 不釋放.
2)可以待機,但是喚醒頻繁.
1. 是否有開啟資料連線,或者 wifi(網路包喚醒)
2. 如果不是 1,一般是 alarm 或者網路註冊,modem CLDMA 的一些喚醒.
常見的喚醒:EINT/CLDMA/PCMTIMER/CONN/CCIF
2 抓 log 注意事項: 1.處理待機問題,需要提供 mobile log and netlog(如果有開啟資料連線或者 WIFI), 在問題沒有指向是modem 的問題前,不要開啟 modem log. 2.手機先對準網路時間,並提供測試開始跟結束的時間 以及電流波形圖(電流圖跟 1 的 mobile log 是一起執行),MTK 處理一般是使用 PowerMonitor. 方案一:log 設定成開機自啟動,並在開機後直接測試. 測試結束後: adb shell dumpsys batterystats > battersystats.log adb shell cat /sys/kernel/debug/wakeup_sources > wakeup_sources.log adb shell ps > ps.txt 方案二: 測試前 adb shell dumpsys batterystats > battersystats_1.log adb shell cat /sys/kernel/debug/wakeup_sources > wakeup_sources_1.log 測試後: adb shell dumpsys batterystats > battersystats_2.log adb shell cat /sys/kernel/debug/wakeup_sources > wakeup_sources_2.log adb shell ps > ps.txt 大部分情況下,如果是因為持鎖的問題,很容易把 sys log 前面的持鎖的 log 沖掉.所以一般建議從開機啟動後測試,測試時間不用太長.如果特殊情況,重啟後不復現,請使用方案二.
3.分析問題 3.1如何確認喚醒源 正則表示式: ([p]+) ([p]+) SPM SPM wake up by|md_settle|suspend exit
<2>[ 158.453122]<1>-(0)[95:kworker/u8:2][SPM] wake up by CONN2AP, timer_out = 10217, r13 =0x47000, debug_flag = 0x9c
<2>[ 158.895650]<3>-(0)[95:kworker/u8:2][SPM] wake up by CONN2AP, timer_out = 80686, r13 =0x2004f208, debug_flag = 0x9f
<2>[ 162.544639]<2>-(0)[141:kworker/u8:3][SPM] wake up by CONN2AP, timer_out = 7546, r13 =0x20047238, debug_flag = 0x9c
<2>[ 162.983046]<2>-(0)[141:kworker/u8:3][SPM] wake up by EINT, timer_out = 113643, r13 =0x20041238, debug_flag = 0x9f
<2>[ 163.964958]<2>-(0)[141:kworker/u8:3][SPM] wake up by CONN2AP, timer_out = 5112, r13 =0x47000, debug_flag = 0x9c
<2>[ 169.662402]<0>-(0)[142:kworker/u8:4][SPM] wake up by CLDMA_MD, timer_out = 1452520, r13 =0x41238, debug_flag = 0x9f
3.2.如何確認喚醒的時間點(基本上都適用) 正則表示式:kworker.*\] SPM SPM wake up by|md_settle|suspend exit,可以搜尋到具體的喚醒時間點:
【字首不是 swapper】wake up by 是系統起來的第一句 log,時間會開始重新 running,往下第一個 PM:suspend exit 基本上就是喚醒的時間點.
<6>[ 2971.418367]<0>-(0)[0:swapper/0][SPM] wake up by GPT, timer_out = 302, r13 = 0x20041238,debug_flag = 0x90
<2>[ 172.168900]<0>-(0)[142:kworker/u8:4][SPM] wake up by CONN2AP, timer_out = 4561649, r13 =0x20047238, debug_flag = 0x9f
<6>[ 172.239721]<1> (1)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:37.021819616 UTC
<2>[ 172.612907]<1>-(0)[142:kworker/u8:4][SPM] md_settle = 99, settle = 99
<2>[ 172.612907]<1>-(0)[142:kworker/u8:4][SPM] wake up by CONN2AP, timer_out = 19411, r13 =0x20047238, debug_flag = 0x9c
<6>[ 172.679674]<1> (3)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:38.023614769 UTC
<6>[ 172.948171]<1> (3)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:38.292113615 UTC
<2>[ 176.028364]<3>-(0)[95:kworker/u8:2][SPM] md_settle = 99, settle = 99
注意這個是 kernel 的時間,轉換到 main log 的時間:根據 mobile log 裡面 properties 的時區資訊[persist.sys.timezone].譬如[persist.sys.timezone]: [Asia/Shanghai] 即需要加上 8 個小時
2015-12-27 03:09:37.021819616 對應的 UTC 時間為:2015-12-27 11:09:37.021819616
3.3 常用喚醒 其中一次完整的喚醒有如下的 log:
//第一句喚醒,wake up by CONN2AP,代表被 connectivity wakeup,大部分情況是 WIFI 資料.<2>[ 172.612907]<1>-(0)[142:kworker/u8:4][SPM] wake up by CONN2AP, timer_out = 19411, r13 =0x20047238, debug_flag = 0x9c
//喚醒的時間點:
<6>[ 172.679674]<1> (3)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:38.023614769 UTC
<6>[ 172.948171]<1> (3)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:38.292113615 UTC
<6>[ 173.572666]<1> (0)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:38.916604538 UTC
<6>[ 173.989622]<3> (1)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:39.333548769 UTC
<6>[ 174.399687]<3> (3)[142:kworker/u8:4]PM: suspend exit 2015-12-27 03:09:39.743622615 UTC
//最後一句 sleep 的 log. 只有出現 md_settle 才代表真正 sleep.
<2>[ 176.028364]<3>-(0)[95:kworker/u8:2][SPM] md_settle = 99, settle = 99
2015-12-27 03:09:38.023614769 對應的 main log 時間為:2015-12-27 11:09:38.023614769
確認引起喚醒的問題包:
在 main log 裡面搜尋關鍵字:Posix_connect Debug:
可以發現對應的時間點,是豌豆莢這個應用在發包.
【下面的 log 代表是那些 APK 在發包,有發包就有收包】
12-27 11:05:44.279 2895 3138 D Posix : [Posix_connect Debug]Process com.lava:pushservice :80
12-27 11:06:02.786 4715 4778 D Posix : [Posix_connect Debug]Process com.sina.weibo :443
12-27 11:06:07.779 4715 4798 D Posix : [Posix_connect Debug]Process com.sina.weibo :443
12-27 11:06:10.080 4827 4917 D Posix : [Posix_connect Debug]Process com.sina.weibo:remote :4828
12-27 11:06:15.465 4827 4917 D Posix : [Posix_connect Debug]Process com.sina.weibo:remote :4828
12-27 11:09:38.313 3635 3670 D Posix : [Posix_connect Debug]Processcom.wandoujia.phoenix2:update_service :44312-27 11:09:42.347 4827 4917 D Posix : [Posix_connect Debug]Process com.sina.weibo:remote :4828
12-27 11:09:49.055 4827 4917 D Posix : [Posix_connect Debug]Process com.sina.weibo:remote :4829
12-27 11:09:4 9.111 4827 4942 D Posix : [Posix_connect Debug]Process com.sina.weibo:remote :80
12-27 11:09:51.199 3495 3570 D Posix : [Posix_connect Debug]Process com.wandoujia.phoenix2 :80
並非每個 wake up 的時間點,都可以找到明確的 APK 在傳送包.
參考【如何確認具體一次喚醒,是哪個 APK 引起的】
【喚醒型別為 CLDMA_MD】
正則表示式: ([p]+) ([p]+) SPM SPM wake up by|CLDMA_MD wakeup source|md_settle|suspend exit
確認喚醒的 channel ID:
<2>[ 3072.796534]<2>-(0)[14284:kworker/u8:0][SPM] wake up by CLDMA_MD, timer_out = 5598687, r13= 0x20001238, debug_flag = 0x9f
//喚醒點之後第一句 CLDMA_MD wakeup source 會打印出 channel ID. 譬如該題是 10
<5>[ 3072.810528]<2> (1)[23510:kworker/u9:0][ccci1/mcd]CLDMA_MD wakeup source:(1/10)
<6>[ 3072.872362]<3> (1)[14284:kworker/u8:0]PM: suspend exit 2016-02-05 11:28:18.030905923 UTC
<6>[ 3074.000405]<2> (0)[14284:kworker/u8:0]PM: suspend exit 2016-02-05 11:28:19.158954462 UTC
<2>[ 3075.262223]<3>-(0)[14284:kworker/u8:0][SPM] md_settle = 99, settle = 99
<2>[ 3075.262223]<3>-(0)[14284:kworker/u8:0][SPM] wake up by EINT, timer_out = 4159454, r13 =0x41000, debug_flag = 0x9f
<6>[ 3075.341978]<3> (1)[14284:kworker/u8:0]PM: suspend exit 2016-02-05 11:30:28.031774693 UTC
<2>[ 3075.996184]<2>-(0)[14284:kworker/u8:0][SPM] md_settle = 99, settle = 99
常用的喚醒的 channel:
[channel 10]:
需要搜尋 radio log 確認是什麼 AT command 喚醒了系統.
時間點:
2016-02-05 11:28:18.030905923 + 8h = 2016-02-05 19:28:18.030905923
以 19:28:18 搜尋 radio log,往下搜尋,找到第一條 AT<02-05 19:28:18.032 20835 20856 D AT : AT< +CIREPI: 0
說明喚醒的 AT command 是 AT< +CIREPI
常見的 AT command 的喚醒:參考下面【常見 AT 命令解析】
AT +ECOPS
搜網的次數 ------------> AT: CREG CGREG (一個是 CS,一個是 PS)
網路 PDP 狀態變化的次數 ----------> AT:CGEV (PDN activate/deactivate)
VOLTE 功能導致喚醒的次數 -----------> AT: CIREPI CIREPH CNEMS1 CIREG EIMS
LTE 資料連線 ------------> AT: EDRBSTATE
[channel 14]
一般是跟 channel10 一起產生,modem 小區訊息變化,會記錄小區的資訊到 nvram.
--------------------- 作者:zhangbijun1230 來源:CSDN 原文:https://blog.csdn.net/zhangbijun1230/article/details/79832115 版權宣告:本文為博主原創文章,轉載請附上博文連結!