11 April 2020

Android App Bundle - ตอนที่ 2 สิ่งที่ควรรู้ในการใช้งาน Android App Bundle

Updated on

เจ้าของบล็อกได้เกริ่นเรื่องราวและการทำงานเบื้องหลังของ 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 นั้นใช้งานยังไง จะต้องทำอะไรกับโปรเจคบ้าง รออ่านในตอนต่อไปนะครับ (ถ้ามีเวลาเขียนนะ)