android

Android官方iotop初探,原始碼修改並編譯


概述

透過之前的調研,發現Android官方得的iotop效率更高,於是計劃從定位iotop原始碼,原始碼編譯,新增IO歷史資料功能幾步入手,進一步調研iotop的使用。

內容

1. 定位iotop原始碼

由於發現iotop是android9.0以上系統自帶的工具,因此去查了9.0的原始碼,發現iotop原始碼果然在這裡,是c++寫的。
在這裡插入圖片描述
主要就這個幾個檔案,但是由於iotop內部引用了Android自建庫的一些函式,因此沒法單獨編譯,需要把android相關程式碼下全一起編譯。
在這裡插入圖片描述

2. Android原始碼下載並編譯

借了一臺外網伺服器,xshell連線上,配置了一大堆東西,具體可見參考裡的文章(記一次編譯Android原始碼),主要是執行了
repo init -u https://.googlesource.com/platform/manifest -b -9.0.0_r3
下載好原始碼之後開始開始嘗試編譯iotop,
source build/envsetup.sh
lunch
選擇一個與目標機器一致的就可以了,我這裡是aosp¬_x86_eng,
在這裡插入圖片描述在這裡插入圖片描述
編譯好之後用lrzsz工具將編好的iotop可執行檔案拷到本地再傳到裝置裡,覆蓋掉之前的iotop,然後順利執行。

3. Iotop獲取IO資料得方式

透過原始碼可以看到官方的iotop的核心獲取資料邏輯在taskstats.cpp裡面,主要是使用了GetStats這個函式,原始碼可見:taskstats.cpp,關鍵邏輯如下截圖,
在這裡插入圖片描述
這裡使用了linux/taskstats.h這個結構體,這裡面定義了一些io屬性,透過替換taskstats.cpp原始碼裡的變數,實驗後發現這些變數裡沒有可以表示IO歷史記錄的。原始碼可見:taskstats.h
在這裡插入圖片描述

4. 修改iotop,加上歷史IO監控

Holding

5. Shell指令碼Iotop獲取資料的方式

讀取了io下的write_bytes資料,這個值是儲存了程序自建立以來的歷史IO資訊,存在虛擬記憶體中,程序被銷燬重建後進程id會重新分配,因此程序被殺再啟動,就會重新統計新pid的歷史io資料。
在這裡插入圖片描述

小結

透過原始碼閱讀和實驗,android官方的iotop工具目前看來暫不支援獲取IO歷史資料。具體獲取資料的方法需要閱讀taskstats相關原始碼,深入linux核心去探查了,因為已經基本確定無法達到需求,筆者沒有繼續深入了。

參考

AndroidXref Pie 9.0.0_r3
記一次編譯Android原始碼
Linux上傳下載軟體lrzsz
linux taskstats初探
taskstats.h原始碼
http://androidxref.com/9.0.0_r3/xref/system/extras/taskstats/taskstats.c

本文章已修改原文用詞符合繁體字使用者習慣使其容易閱讀

版權宣告:此處為CSDN博主「飛翔的易拉罐」的原創文章,依據CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。

原文連結:https://blog.csdn.net/moxiouhao/article/details/101283070