ADB_VENDOR_KEYS 檔案必須以 .adb_key 結尾

話說很久沒弄 Android 開發了,這兩天為了想把 Go 寫的東西包起來放上去跑,大費周章、不情不願的把 Android Studio 裝起來,結果要連上裝置的時候一直沒辦法認證成功。古董 Android 7 還沒有 WiFi pairing 的功能,所以本機產生的 adbkey 一直沒辦法被允許。想先用 USB 連,但目標是類似 Android TV 的東西,上面根本沒有 USB device 的接口。問廠商,還跟我說用對話框認證,就根本不會跳出來啊。後來他們把自己電腦裡的 adbkey 寄來,果然就可以了。但不想用他們的蓋掉我本機的,就照著 adb 說明,把寄來的 adbkey, adbkey.pub 另存一個目錄,然後設定環境變數 $ADB_VENDOR_KEYS 指到那目錄,卻怎麼也測不成功。

後來先把本機端 adb server 跑成 foreground, 命令用 env ADB_TRACE=all ./adb nodaemon server. 結果看到這神秘的幾行:

1
2
3
4
adb I 01-27 19:46:16 264189 264189 auth.cpp:408] watch descriptor 1 registered for '/home/john/.android/xxx
adb I 01-27 19:46:16 264189 264189 auth.cpp:158] load_keys '/home/john/.android/xxx'...
adb I 01-27 19:46:16 264189 264189 auth.cpp:194] skipped non-adb_key '/home/john/.android/xxx/adbkey.pub'
adb I 01-27 19:46:16 264189 264189 auth.cpp:194] skipped non-adb_key '/home/john/.android/xxx/adbkey'

non-adb_key 是什麼鬼?接下來去 github 找 adb 原始碼看到:

1
2
3
4
if (!android::base::EndsWith(name, ".adb_key")) {
LOG(INFO) << "skipped non-adb_key '" << path << "/" << name << "'";
continue;
}

好啊,一定要這樣就對了,我還以為它會每個檔案都讀讀看,結果是只讀 .adb_key 結尾的啊(參考)。把 xxx/adbkey 改成 xxx/xxx.adb_key 之後就可以了。