1. 程式人生 > >Android Log的抓取、USER 版本與ENG 版本差異、mtKUser版本開啟串列埠輸入

Android Log的抓取、USER 版本與ENG 版本差異、mtKUser版本開啟串列埠輸入

部分轉自:http://blog.csdn.net/yaoming168/article/details/38777727
其餘摘錄自MTK官方解釋
一、Android log框架簡介
二、log獲取方式
1、Eclipse 抓取
1)根據資訊型別過濾log
那個顯示框上面還有個下拉列表選項可以選擇過濾哪些資訊。
a、Log.v 的除錯顏色為黑色的,任何訊息都會輸出,這裡的v代表verbose囉嗦的意思,程式碼實現就是Log.v(“”,”“);
b、Log.d的輸出顏色是藍色的,僅輸出debug除錯的意思,但他會輸出上層的資訊,過濾起來可以通過DDMS的Logcat標籤來選擇
c、Log.i的輸出為綠色,一般提示性的訊息information,它不會輸出Log.v和Log.d的資訊,但會顯示i、w和e的資訊
d、Log.w的意思為橙色,可以看作為warning警告,一般需要我們注意優化Android程式碼,同時選擇它後還會輸出Log.e的資訊。
e、Log.e為紅色,可以想到error錯誤,這裡僅顯示紅色的錯誤資訊,這些錯誤就需要我們認真的分析,檢視棧的資訊了。

log的過濾
2)自定義標籤,過濾log
點選 新增Filter Name 和 by log Tag 來過濾程式碼中的Log.v(“yaoming”,”ringTone[0]== “); log資訊

2、adb 抓取log
ADB 是一個C/S 架構的應用程式,有三部分組成:
1)adbclient,執行在PC上(DDMS)
2)adbdaemon(守護程序),執行在Emulator中
3)adbserver(服務程序),執行在PC(工作管理員上可以看見),

adb client和 adb daemon通訊

注:server與client通訊埠5037, adb server會與emulator互動,使用的埠有兩個,一個是5554專用與emulator例項的連線,那麼資料可以從emulator轉發給IDE控制檯,另一個則是5555,專門與adb daemon連線為後面除錯使用

1、adb devices 檢視是否連線成功
2、adb install
3、adb uninstall (解除安裝的軟體時,解除安裝的是包名,後面跟的是包的名字,而不是.APK)
4、Logcat

1)、adb logcat>main.txt 重定向log、
2)、adb logcat -b main-v time>app.log 列印應用程式的log
3)、adb logcat -bradio -v time> radio.log 列印射頻相關的log,SIM STK也會在裡面,modem相關的ATcommand等,
4)、adb logcat -bevents -v time 列印系統事件的日誌,比如觸屏事件。。。
5)、tcpdump 是很有用的,對於TCP/IP協議相關的都可以使用這個來抓,adb shell tcpdump-s 10000 -w /sdcard/capture.pcap,比如抓mms下載的時候的UA profile,browser上網的時候,使用proxy的APN下載,streaming的相關內容包括UA profile等。

3、Mtklog
1, radio log
線:usb cable
命令: adb logcat –b radio –v time >radio.txt
-v time: 表示log中加入了時間資訊

2, main log
main log和我們從DDMS中看到的log是一致的
線: usb cable
命令: adb logcat –b main –v time >main.txt
-v time: 表示log中加入了時間資訊

3, event log
event log屬於system log
線: usb cable
命令: adb logcat –b events –v time >events.log
-v time: 表示log中加入了時間資訊

4, kernal log
使用超級終端或者串列埠助手來抓kernal log,請參考以下步驟:

四、log分析
1、Java Exception
在main log中分析,要注意Exception的時間、PID和棧
2、Native code/jni 導致
1)、error.h 這個檔案 中標明含義
2)、sqlite 錯誤 sqlite3.h中查詢 標明含義
3)、NO space left ondevice 磁碟空間已滿

使用du命令 檢視檔案空間
find -type size +100k 大於100k檔案
4)、ooM 異常

3、ANR
在log中檢視 system log找到ANR關鍵字

MTK log分析

1、Mobile Log:也稱AP log,系統應用層的log,比如應用程式無響應或強行關閉,kernel相關的,比如driver(相機、藍芽、usb、啟動)出了開機問題、手機對服務喚醒和休眠的一些記錄藍芽相關問題。

2、主要包括四種log:kernel、main、event and radio log

3、Modem log 是手機裡負責搜網和sim卡資料操作底層模組,

md log用於分析掉網、掉話和無訊號問題,一般此檔案都需要特殊工具解碼,主要針對射頻modem相關問題抓取(mtklog/mdlog)

4、Network log

主要針對網路的Network相關問題抓取(mtklog/netlog)

主要場景:彩信下載、瀏覽器上網、streaming問題相關

WIFI、資料流量下不同場景訊號下的網路連線問題,網路下的資料傳輸問題

五、抓取log注意事項
抓取log時最好標註一下問題發生的時間

Android USER 版本與ENG 版本差異
[Description]
Android USER 版本與ENG 版本的差異, 使用者版本與工程版本的差異

[Keyword]
USER ENG user eng 使用者版本 工程版本 差異

[Solution]
Google 官方描述: USER/USERDEBUG/ENG 版本的差異, 參考alps/build/core/build-system.html 的詳細說明
eng This is the default flavor. A plain make is the same as make eng.
* Installs modules tagged with: eng, debug, user, and/or development.
* Installs non-APK modules that have no tags specified.
* Installs APKs according to the product definition files, in addition to tagged APKs.
* ro.secure=0
* ro.debuggable=1
* ro.kernel.android.checkjni=1
* adb is enabled by default.
* Setupwizard is optional
user make user
This is the flavor intended to be the final release bits.
* Installs modules tagged with user.
* Installs non-APK modules that have no tags specified.
* Installs APKs according to the product definition files; tags are ignored for APK modules.
* ro.secure=1
* ro.debuggable=0
* adb is disabled by default.
* Enable dex pre-optimization for all TARGET projects in default to speed up device first boot-up
userdebug make userdebug
The same as user, except:
* Also installs modules tagged with debug.
* ro.debuggable=1
* adb is enabled by default.

MTK 補充說明差異:
(1) Debug/LOG 方面,原則上user 版本只能抓到有限的資訊,eng 可以抓到更多的資訊,Debug 能力更強,推崇使用eng 版本開發測試
* 因ro.debuggable 的差異,eng 版本預設開啟了app 的JDWP,以及uart console debug; 相對應的user 版本關閉, 導致在DDMS 上無法看到app process 的列表.
* MTK System LOG 在ICS 以後,在user 版本預設關閉全部LOG, 在eng 版本中預設開啟,以便抓到完整的資訊
* 在eng 版本上,LOG 量 >= user 版本的log 量,一些地方會直接check eng/user 版本來確認是否列印LOG
* user 版本預設關閉uart, eng 版本預設開啟uart
* 在eng 版本上,開啟ANR 的predump, 會抓取ftrace,可以得到更多ANR的資訊
* 在eng 版本上,可用rtt 抓取backtrace,可開啟kdb 進行kernel debug, 可用ftrace 抓取cpu 執行場景
* MTK aee 在ENG 版本抓取更多的異常資訊,比如native exception 會抓取core dump 資訊
* eng 版本linux kernel 開啟了大量的debug 選項,可以抓取出更多的資訊,如可以使用sysrq-trigger, KDB, User 版本則關閉

(2) 效能方面(Performance),原則上進行效能測試請使用user 版本測試
* user 版本為提高第一次開機速度,使用了DVM 的預優化,將dex 檔案分解成可直接load 執行的odex 檔案,eng 版本不會開啟這項優化
* user 版本相關kernel debug 關閉,有利於提高linux kernel 的效能
* user 版本更少的LOG 列印,更少的debug 程式碼,以及uart 的關閉,原則上user 版本的效能要優於eng 版本

(3) 安全方面(security)的影響
* eng 版本預設關閉了adb 的PC RSA指紋驗證,而user 版本預設開啟, 如果沒有驗證 PC RSA 指紋, adb 連線時將提升devices offline
* 因user/eng 版本設定ro.secure不同,導致user 版本adb 只擁有shell 許可權,而eng 版本具有root 許可權

  • eng 版本內建了su, adb 具有root 許可權, 導致系統的安全性嚴重受到影響

(4) 如何確認user/eng 版本
* Java 層,check android.os.Build 類中的TYPE 值
* native 層,property_get(“ro.build.type”, char* value, “eng”); 然後check value 值
* Debug 時, adb shell getprop ro.build.type 返回值如果是user 即user 版本,eng 即eng 版本
* Log 確認, mobile log/Aplog_xxxxx/versions 中檢視ro.build.type 屬性

(5) 如何編譯user/eng 版本
* 預設編譯是eng 版本,如果需要編譯user 版本,請加入引數 -o=TARGET_BUILD_VARIANT=user 如:
./mk -o=TARGET_BUILD_VARIANT=user mt6595_phone new

如何在User版本開啟串列埠(Uart),抓取上層Log,開啟輸入控制檯
[Description]
如何在User版本開啟串列埠(Uart),開啟輸入控制檯,抓取上層Log

[Keyword]
User Uart Log Logcat 輸入 控制檯 串列埠

[Solution]
(1) 如何在User版本中使用串列埠(Uart)
*Android GB 2.3 GB.MP GB.TDD.MP GB2.MP GB2.TDD.MP
alps/mediatek/config/common/autoconfig/kconfig/USER
如果版本一致的話,應當是這個檔案的37行
CONFIG_COMLINE=”console=ttyMT3,921600n1 loglevel=0”
您把最後的loglevel = 8 即可

*Android GB3.MP GB3.TDD.MP
手法1:直接用ENG 版本的lk 替換掉user 版本的lk, 即重新download eng 版本的lk 即可。
手法2: alps/bootable/bootloader/lk/app/mt_boot/mt_boot.c 裡面的 178 行,找到printk.disable_uart=1 改成 printk.disable_uart=0
然後重新編譯lk, download lk 即可。

*Android ICS 4.0/JB 4.1
如果是必須開機即需要抓取User 版本的Uart log, 請提交eservice 申請預設開啟uart 的xlog 執行檔
否則可以直接在adb shell 中輸入aee -k 6, 後面的6即kernel printk 的Log等級,您可以選擇不同的等級

*Android JB 4.2 以及以後版本
手法1:直接用ENG 版本的lk 替換掉user 版本的lk, 即重新download eng 版本的lk 即可。
手法2: alps/bootable/bootloader/lk/app/mt_boot/mt_boot.c 裡面的 178 行,找到printk.disable_uart=1 改成 printk.disable_uart=0
然後重新編譯lk, download lk 即可。
手法3: 如果只是臨時將uart log 開啟用於測試,請到我司DMS 上查詢文件: Enable UART Log in user build.pptx

  • 注意事項: 由於uart log 的列印對系統的效能造成嚴重影響, 在JB9.MP 以及以後版本, 在開機完成後預設關閉了uart log, 以提高系統性能. 從uart log 中可以看到如:
    抓UART Log的時候會看到類似下面的Log。
    [ 25.986567].(1)[324:Binder_1][usktrk] socket close[10422]
    [ 25.987748].(1)[324:Binder_1]BOOTPROF: 25987.740155:BOOT_Animation:END
    [ 25.988616].(1)[324:Binder_1]<< printk console disable >>

    要關閉此功能,可以進行如下操作:
    有三種種方法可以重新開啟UART log:

    1. 在超級終端視窗按下鍵盤的任何一個按鍵就可以讓UART log繼續吐。此種方式需要UART的TX和RX都要連線好。
    2. 通過修改proc引數的方式: adb shell echo 1 > /proc/mtprintk
    3. 通過設定system property:
      使用: UART:command: setprop persist.uartconsole.enable 1
      ADB Shell: adb shell setprop persist.uartconsole.enable 1

    (2) 如何開啟Uart 的控制檯(console/sh)
    Uart 控制檯的開啟,決定於System property ro.debuggable,預設如果ro.debuggable=1 則開啟(Eng 版本),User 版本ro.debuggable=0 則關閉。
    想在User 版本中開啟,需要更新alps/mediatek/config/mt65xx/init.rc, 在init.rc 的觸發器程式碼:
    on property:ro.debuggable=1
    start console
    後面增加:
    on property:ro.debuggable=0
    start console
    然後重新編譯bootimage 即可, ./mk [project_name] new bootimage

    (3) 如何在Uart 上抓取上層LOG
    Uart 上進行輸入,實際就是開啟了一個sh 對接起來,所以絕對不能在uart 上輸入一個長命令(不可中斷),否則uart 將被卡住,不能再輸入。
    抓取上層log, 我們通常需要call logcat, 但logcat 是不可中斷的,將導致uart 不能再輸入。
    處理的方法即將logcat 轉入後臺執行,如下操作即可:
    Main log: logcat -v time &
    Radio log: logcat -v time -b radio &
    Event log: logcat -v time -b events &
    如果想關閉上層log, 直接ps 查閱前面開啟的logcat process pid, 然後kill -9 pid 殺掉即可。
    注意一定要帶“&”,否則將block 住uart輸入