想起前段時間研究過的minicap,抱着無果的心情再次看了源碼,這次竟然比上次清晰了一點點,難道是因為這兩天被android源碼折磨得身心疲憊然而卻在不知不覺中增長了?不懂怎么樣,看懂了大概。
Minicap在客戶端連接的時候,會向客戶端發送一個24字節的banner,具體格式:
banner版本、banner大小、minicap的進程id,手機真實寬度、手機真實高度、期望寬度、期望高度、期望手機屏幕方向、quirks貌似是顯示模式.
之后會向客戶端發送當前屏幕截圖的二進制流,這里直接分析example/下的app.js
第一個if是為了接收第一個響應,既解析banner.
之后才是接收圖片信息
else if (readFrameBytes < 4) { // 前4個byte是 frameBodyLength frameBodyLength += (chunk[cursor] << (readFrameBytes * 8)) >>> 0 cursor += 1 readFrameBytes += 1 console.info('headerbyte%d(val=%d)', readFrameBytes, frameBodyLength) }
之后的接收到響應的每個chunk是一個Buffer對象,前4個字節代表當前chunk的長度(單位是byte),由於屏幕截圖可能很大,可能到2-6M大小,所以會多次觸發客戶端的read方法,用來分片發送圖片,所以需要一個容器把每次接收到的圖片片段存儲起來,frameBody就是這個容器:
接收完了之后,就可以把圖片顯示出來:
也可以把buffer寫入一個jpg文件看看是不是圖片數據。
要完全理解還需要c++的線程,android的機制,整好android源碼再看這部分吧。