บทความนี้สำรวจวิธีใช้ ADB เพื่อควบคุมรายละเอียดตอนติดตั้ง, ทดสอบ, 診斷, และจัดการอุปกรณ์และ emulators หนึ่งหรือหลายตัว
หลายปีแรกในฐานะ software developer ทำงานกับ Android SDK ผมไม่รู้ ADB (Android Debug Bridge) คืออะไร ทำอะไร ได้เมื่อไหร่
ข้อสนุก: ไม่ใช่เป้าหมายวิชาชีพที่ดחףให้เรียน ADB แต่เป็น Nexus 6 ที่ boot loop ต้องการฟื้นคืน Android Studio และ Gradle ช่วยไม่ได้เลย
บทความนี้เขียนด้วย สองกลุ่มเป้าหมาย:
- คุ้นเคย CLI, Shell, Processes, และ Client-Server Model
- ไม่คุ้นเคย CLI, Shell, Processes, และ Client-Server Model
กลุ่มแรกข้ามส่วน "How to Work With The ADB" ได้
กลุ่มที่สอง สมมติเหมือนผมตอน Junior รู้น้อยมาก ส่วนแรกเป็น soft introduction และ glossary คำศัพท์พื้นฐาน อธิบายให้เข้าใจง่ายที่สุด
ข้อมูลเบื้องต้น
เรียนรู้หัวข้อสำคัญเพื่อเข้าใจ ADB ทำงานและใช้อย่างไร
บางคนหลีกเลี่ยง command line tools จาก Vim enthusiasts หรือ Unix System Administrators ที่ตัดสิน ผมรับรู้ว่า CLI ไม่ ideal สำหรับสมองผม คิดว่าคุณอาจชอบมุมมองของผม
Command Line
อย่างง่าย CLI คือ interface (วิธีส่ง/รับข้อมูล) กับคอมพิวเตอร์ที่ ใช้เฉพาะบรรทัดข้อความ
CLI ไม่ใช่โปรแกรมเอง แต่โปรแกรมบางตัว提供 CLI (อาจมี GUI ด้วย)
เคยพิมพ์ใน Windows Command Prompt (หรือ MS-DOS ถ้าเป็น 90s kid), Mac Terminal, หรือ GNOME Terminal บน Linux ทั้งหมดใช้ CLI หลัก
ข้อดีและข้อเสียของ CLI ขึ้นอยู่กับบุคคลและปัญหาที่แก้ ผมไม่ชอบ CLI เว้นแต่ทำทุกวัน
สมองผมไม่เหมาะจดคำสั่งย่อแปลก (เด็กตอนเรียนอ่านยาก) ต้องพึ่ง implicit memory (muscle memory) และ cheat sheets มาก
แต่ผู้ที่ยินดีลงเวลาแม้จะยาก (เหมือนผม) หรือจดจำได้ดี คุณจะค้นพบว่ามีประสิทธิภาพมากกว่า GUI มาก
หลาย operations ทำได้ในเวลาสั้นกว่าคลิกเมนูหลายขั้นตอน สามารถเขียน scripts (ไฟล์คำสั่งข้อความ) เพิ่มประสิทธิภาพได้อีก
ใช้ ABD Shell
สมมติคุ้นเคย Operating System (OS): Android, iOS, Windows, Mac, Linux, Unix-like systems
ทำไม relevant กับ ADB? Android OS based on Linux, Linux based on Unix
ผลคือ ใช้ ADB เข้าถึง Unix Shell ของอุปกรณ์/emulator ได้ ให้ความยืดหยุน ความสามารถ และการควบคุมมากโดยโต้ตอบกับ shell โดยตรง
Shell คือโปรแกรมโต้ตอบกับ OS เหมือนเปลือกเต่า ป้องกันและให้เข้าถึง inner workings ไม่ต้อง overthink ถ้าอ่านนี้บนคอมพิวเตอร์ คุณใช้ shell มาช่วยแล้ว
Shell ให้ CLI หรือ GUI หรือทั้งคู่ ใช้สร้าง/อัปเดต/ลบ/ย้ายไฟล์ เริ่มโปรแกรมอื่น เข้าถึง services ของ OS
ใช้ ABD Client และ ABD Server
เริ่มด้วยคำอธิบายไม่แน่นอนแต่เข้าใจง่าย แล้วปรับปรุง
Clients และ Servers เป็นคอมพิวเตอร์ แยกกันด้วย role คอมพิวเตอร์คุณเป็น Client ของ freeCodeCamp Server ที่ serve หน้า HTML นี้
โดยทั่วไป client คือ สิ่งที่ใช้สิ่งอื่น server คือ สิ่งที่ถูกใช้ ไม่ overthink Client-Server Model อธิบายสิ่งมากมายในและนอก computing
Clients และ Servers เป็น "คอมพิวเตอร์" ไม่จริงในบริบทของเรา เราควรคิดว่าเป็น processes (process คือโปรแกรมที่กำลังรัน)
Client process และ Server process มักรันบนคอมพิวเตอร์ต่างกัน แต่วันบนเครื่องเดียวกันก็ได้ จะครอบครอง memory space ต่างกัน ต่างกันแค่ communicate ด้วย IPC แทน network
ADB ใช้ Server process อนุญาต multiple developers (multiple clients) จัดการ multiple Android devices/emulators
ใน enterprise Server process อาจอยู่บน remote computer แต่เราจะตั้ง Server local กับ Client 簡單กว่าที่คิด
ABD Daemon คืออะไร?
Process คือโปรแกรมที่รัน Daemon คือ process รันใน background ผู้ใช้ไม่โต้ตอบโดยตรง
เปิด web browser การจัดการ network connections ทำโดย NetworkManager Daemon (ไม่ใช่ browser process)
แต่ละ Android device (physical หรือ emulated) ที่ config ถูกต้อง จะมี ADB Daemon (adbd) รันคำสั่งจาก Server process
สรุป: Client ส่งคำสั่งให้ Server Server ส่งต่อให้ ADBD รันบน device
ใช้ ADB สำหรับ Android Development
ส่วนที่เหลือครอบคลุม:
- Drivers และ configuration ใช้ ADB บนระบบของคุณ
- ใช้ ADB กับ physical devices และ emulators
- Basic commands ด้วย ADB CLI
- Advanced usage ใช้ Android device Shell ผ่าน ADB
ก่อนเริ่ม ตัดสินใจ CLI tool ไหนใช้กับ ADB Windows ชอบ PowerShell แต่ Command Prompt ก็ได้ Linux/Mac ใช้ Terminal เริ่มต้น
ใช้สิ่งที่ทำงานได้
บทความมีรายละเอียดเต็มๆ แต่มี video tutorial สรุปที่นี่:
เข้าใจ CLI Examples
บทความมีคำสั่งมาก ส่วนที่เปลี่ยนตามสถานการณ์ จะอยู่ใน angle brackets
อย่าใส่ angle brackets ใน CLI command
เช่น adb pair <ip-address>:<port> แทนที่ด้วยค่าจริง adb pair 192.168.0.1:5554
ABD Drivers & Configuration
ต้องมี Android SDK Platform-Tools ล่าสุด (หรือล่าสุดพอสมควร) หากไม่ใช้ Android Studio ดาวน์โหลด standalone package สำหรับ OS ของคุณ
ถ้าใช้ Android Studio ดาวน์โหลด/อัปเดตผ่าน SDK Manager
มักมี toolbar icon เปิด SDK Manager แต่เปลี่ยนรูปทุก hotfix หาไม่เจอ ไป File -> Settings ค้นหา "SDK" หา "Android SDK" menu

ขั้นตอนต่อไปเปลี่ยนตามตัวแปร ตามที่กล่าวใน Preliminaries ADB ใช้ Client-Server Model ให้ความยืดหยุ่น
โดยเฉพาะ อาจมี:
- Multiple Clients กับ remote Server
- Server local (เครื่องเดียว) กับ one Client
- Physical devices และ emulators หลากหลาย ผูกกับ server เดียวกัน
Advanced configuration หลาย clients และอุปกรณ์เยอะ ใช้ ADB ได้ แต่ไม่อยู่ในขอบเขตบทความ
หนึ่ง Server จัดการได้สูงสุด 16 emulators และ physical devices ไม่จำกัด (ในความสมเหตุสมผล) โดยไม่ต้อง advanced config
บทความนี้ทำงานกับ one physical device และ one emulator สำหรับ single ADB server process
ตั้งค่า ABD Emulator
ส่วนใหญ่ไม่ต้อง config เพิ่ม แต่อาจต้อง enable Developer Options บน emulator จะรู้เร็วตอนรันคำสั่ง ADB แรกๆ
หากต้องการ enable บน emulator ต้องค้นหาวิธีสำหรับ Android version นั้น
USB Debugging – ตั้งค่าอุปกรณ์ Physical
หากไม่ใช้ physical device ข้ามส่วนนี้ได้ แต่ควร enable Developer Options
ต้อง config USB Debugging หรือ WiFi Debugging บน Android device และ development machine
ทั้งสองกรณี เริ่ม enable Developer Options บน device ค้นหาวิธีสำหรับ Android version นั้น
USB Debugging
Enable USB Debugging บน Android device ผ่าน Developer Options ลิงก์ข้างบนอธิบายกระบวนการ (เปลี่ยนไปตาม Android OS versions)
ก่อนต่อไป Windows users ต้องดาวน์โหลด USB Driver Ubuntu users ต้องขั้นตอนเพิ่ม Mac และ Chrome OS พร้อมแล้ว
Enable USB Debugging แล้ว เชื่อม Android device ผ่าน USB cable
WiFi Debugging
หากมี multiple physical devices หรือขาด USB cables ใช้ WiFi Debugging
Developer Options บน Android device Enable Wireless debugging จะ prompt เรื่อง Allow debugging on network ที่ device เชื่อมต่ออยู่ Allow (ถ้า network ถูกต้อง)
เริ่มทำงานกับ CLI หา platform-tools directory ใน Android SDK installation directory
สมมติมี Android Studio ไป File -> Settings ค้นหา "SDK" "Android SDK" menu จะบอก SDK installed directory ที่ควรมี platform-tools
ตัวอย่าง: copy path ไปยัง Android SDK directory เปิด Windows PowerShell พิมพ์:
Change Directory:
cd <path-to-SDK-directory>List Files and Directories:
ls
พิมพ์ cd platform-tools เข้า directory นั้น ขั้นตอนต่อไปสมมติ device รัน Android OS 11 หรือสูงกว่า
หาก Android 10 หรือต่ำกว่า ดูคำแนะนำที่นี่
อยู่ใน platform-tools directory แล้ว พร้อม pair Android device กับ development machine:
1. ใน Wireless debugging submenu Settings -> System -> Developer options เลือก Pair device with pairing code
2. ใน CLI tool (อยู่ใน platform-tools directory) พิมพ์:
adb pair <IP address>:<Port>
IP address และ Port มาจาก dialog บน Android device หลังเลือก Pair device with pairing code (อย่าใส่ angle brackets)
Note: อาจต้อง prepend adb call ด้วย symbols หรือ commands ขึ้นกับ CLI tool, OS, และ access controls เช่นผมพิมพ์ .\adb pair <IP address>:<Port> บน PowerShell Windows
3. สมมติ CLI ทำงานดี จะ prompt ให้ใส่ pairing code ที่มองเห็นใน dialog เดียวกับ IP และ Port
4. หลังใส่ pairing code รู้ว่าสำเร็จถ้าได้ข้อความ:
Successfully paired to <IP Address>:<Port> [guid=<Some GUID>]
5. Windows หรือ Linux ต้องรันคำสั่งเพิ่มด้วย IP Address & Port จาก Wireless debugging preferences menu (ไม่ใช่ dialog pairing code):
adb connect <IP Address>:<Port>
หลังจากนั้นจะได้ notification บนโทรศัพท์ว่า connected แล้ว
ใช้ ADB: Commands
สมมติ config อุปกรณ์และ development machine ถูกต้อง ใช้ ADB tool ได้แล้ว
ก่อนเริ่ม navigate ไป directory ที่มี adb ด้วย CLI tool (เว้นแต่เพิ่งทำ WiFi debugging steps) ไปทำตอนนี้ หรือดูส่วนก่อนหน้าวิธีหา folder
ดูอุปกรณ์ที่เชื่อมต่อกับ Server อยู่
เริ่ม adb server โดยเรียกคำสั่ง ADB ใดๆ ยกเว้น adb kill-server ไม่ว่า server จะรันอยู่หรือไม่ พิมพ์:
adb devices

ภาพ: เรียก adb devices ตอนโทรศัพท์เชื่อมต่อ server แล้ว kill server ด้วย adb kill-server เรียก devices อีกครั้ง restart server
หาก ADB server ไม่รัน การเรียกคำสั่ง ADB ใดๆ จะ start server กลับมา (ยกเว้น adb kill-server) มี adb start-server صريح แต่ไม่เคยต้องใช้
Server reset devices ไม่คืน items ก่อนไปขั้นตอนต่อไป ต้อง pair และ connect อีกครั้ง (Windows/Linux) ตามส่วนก่อนหน้า
เริ่ม emulator ด้วย PowerShell และ emulator program ใน subdirectory ของ platform-tools ชื่อ "emulator" ใช้ AVD Manager หรือ Android Studio เริ่ม emulator ก็ได้
หากหลาย devices ใช้ option -l กับ adb devices ได้ข้อมูลมากขึ้น

ส่งคำสั่งไปอุปกรณ์เฉพาะ
ไม่ต้องการ brick โทรศัพท์ ส่งคำสั่งไป emulator ใช้ option -s ตามด้วย serial number ของ target device ก่อนคำสั่ง
Serial number คือชุดตัวอักษรแรกที่อธิบาย device หลัง devices command
Serial number ของ emulator คือคำว่า emulator ตามด้วย port ที่ emulator attach อยู่

ลูกศรแดงอีกอันชี้ serial number ของโทรศัพท์ (บล็อคเพื่อความปลอดภัย)
หากมี device เดียว (อะไรก็ตาม) ไม่ต้องใช้ option -s
ติดตั้ง APK (App) บนอุปกรณ์
ติดตั้ง test APK บน emulator ที่รันอยู่ ด้วย adb install
เทียบเท่า Android Studio และ Gradle ติดตั้ง debug APK Test APKs ต้องใช้ option -t หลัง install:
adb -s <device-serial-number> install -t <path-to-APK>

Note: Android OS กำหนด APK ต้องถูกเซ็นก่อนติดตั้ง (แม้ test/debug APK) วิธีหนึ่ง build และ run app ใน Android Studio จะเซ็นด้วย debug certificate ที่สร้างขึ้น มีวิธีเซ็น APK อื่นๆ ดูที่นี่
ADB ทำอะไรได้อีก?
ก่อนดู advanced usage ลอง adb --help คำสั่ง help พิมพ์ documentation อธิบาย commands และ options ของ tool
ยินดีว่า ADB documentation อ่านง่ายและมีประโยชน์ ไม่ใช่ทุก CLI programs
เคล็ดลับการใช้ ADA ขั้นสูง
ครอบคลุมทุก usage และ command ของ ADB ในบทความเดียวเป็นการเสียเวลา
ใช้ ADB ติดตั้ง APK และทำสิ่งที่ Android Studio/Gradle ทำให้ ไม่แนะนำ (เว้นแต่มีเหตุผลดี)
แต่ ADB ทำได้หลายอย่างที่ยากหรือเป็นไปไม่ได้โดยไม่มีมัน
ใน Preliminaries กล่าวว่า ADB ใช้ hook เข้ากับ shell ของ device จบบทความด้วยการใช้ shell commands และหาข้อมูลเพิ่ม
หากไม่รู้ shell คืออะไร อาจข้ามส่วนอธิบายไป
ใช้ ABD Shell
ส่งคำสั่งไป device shell ผ่าน ADB ง่าย หากหลาย devices ใช้ -s <device-serial-number> นำหน้า
ส่ง single shell command ใช้ adb shell ตามด้วยคำสั่งจริงบน device shell:
adb shell ls
Output:

ls แสดงไฟล์และ directories ที่ CLI current directory ซึ่งเป็น root directory ของ Android device จนกว่าจะ cd ไปที่อื่น
หากวางแผนหลาย commands เริ่ม interactive Shell session ด้วย:
adb shell
ใน interactive session พิมพ์ Shell commands โดยตรง ไม่ต้อง adb shell <command> ออกจาก session ด้วย exit หรือ Ctrl+D

มี commands และ utilities หลากหลายผ่าน Shell ActivityManager (am) ของ Android device มีประโยชน์สำหรับทดสอบ components (Activities, Services, BroadcastReceivers) ภายใต้สถานการณ์ต่างๆ
สมมติอยาก launch ตรงเข้า Activity เฉพาะ แต่ Activity นั้นไม่ใช่ launcher Activity ใน manifest
ยังต้องเพิ่ม android:exported="true" attribute ในทุก <activity/> entry ใน manifest ที่อยาก launch (สมมติไม่ใช่ launcher Activity)
ใช้คำสั่ง:
am start -n <app-package-id>/<activity-name>
<activity-name> ต้องรวม packages ที่เกี่ยวข้อง relative to package-id ดู output ตัวอย่าง launch Activity ที่อยู่ในหลาย packages

Further Reading
เป้าหมายคือ introduce, explain, และ guide การใช้ ADB ด้วยคำของตัวเอง (ในขอบเขตที่เป็นไปได้)
จุดนี้จะต้องสร้าง contrived examples หรือ copy documentation ไม่สนใจทำทั้งสอง
แนะนำไปอ่าน documentation และดู cool things ที่ทำได้ด้วย tools เช่น Activity Manager, Package Manager, Policy Manager ฯลฯ
ติดต่อผมได้ที่โซเชียลมีเดีย:
https://www.instagram.com/rkay301/
https://www.facebook.com/wiseassblog/
https://twitter.com/wiseass301
https://wiseassblog.com/