以下觀點全屏我個人經驗簡單叙述,個别詳細技術不一定很準确,但基本沒問題。
以下所說手機助手,均指Android手機助手
一 關于手機助手
手機助手一開始就是指在PC端運作的一個用戶端,可以通過USB或者WIFI方式來與手機進行通信,給手機安裝遊戲,解除安裝遊戲,進行遊戲、應用的管理,當然還要有手遊的展示與下載下傳功能。
先插入個概念:Google提供的一個開源工具,adb.exe,充當了android編譯器Eclipse通過DDMS來調試android程式的debug工具,通過合理使用adb.exe并遵照其規定指令格式,我們可以通過給adb.exe發送adb指令,來實作與android模拟器或手機進行通信,以此來實作我們想要的功能。
随着手機助手的功能越做越多、越複雜(涉及到手遊聯運),為了提高使用者體驗度,有的功能對通信效率要求變得很高,比如在PC端給手機動态截屏;有的功能adb沒有自帶,比如PC端需要知道安裝進度;有的需要adb把某些資訊處理的更細化,比如裝置連接配接失敗原因、遊戲安裝失敗原因(這些adb也會自帶,隻是沒有很細化);有的因為adb版本問題造成及時驅動已正确安裝,也不能與adb正常通信……是以很多大公司直接把adb進行了改寫,以此來擴充adb的功能。當然即使不改寫adb,也完全可以實作一個手機助手的大部分功能。
現在對于很多專業做手機助手的公司來說,簡單的adb已經不能滿足他們的更多功能需求,比如PC端想知道abdroid端的一切資訊(通訊錄、實時短信、遊戲儲存進度的擷取…),為了實作更多的功能,很多公司在android端寫了一個android小工具,名字也叫做手機助手,其主要功能就是相當于PC斷手機助手安插在android端的一個代理,PC端來通過adb把指令發送給這個代理,它來根據不同指令做一些事情,再把指令執行結果通過adb傳回給PC端,這一切都離不開adb,可見adb在PC手機助手中扮演者多麼重要的角色。
二 關于adb
長話短說,adb就是一個程序,名字叫做adb.exe,當我們用指令行啟動了一個adb.exe後,adb.exe會檢測一下是否有adb server正在運作。如果沒有,其會在内部啟動一個adb server,名字也叫做adb,然後将指令行組織一下格式,發送給adb server(通過socket,端口是5037,IP是本地127.0.0.1)。接下來adb.exe(它相當于一個用戶端client)便會自動退出。Adbserver在拿到指令後,會通過底層的USB協定将指令發送給android端的伺服器。如果我們後續再通過指令行給adb.exe發送指令時,adb便會重複以上動作。
而最有意思的事情是,android端的伺服器,名字是adbd.exe,但是實作源碼是與PC端的這個adb.exe是一模一樣的。為什麼同樣源碼會實作不同功能呢?其關鍵點就在于,在adb.exe開頭部分,用了一個LOCAL_HOST(好像是這個名字)宏定義,來差別是adb.exe還是adbd.exe,并進行不同的編譯。
三 關于PC端與手機端通信
1. WIFI通信
這個不是很常用,網絡上已有的個别大公司的手機助手具有該功能,需要手機端有個android手機助手來配合。
2. USB通信
USB通信即通過adb通信。我們在用adb.exe時,需要兩個動态連結庫的支援,AdbWinUsbApi.dll和AdbWinApi.dll。我們給adb發送指令,adb把指令整理一下,最後通過USB端口來發送給android端。既然是USB通信,而且在使用者的電腦是什麼情況、手機是什麼情況,都不知道的情況下,就會出現一系列讓人很頭疼的問題。至此便引出了最難搞,也是最危險的問題,裝置連接配接。之是以危險,是因為,使用者把手機助手下載下傳下來,安裝打開後,連接配接不上手機,手機都連不上,還能用來幹什麼,隻能解除安裝了,而且估計以後也不會再考慮該手機助手了。
以下為通過adb來與手機進行通信時用到的常用指令
Adb常用指令:
1. 檢視裝置
Adb devices
這個指令式檢視目前連接配接的裝置,連接配接到計算機的android裝置或者模拟器将會列出顯示
2. 安裝軟體
Adb install
Adb install<apk在PC磁盤上的路徑> 這個指令會将制定的apk檔案安裝到裝置上
3. 解除安裝軟體
Adb uninstall<軟體名>
Adb uninstall –k<軟體名>
如果加-k參數,為解除安裝軟體但是保留配置和緩存檔案
4. adb shell
進入裝置或模拟器的shell環境中,在這個linuxshell中,可以執行各種linux指令,另外如果隻想執行一條shell指令,可以采用以下方式:
Adb shell[command]
5. 從電腦上發送檔案到裝置
Adb push <本地路徑> <遠端路徑>
該指令可以把本級電腦上的檔案或者檔案夾複制到裝置(手機)指定路徑下
6. 從裝置上下載下傳檔案到電腦
Adb pull <遠端路徑> <本地路徑>
該指令可以把裝置(手機)上的檔案或者檔案夾複制到本機電腦
四 關于裝置連接配接
這裡我就說一下我的連接配接流程吧,也許别人來設計連接配接流程還會有更好的方法。
1. 手機助手安裝後,會開機自啟動一個背景運作的監控程序,該監控程式注冊了windows的USB事件通知。
2. 當有裝置插入電腦時,該監控程序會收到通知,收到很多VID、PID的裝置字元串,解析出VID(廠商),檢索配置檔案,判斷該VID是否為我已收錄的手機廠商,若是,則檢索出廠商名,并将VID、PID和其他ID資訊儲存起來。在視窗右下角彈窗提示使用者,檢測到三星手機,問使用者是否連接配接該手機。
3. 使用者點選連接配接按鈕,将已經儲存的裝置資訊一并發送給手機助手主程序。主程序用adb devices檢測一下裝置狀态,包括如下狀态:
A 未打開調試模式(這個可能會有一些誤差)
B Offline狀态,通常為USB供電不足
C 未安裝驅動,通常傳回空字元串或者其他字元
D adb啟動失敗類的問題(會有一系列傳回碼)
E 打開了存儲模式,請關閉(個别手機有這種情況)
……
4. 如果判斷出是未安裝驅動,則會提示使用者正在安裝驅動,然後根據VID和PID去背景下載下傳對應的驅動,采用靜默安裝的方式把驅動安裝上。在這裡有一點需要注意,驅動分為兩種:通用驅動和專用驅動,對于騰訊手機助手和豌豆莢,它們是先安裝通用驅動,如果通用驅動不好用,才會下載下傳專用驅動繼續安裝。對于360來說,直接安裝專用驅動,專用驅動不好用,再下載下傳通用驅動來安裝。
5. 驅動安裝完後,如果用adb devices還是檢測到驅動不好用,則提示使用者連接配接失敗,是否重新連接配接,使用者點選重新連接配接後,重複上面的步驟。當然裝置連接配接這塊兒需要很詳細的處理才能做好。給使用者看的引導頁面和流程用起來是否舒服很重要。
6. 如果連接配接成功,則通過adb擷取手機記憶體、SDcard記憶體、手機詳細型号、android版本等資訊,顯示給使用者
其實手機助手要是做細了,還是有非常多的東西可以做的。
五 關于apk遊戲檔案的解析
Apk檔案的解析還是比較簡單的,google給提供了一個工具,名字叫做aapt.exe,目前基本所有手機助手的apk檔案解析用的都是這個工具。我們通過指令行的方式給aapt發送指令,便會從管道得到所有資訊。
六 關于遊戲安裝與解除安裝
安裝:
1. Apk遊戲比較大時,安裝時間較長
2. 如果不改寫adb,安裝沒有真實的進度
3. 如果不該寫adb,需要想辦法避免與其他手機廠商的adb沖突
4. 需要避免跟自己adb的沖突,如果有一個自己的adb正在執行任務,此時再啟動一個adb,後啟動這個會處于等待狀态,這個應該有好的解決方法,我還沒詳細研究
解除安裝:
Adb uninstall<name> 這裡的name是apk内部存放的遊戲名字,而不是apk的名字,應該有方法可以通過adb擷取到手機端已安裝遊戲清單。
七 關于遊戲的管理
在不改寫adb的情況下,這個應該也可以實作,我之前見到過有人直接用adb已有接口做過。
PS:因為目前網絡上出現了很多占用磁盤空間非常大的遊戲,700、800MB已經很常見了,有的甚至1G多。對于這種遊戲的檔案結構,主要分為兩塊,一塊兒是遊戲執行檔案,一塊兒是資料包。這種遊戲就是最近很火的大型遊戲。是以現在很多手機助手都出了大型遊戲的版塊兒,這種遊戲是把遊戲執行檔案和資料包壓縮到一個檔案中,當下載下傳到使用者電腦上後,再解壓、安裝、傳資料包到手機端。如果做大型遊戲版塊兒,就需要編輯來配合
【完】