《自拍教程41》Python adb一鍵清理磁盤

Android設備,比如車載tbox搭載的Android系統,
其只有500M的磁盤容量;電視機搭載的Android系統其磁盤容量也非常小,
一般debug階段的產品,開啓的log比較多,比如有:
自動後臺logcat截取,自動捕捉coredump, tombstone,anr,
dropbox等crash相關的log,還有比如車載測試,可能產生大量的gps軌跡log,
語音測試可能產生很多錄音文件。及時清理以上log,有很多好處。
(1). 適時地清理log,可以在導出log的時候,花較少的時間,減少不必要的冗餘的log。
(2). 適時地清理log,可以減少磁盤滿爆盤風險,尤其是磁盤容量很小的設備,
爆盤後你會看到各種App的無法正常運行。
所以,適時清理log,對於一個合格的測試人員來說,也很重要。


準備階段
  1. adb shell rm -rf,可以清除log
  2. 你需要了解具體log尤其是老舊的無用的log的存儲位置
  3. 刪除log的時候,要注意正在進行寫操作的文件,不能刪,不然log會丟失。
  4. os.system()可以調用adb命令

Android系統默認的Log存儲路徑
Android Log類型 默認路徑
logcat序列log /data/logs/logcat.txt
/data/logs/logcat.txt.1

/data/logs/logcat.txt.20
dbus序列log /data/logs/dbus.txt
/data/logs/dbus.txt.1

/data/logs/dbus.txt.20
kernel序列log /data/logs/kernel.txt
/data/logs/kernel.txt.1

/data/logs/kernel.txt.20
tombstone log /data/tombstones/*
anr卡死log /data/anr/*
dropbox log /data/system/dropbox/*
gps log /sdcard/map/gps/*
高德地圖log /sdcard/amapauto8/logs/*


正在進行寫操作的Log不能刪除

其中,自動生成的序列log,比如logcat序列log,
一般是全部寫到logcat.txt,寫滿5M後,
將logcat.txt重命名爲logcat.txt.1,以此類推。。。
所以logcat.txt就始終是最新的log,這個文件是不可以刪除的,
因爲假如刪除了,則文件句柄會出錯,無法自動生成序列logcat日誌了,
logcat.txt.1, logcat.txt.2 這些是老的log, 可以刪除,
所以: 只能用adb shell rm -rf /data/logs/logcat.txt.*
注意這個.*, 代表了.1, .2, .3 …等等序列log文件

Python批處理腳本模式
# coding=utf-8
import os

print("正在清理舊log...請稍候!")
os.system("adb shell rm -rf /data/log/logcat.txt.*")
os.system("adb shell rm -rf /data/log/dbus.txt.*")
os.system("adb shell rm -rf /data/tombstones/*")
os.system("adb shell rm -rf /data/anr/*")
os.system("adb shell rm -rf /data/system/dropbox/*")
os.system("adb shell rm -rf /sdcard/map/gps/*")
os.system("adb shell rm -rf /sdcard/amapauto8/logs/*")
print("舊log清理完畢!")
os.system("pause")

Python面向過程函數形式

本次我們區分下清理Log的等級,分2個函數,
一個是清理大部分log的函數, 一個是清理所有log的函數。

# coding=utf-8
import os

def clean_most_logs():
    os.system("adb shell rm -rf /data/logs/logcat.txt.*")
    os.system("adb shell rm -rf /data/logs/dbus.txt.*")
    os.system("adb shell rm -rf /data/tombstones/*")
    os.system("adb shell rm -rf /data/anr/*")
    os.system("adb shell rm -rf /data/system/dropbox/*")

def clean_all_logs():
    clean_most_logs()
    os.system("adb shell rm -rf /sdcard/map/gps/*")
    os.system("adb shell rm -rf /sdcard/amapauto/logs/*")

# print("正在清理大部分的舊log...請稍候!")
# clean_most_logs()
# print("大部分舊log清理完畢!")

print("正在所有的舊log...請稍候!")
clean_all_logs()
print("所有舊log清理完畢!")

os.system("pause")

以上,實現了函數的嵌套與調用。

Python面向對象類的形式
  1. 以"萬物皆可歸類"的思想, 先抽象化出一個類來,
    類名一般建議用"名詞", 所以我們命名爲"LogCleaner",
    代表Log清理器, 且一般要駝峯式(首字母大寫)來規範類的命名.
  2. 養成良好的類的初始化(__init__)的習慣,
    初始化過程中, 可以pass(什麼都不做)
  3. 這個LogCleaner 類, 目前需要2個清理log的函數(動作功能),
    一個是清理大部分Log,一個清理所有Log。
  4. 類是一個抽象的事物, 必須實例化成具體的對象後,
    才能進行調用, 所以我們實例化並命名成了l_obj, 表明是一個對象.
  5. 實例化成具體對象後, 對象就可以調用clean_all_logs這個函數了.
# coding=utf-8
import os

class LogCleaner():
    def __init__(self):
        pass

    def clean_most_logs(self):
        os.system("adb shell rm -rf /data/logs/logcat.txt.*")
        os.system("adb shell rm -rf /data/logs/dbus.txt.*")
        os.system("adb shell rm -rf /data/tombstones/*")
        os.system("adb shell rm -rf /data/anr/*")
        os.system("adb shell rm -rf /data/system/dropbox/*")

    def clean_all_logs(self):
        self.clean_most_logs()
        os.system("adb shell rm -rf /sdcard/map/gps/*")
        os.system("adb shell rm -rf /sdcard/amapauto8/logs/*")

l_obj = LogCleaner()
print("正在所有的舊log...請稍候!")
l_obj.clean_all_logs()
print("所有舊log清理完畢!")

os.system("pause")


代碼運行方式

確保Android車機設備通過USB線與電腦連接了,adb設備有效連接,
以上代碼的3種實現形式都可以直接運行,比如保存爲clear_logs.py並放在桌面,
每次需要截圖的時候,雙擊運行clear_logs.py,
你用df查看disk free查看你會發現磁盤空出來了不少的容量。

更多更好的原創文章,請訪問官方網站:www.zipython.com
自拍教程(自動化測試Python教程,武散人編著)
原文鏈接:https://www.zipython.com/#/detail?id=b34f53626b164c18a5580f1731f266b2
也可關注“武散人”微信訂閱號,隨時接受文章推送。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章