64bit adb & fastboot for Windows
前幾個星期趁著 1111 特價買了一台 Surface Pro 4 (最低階的) 一部分原因是想要在 Windows 平台上測試一些刷機工具,果然就讓我碰到惡名昭彰的 adb sideload 時出現 cannot read 的問題,稍微花了點時間研究一下,最後追到死在 malloc 那邊。
由於 macOS 與 linux 上都不曾碰過這樣的狀況,查了下網路發現會有這問題大部分都是在 windows 平台 sideload 很大的檔案 (原廠 ROM) 再加上電腦記憶體不大 (2G, 4G 不一定,有時重新開機馬上做沒問題) 的環境下,很直覺想到會不會是 32bit 程式的問題。實際在 SP4 (Windows 10, 4GB ram) 做了小小實驗,檔案在 1.5GB 以內的都還可以 sideload,稍微長大到 1.6 GB 就很容易失敗。但不幸的是 Android 官方一直沒有出 64bit 的 adb for windows,稍微找了下 github 便發現 adb-win64 這個 project,只是不清楚基於什麼理由拿掉了 usb 連線支援,但如果先以舊版的 adb 開啟 server 後,是可以成功透過 64bit adb 進行 sideload 的功能。所以目標很明確:編譯完整的 64bit adb 應該可以解決這問題。
根據這份 googlesource 上的文件 安裝 Windows Driver Kit 後,把整包 usb 的 source 拉回電腦,修改 winusb/SOURCES 將 ..\api\obj$(BUILD_ALT_DIR)\i386\AdbWinApi.lib 換成 ..\api\obj$(BUILD_ALT_DIR)\amd64\AdbWinApi.lib 後就可以開心的編譯了,產生的 AdbWinApi.dll 與 AdbWinUsbApi.dll 可以取出之後使用 (雖然我有放一份在 prebuilt)
拉回 adb-win64,先執行
get-sources.sh
抓回相關 source code-
修改
makefile.sample
,移除 dummy file#VPATH+= ../../../../ #SRCS+= AdbWinUsb.c #SRCS+= usb_none.c
再加回 usb 相關檔案
SRCS+= usb_windows.c LIBS+= AdbWinUsbApi.dll AdbWinApi.dll
最後把前面編譯好的 dll 檔案丟入 adb 目錄下
編譯 openssl : 執行
dependencies.sh
編譯 adb : 執行
build.sh
產生 adb.exe把 adb.exe, AdbWinApi.dll 跟 AdbWinUsbApi.dll 放在 windows 的同個資料夾下,即可享用 64bit 的 adb 帶來的好處:no more 'cannot read' ... :D
但事情還沒結束,這時如果去執行 fastboot 便會噴出『應用程式執行錯誤』的對話框,因為他用到的 AdbWin*.dll 已經是 64bit 但程式還是 32bit,所以如果你會用到 fastboot 要嘛就分開資料夾處理,要嘛就也重新編譯一份 64bit 的 fastboot。編譯上不會太難,多抓一份 gtest並修改 fastboot.cpp 加入這段 code:
#if defined( __x86_64__)
#define stat stat64
#define fstat fstat64
#endif
最後搭配這份 makefile,丟到 android-adb/system/core/fastboot 下執行 make 即可。
編譯好的程式在這邊: https://mega.nz/#!tp9DSQ4b!3wdDLsh3BBtPju8G74xlDjLJ9QywFaoLs1T11mMt3QQ
只是小弟我對 windows programming 不是很熟,太多神奇的 macro 不知為何而定義,只能依樣畫葫蘆拿 adb 的 makefile 來改,所以如果有不對的地方歡迎 clone 一份修正:https://github.com/shakalaca/adb-win64
Happy Hacking ! :)