fastboot是針對Android設備的一種刷機方式,它比recovery更底層,刷機速度更快。本文要完成的這個項目就是用PyQt5來給fastboot加個GUI層,使操作更加簡單方便。
首先要清楚fastboot能做些什麼,通過在cmd裡輸入fastboot就可以查看它的幫助信息
本工程主要實現的是fastboot的燒錄功能,其它的像獲取、設置相關信息就沒有涉及,有需要的話就自己去添加。
還有一個比較特殊的需求就是燒錄的鏡像需要修改的情況,我這裡稱它位BBCB,它的一部分數據由用戶輸入的。
使用QtDesigner來設計,這裡只用了label、pushButton、lineedit,還有就是水平布局、垂直布局和菜單欄,還是比較簡單。
利用信號和槽機制。首先創建一個class,繼承自QThread,在需要更新UI的時候發送一個信號
class detectDeviceThread(QThread): detectSignal = pyqtSignal(object) def __int__(self): QThread.__init__(self) def run(self): while True: deviceNum = lj_list_device_id(self) self.detectSignal.emit(deviceNum) time.sleep(3)
在UI層面,綁定信號和槽,然後實現該槽,UI的更新就在槽裡執行。
def onDeviceDetected(self,data): ''' 檢測到Android設備上線後的操作 :return: ''' font = QtGui.QFont() font.setFamily("微軟雅黑 Light") font.setPointSize(12) font.setBold(True) self.textBrowser_device_id.setFont(font) if(common.PREVIOUS_DATA != data): common.PREVIOUS_DATA = data self.textBrowser_device_id.setText(data) if not data.strip(): common.FLAG_DEVICE_ONLINE = False else: common.FLAG_DEVICE_ONLINE = Truedef startDetectDevice(self): ''' 開啟線程,檢測Android設備上線 :return: ''' self.detectThread = detectDeviceThread() self.detectThread.detectSignal.connect(self.onDeviceDetected) self.detectThread.start()
我這裡需要變更BBCB鏡像的某幾個字節(類似於C語言中的結構體數據類型)的數據,需要使用到struct這個模塊。來看段代碼
fp = open("toc\\nvram.toc","rb+")fp.seek(common.BBCB_OFFSET + 2,os.SEEK_SET) manufacturer_id = fp.read(1) manufacturer_id_new = int(self.lineEdit_manu_id.text()) if(manufacturer_id != manufacturer_id_new): logging.debug("newmanufacturer_id: " + str(manufacturer_id_new)) fp.seek(-1,os.SEEK_CUR) fp.write(struct.pack("B",manufacturer_id_new)) fp.flush()
首先是打開文件,進行文件定位,然後將要寫入的數據按照特定的格式寫入文件。struct中支持的格式如下表所示
在上例中,是將manufacturer_id_new的值以格式”B”,也就是C語言裡的unsigned char寫入到文件中。依照上表,如果是一個長度為5的字符串,格式應該是”5s”
這裡使用python自帶的logging作為日志系統。因為需要在多個模塊內(多個文件)使用,我們在工程入口處進行全局的初始化
def initLogConfiguration(): ''' 初始化日志配置 ''' logging.basicConfig(level = logging.DEBUG, filename = common.LOGFILE, filemode = 'a+', format = '%(asctime)s - %(filename)s - line %(lineno)-4d - %(levelname)s - %(message)s', datefmt = '%m-%d %H:%M')
這裡是輸出到文件,同樣你也可以輸出到控制台,通過stream參數指定,如果同時指定了filename和stream,logging會忽略stream。初始化完畢後,在其它需要輸出log的模塊就直接使用就可以了
logging.debug("some message")
主要就是判斷當前平台,然後進行不同方式的處理。這裡使用platform庫
import platformPLATFORM_SYSTEM = platform.system()OS_MAC = (PLATFORM_SYSTEM == "Darwin")OS_WIN = (PLATFORM_SYSTEM == "Windows")OS_LINUX = (PLATFORM_SYSTEM == "Linux")
https://github.com/djstava/PyQt5Fastboot