Android App Bundle — ตอนที่ 2 สิ่งที่ควรรู้ในการใช้งาน Android App Bundle
เจ้าของบล็อกได้เกริ่นเรื่องราวและการทำงานเบื้องหลังของ Android App Bundle กันไปแล้ว ในบทความนี้จะมาดูกันว่ามีอะไรบ้างที่นักพัฒนาต้องรู้บ้าง เพื่อให้ให้แอปสามารถรองรับ Android App Bundle ได้อย่างสบายใจ
บทความในซีรีย์เดียวกัน
- Android App Bundle — ตอนที่ 1 รู้จักความสามารถและเบื้องหลังในการทำงาน
- Android App Bundle — ตอนที่ 2 สิ่งที่ควรรู้ในการใช้งาน Android App Bundle
Build แบบ Android App Bundle ต้องทำยังไง?
Android Studio
การ Build เป็น AAB ใน Android Studio จะเหมือนกับ APK เลย โดยจะมีเมนู AAB อยู่คู่กับ APK เสมอ
สำหรับ Debug Build ให้เลือกไปที่ Build > Build Bundle(s) / APK(s) > Build Bundle(s)
แต่ถ้าเป็น Release Build ให้เลือกไปที่ Build > Generate Signed Bundle / APK…
แล้วจะมีหน้าต่างแสดงขึ้นมา ให้เลือกเป็น Android App Bundle
Gradle ผ่าน Command Line
ถ้าต้องการ Build ผ่าน Gradle โดยสั่งจาก Command Line โดยตรงก็สามารถใช้คำสั่ง
// Debug Build
./gradlew bundleDebug
// Release Build
./gradlew bundleRelease
และแน่นอนว่าการ Build แบบ AAB ก็ยังคงต้องใช้ Keystore สำหรับ App Signing เหมือนเดิม
App Signing สำหรับ Android App Bundle
เพราะว่านักพัฒนาจะต้อง Build แบบ AAB และนำไฟล์ที่ได้ไปอัปโหลดขึ้น Google Play เพื่อที่จะนำไป Build เป็น APK อีกที
ดังนั้นการใช้ Android App Bundle จะต้องเปิดใช้งาน Google Play App Signing ด้วย
โดยนักพัฒนาจะต้อง Build แบบ AAB โดยใช้ Upload Key ที่ได้มาจาก Google Play App Signing เพื่ออัปโหลดขึ้น Google Play แล้วเวลาที่ Google Play ทำการ Build เป็น APK ให้ผู้ใช้ก็จะใช้ App Signing Key ที่ Google Play ถือไว้อยู่แล้วนั่นเอง
ทดสอบแอปที่เป็น Android App Bundle ด้วย Bundletool
อย่างที่รู้กันว่าแอปที่ Build แบบ AAB จะได้ออกมาเป็นไฟล์ .aab ซึ่งไม่สามารถนำไปติดตั้งลงในเครื่องโดยตรงได้ (เพราะเป็น Publishing Format นั่นเอง) และถึงแม้ว่านักพัฒนาจะสามารถกดติดตั้งแอปจาก Android Studio ได้โดยตรง แต่นั่นก็เป็นการ Build แบบ APK
ดังนั้นเพื่อให้มั่นใจว่าแอปสามารถทำงานได้จริง ก็ต้องทดสอบกับ AAB โดยตรง ซึ่งทีมพัฒนาของ Google ก็ได้เตรียมเครื่องมือที่ชื่อว่า Bundletool เพื่อใช้ในการทดสอบแอปที่เป็น AAB ให้ด้วย
สามารถดาวน์โหลดได้ที่ Bundletool [GitHub]
และถ้าผู้ที่หลงเข้ามาอ่านใช้ Mac OS หรือ Linux ก็สามารถติดตั้งผ่าน Homebrew ได้เลย
brew install bundletool
โดย Bundletool เป็นเครื่องมือที่ทำงานผ่าน Command Line เท่านั้นนะ
แสดงข้อมูล Device Specification Profile ของอุปกรณ์แอนดรอยด์
อย่างที่รู้กันว่า Google Play ต้องรู้ก่อนว่า Device Specification Profile ของเครื่องที่จะติดตั้งแอปมีค่าเป็นอะไรบ้าง และนักพัฒนาก็สามารถใช้ Bundletool เพื่อดึงข้อมูลดังกล่าวจากอุปกรณ์แอนดรอยด์ออกมาดูได้เหมือนกัน โดยใช้คำสั่ง
bundletool get-device-spec --output=<DEVICE_SPEC_FILENAME>.json
คำสั่งดังกล่าวจะดึง Device Specification Profile จากอุปกรณ์แอนดรอยด์ที่เชื่อมต่อผ่าน ADB ออกมาเป็น JSON โดยข้อมูลจะมีหน้าตาประมาณนี้
{
"supportedAbis": ["arm64-v8a", "armeabi-v7a", "armeabi"],
"supportedLocales": ["en-US", "th-TH"],
"deviceFeatures": ["reqGlEsVersion=0x30002", "android.hardware.audio.low_latency", "android.hardware.audio.output", ...],
"glExtensions": ["GL_OES_EGL_image", "GL_OES_EGL_image_external", "GL_OES_EGL_sync", "GL_OES_vertex_half_float", ...],
"screenDensity": 440,
"sdkVersion": 29
}
ตัวอย่าง JSON ข้างบนนี้เป็นของ Google Pixel 4
การสร้าง APKS จาก AAB
สามารถใช้ Bundletool เพื่อสร้าง APKS จาก AAB และติดตั้งลงในอุปกรณ์แอนดรอยด์ที่ต่อผ่าน ADB โดยอัตโนมัติ ด้วยคำสั่งแบบนี้
bundletool build-apks --connected-device
--bundle=<AAB_FILENAME>.aab
--output=<OUTPUT_FILENAME>.apks
การกำหนด --connected-device
เข้าไปด้วย จะทำให้ Bundletool ดึง Device Specification Profile จากอุปกรณ์แอนดรอยด์เครื่องนั้น แล้วสร้าง APKS ไว้ใน Path ที่กำหนดใน --output
แล้วทำการติดตั้งลงในเครื่องให้ทันที
แต่ถ้าต้องการสร้าง APKS จาก Device Specification Profile ก็เปลี่ยนมาใช้คำสั่งแบบนี้แทน
bundletool build-apks --device-spec=<DEVICE_SPEC_FILENAME>.json
--bundle=<AAB_FILENAME>.aab
--output=<OUTPUT_FILENAME>.apks
ซึ่ง Device Specification Profile จะต้องอยู่ในรูปของ JSON นั่นเอง
โดยทั้ง 2 คำสั่งนี้จะเป็นการสร้าง APKS โดยใช้ Debug Keystore ที่อยู่ในเครื่องของผู้ที่หลงเข้ามาอ่าน และ APKS ที่ได้ก็จะเป็นแบบ Debug Build
ดังนั้นถ้าต้องการใช้ Signed Keystore เพื่อสร้าง APKS แบบ Release Build ก็ให้เพิ่มค่าต่างๆเข้าไปในคำสั่งดังนี้
bundletool build-apks --device-spec=<DEVICE_SPEC_FILENAME>.json
--bundle=<AAB_FILENAME>.aab
--output=<OUTPUT_FILENAME>.apks
--ks=<KEYSTORE_PATH>
--ks-pass=pass:<KEYSTORE_PASSWORD>
--ks-key-alias=<KEY_ALIAS>
--key-pass=pass:<KEY_PASSWORD>
ซึ่งนักพัฒนาจะต้องกำหนด Path ของ Keystore, Password ของ Keystore, Key Alias และ Key Password เหมือนกับการ Build แบบ APK นั่นเอง
การติดตั้ง APKS ลงในอุปกรณ์แอนดรอยด์
เพราะ APKS ไม่สามารถติดตั้งลงในอุปกรณ์แอนดรอยด์ด้วยคำสั่งใน ADB ได้ จะต้องสั่งผ่าน Bundletool ด้วยคำสั่งแบบนี้แทน
bundletool install-apks --apks <APP_FILENAME>.apks
คำนวณขนาดไฟล์ของ APKS ในตอนดาวน์โหลด
Bundletool สามารถใช้คำนวณได้ว่าถ้าผู้ใช้ดาวน์โหลดไฟล์ของ APKS จะมีขนาดเท่าไร โดยใช้คำสั่ง
bundletool get-size total --apks=<APP_FILENAME>.apks
และถ้าแอปนั้นรองรับ Google Play Instant ด้วย ก็สามารถทดสอบขนาดไฟล์สำหรับ Google Play Instant ด้วยคำสั่ง
bundletool get-size total --apks=<APP_FILENAME>.apks --instant
ทั้งนี้ก็เพราะว่า Google Play จำกัดขนาดไฟล์ APKS ที่ผู้ใช้จะต้องดาวน์โหลด
ข้อจำกัดสำหรับขนาดไฟล์ของ Android App Bundle
แอปที่เป็น Android App Bundle จะต้องมีขนาดไฟล์ APKS ไม่เกิน 150 MB นั่นหมายความว่า AAB สามารถมีขนาดใหญ่กว่านั้นได้ แต่เมื่อ Google Play ทำการ Build เป็น APKS เพื่อให้ผู้ใช้ดาวน์โหลด จะต้องมีขนาดไม่เกิน 150 MB
จึงต้องมี Bundletool เพื่อใช้ในการทดสอบนั่นเอง
เปลี่ยนจาก APK มาใช้ Android App Bundle กันเถอะ
สำหรับแอปทั่วๆไปนั้นสามารถเปลี่ยนจาก APK มาใช้ AAB กันได้เลย เพราะในตอนนี้ Android Studio รองรับการเปลี่ยนมาใช้ AAB ได้ง่ายมาก แทบจะไม่ต้องทำอะไรเพิ่มเติมเลย
แต่ถ้าคิดว่าแอปของผู้ที่หลงเข้ามาอ่านนั้นมีการทำงานที่ซับซ้อนและกังวลว่าอาจจะเกิดปัญหาเมื่อใช้ AAB ได้ ก็แนะนำให้ใช้ Bundletool เพื่อทดสอบกับแอปก่อน
และถ้าเป็นแอปเคยอัปโหลดขึ้น Google Play มาก่อน แล้วต้องการอัปเดตเวอร์ชันใหม่ที่เป็น AAB แทน เพียงแค่เปิดใช้งาน Google Play App Signing แล้วเปลี่ยน Build แบบ AAB ด้วย Upload Key แทน ก็สามารถอัปเดตแอปจากตัวเก่าได้อย่างไร้รอยต่อ
สำหรับบทความหน้าเจ้าของบล็อกจะพาไปดูกันว่า On-demand Dynamic Feature หรือ Dynamic Feature Delivery ที่เป็นความสามารถเด็ดของ Android App Bundle นั้นใช้งานยังไง จะต้องทำอะไรกับโปรเจคบ้าง รออ่านในตอนต่อไปนะครับ (ถ้ามีเวลาเขียนนะ)