เคยกันมั้ยเวลาอยากจะลงแอปที่ไม่สามารถโหลดจาก Google Play ได้ (ด้วยปัญหาบางอย่าง) เลยต้องใช้วิธี Sideload แทน นั่นก็คือการไปหาไฟล์ APK จากที่อื่นมาติดตั้งลงในเครื่องด้วยตัวเอง แล้วพบว่าแอปใช้งานไม่ได้ ทั้งๆที่ไฟล์ APK ก็เอามาจากเครื่องอื่นที่ใช้งานได้ปกตินี่นาาาาา

ไฟล์เสีย? ระบบป้องกันการติดตั้งแอปเถื่อน? จริงๆแล้วปัญหานี้อาจจะเกิดจากความสามารถที่เรียกว่า Split APKs ก็ได้นะ

ผมก็เป็นคนหนึ่งที่มีปัญหาว่าในบางครั้งไม่สามารถลงแอปบางตัวจาก Google Play ได้โดยตรง บ้างก็เป็นเพราะแอปไม่เปิดให้โหลดในประเทศไทย หรืออยากจะติดตั้งแอปลงใน Android TV แต่แอปที่อยู่บน Google Play บอกว่าไม่รองรับ  ก็เลยต้องหาทางไปโหลด APK จากที่ต่างๆ ไม่ว่าจะดาวน์โหลดจากเว็ปที่แจกไฟล์ APK หรือว่าก๊อปไฟล์จาก APK ในเครื่องที่มีแอปอยู่แล้วก็ตาม เพื่อเอาไปติดตั้งในเครื่องที่เราต้องการ

แต่กลับพบว่ามีบางแอพที่เราเอา APK มาติดตั้งไม่ได้ หรือติดตั้งได้ แต่ไม่สามารถใช้งานได้ ยกตัวอย่างเช่น Twitter

ทำไมโหลด APK ของ Twitter มาลงในเครื่องแล้วใช้ไม่ได้ล่ะ!?

หารู้หรือไม่ว่าปัญหาแบบนี้อาจจะมีต้นเหตุมาจากการที่นักพัฒนาของแอปนั้นๆใช้ Android App Bundle เพื่อให้ Google Play ทำเป็น Configuration APKs ก็ได้นะ

 

ยาวไปไม่อ่าน ขอสั้นๆได้มั้ย

ระบบแอนดรอยด์ตั้งแต่ Android 5.0 Lollipop ขึ้นไป แอป 1 ตัวสามารถมีไฟล์​ APK ในเครื่องได้มากกว่า 1 ไฟล์ (เรียกว่า Configuration APKs) โดยมี Base APK ที่เก็บข้อมูลหลักของแอปไว้ ซึ่งเป็น APK หลักที่ขาดไปไม่ได้ และ Configuration APK ที่เก็บข้อมูลที่แยกตามสเปคของเครื่อง (สถาปัตยกรรม CPU, ขนาดหน้าจอ และภาษาในเครื่อง) เช่น Configuration APK ตัวนึงเก็บข้อความที่ใช้ในแอปเฉพาะภาษาอังกฤษ อีกตัวเก็บข้อความเฉพาะภาษาไทย (ซึ่งทั้งคู่เป็น Configuration APK เหมือนกัน แต่เก็บข้อมูลคนละชุดกัน) และสามารถนำ Configuration APK ทั้งคู่มารวมกับ Base APK เพื่อติดตั้งเป็นแอปในเครื่องได้

จึงทำให้ทีมพัฒนาของ Google สร้างสิ่งที่เรียกว่า Android App Bundle ขึ้นมาเพื่อให้ Google Play สามารถเตรียม APK ไว้หลายๆชุดได้ และเวลาผู้ใช้ดาวน์โหลดไปติดตั้งลงในเครื่องก็จะโหลดเฉพาะ APK อันที่จำเป็นเท่านั้น จึงทำให้ในเครื่องที่ติดตั้งแอปแบบนี้จะมี APK ของแอปนั้นๆหลายตัว และถ้าดึงไฟล์ APK แค่ไฟล์เดียวเพื่อไปติดตั้งบนเครื่องอื่นก็จะทำให้แอปมีข้อมูลไม่สมบูรณ์ หรืออีกเครื่องต้องการข้อมูลจาก APK คนละชุดกัน จึงทำให้เกิดปัญหาแอปใช้งานไม่ได้

แต่ถ้าอยากรู้รายละเอียดทั้งหมดนี้ อ่านต่อข้างล่างได้เลย

 

Configuration APKs?

ก่อนจะพูดถึง Configuration APKs ขอพูดถึง APK ในทุกวันนี้ที่ติดตั้งลงในอุปกรณ์แอนดรอยด์ของเรากันก่อนดีกว่า เพื่อให้เข้าใจที่มาของ Configuration APKs และปัญหาที่เกิดขึ้นได้ง่ายขึ้น

อย่างที่เรารู้กันว่าแอปที่จะทำงานในระบบปฏิบัติการณ์แอนดรอยด์ได้นั้นจะต้องเป็นไฟล์ที่เรียกว่า APK โดยใน APK จะประกอบไปด้วยไฟล์ที่สำคัญประมาณนี้

โครงสร้างข้อมูลพื้นฐานของ APK

  • DEX : ไฟล์ที่เก็บข้อมูลคำสั่งหรือโค้ดที่นักพัฒนาได้เขียนไว้
  • Resource : ทรัพยากรต่างๆที่ใช้ภายในแอป เช่น ภาพ, ฟอนต์, ข้อความ หรือสี เป็นต้น
  • Native Library คือข้อมูลคำสั่งระดับ Native ที่จะต้องแยกการทำงานตามสถาปัตยกรรม CPU ของเครื่องนั้นๆ
  • Asset : ทรัพยากรต่างๆที่ใช้ภายในแอป เช่น ข้อมูลจำพวก 3D Graphic Asset เป็นต้น
  • Manifest : ไฟล์ที่ระบุข้อมูลของแอปนั้นๆ เช่น ชื่อแอป, Permission ที่จะใช้งานในแอป หรือเวอร์ชันแอป เป็นต้น

โดยที่ Resource และ Native Library นั้นจะมีการแยกไฟล์ให้รองรับกับอุปกรณ์แอนดรอยด์ที่มีความแตกต่างกันด้วย ไม่ว่าจะเป็นความคมชัดของหน้าจอ (Density) หรือข้อความสำหรับแต่ละภาษา

เพื่อให้เห็นภาพมากขึ้น ลองดูภาพข้างล่างที่เป็นข้อมูลบางส่วนที่อยู่ใน Resource และ Native Library ครับ

จะเห็นว่านักพัฒนาแอปจะต้องแยกข้อมูลบางอย่างให้เหมาะสมกับแต่ละเครื่องด้วย เพื่อให้รองรับกับอุปกรณ์แอนดรอยด์ของผู้ใช้แต่ละคนให้ได้มากที่สุดเท่าที่ทำได้

ในขณะเดียวกัน เมื่อนักพัฒนาต้องเตรียมข้อมูลไว้เยอะขนาดนี้ จึงทำให้เวลาผู้ใช้ติดตั้ง APK แบบเดิมๆก็ต้องลงแอปที่มีขนาดใหญ่เกินจำเป็น ทั้งๆที่เครื่องของแต่ละคนใช้ข้อมูลแต่บางอันเท่านั้น

ยกตัวอย่างเช่น ผมใช้ Pixel 4 ข้อมูลของ Resource และ Native Library ที่อยู่ใน APK ที่จะถูกเรียกใช้งานก็จะมีดังนี้

จะมีข้อมูลแค่บางส่วนเท่านั้นที่ถูกเรียกใช้งานใน Pixel 4

จะเห็นว่ามีข้อมูลบางส่วนที่ไม่จำเป็นสำหรับ Pixel 4 เลย โดยที่ข้อมูลเหล่านี้ก็ไม่ได้มีขนาดน้อยๆเลยนะ

เปลืองพื้นที่ไปถึง 49.1 mb ให้กับข้อมูลที่ไม่จำเป็นที่อยู่ในแอปที่เราใช้งานอยู่

เพื่อแก้ปัญหานี้จึงทำให้ทีมพัฒนาของ Google ได้สร้างสิ่งที่เรียกว่า Android App Bundle เพื่อช่วยให้นักพัฒนาทำงานได้ง่ายขึ้นนั่นเอง

 

Android App Bundle คืออะไร?

จริงๆแล้ว Android App Bundle มีความสำคัญกับนักพัฒนาแอปเท่านั้น และผู้ใช้ทั่วไปไม่จำเป็นต้องรู้เรื่องนี้เลยซักนิด

ซึ่งผู้ใช้ทั่วไปที่ว่าเนี่ย คือคนที่ติดตั้งแอปจาก Google Play ตามปกติน่ะนะ… ดังนั้นเพื่อให้เข้าใจว่าทำไมการติดตั้ง APK เองถึงเกิดปัญหาได้ จึงจำเป็นต้องเข้าใจการทำงานของ Android App Bundle นั่นเอง

เพื่อช่วยแก้ปัญหา APK มีขนาดใหญ่เกินจำเป็น เพราะปกติแล้วนักพัฒนาต้องเป็นคนสร้าง APK เอง แล้วส่งขึ้น Google Play เอง จึงทำให้ทีมพัฒนาของ Google สร้าง Publishing Format แบบใหม่ที่เรียกว่า Android App Bundle (AAB) เพื่อใช้แทน APK เพื่อให้นักพัฒนาส่งให้ Google Play แล้วเวลาที่ผู้ใช้กดดาวน์โหลดแอป ทาง Google Play ก็จะนำไฟล์นั้นไปสร้างเป็น APK สำหรับแต่ละเครื่องแทน

การส่งแอปขึ้น Google Play ด้วย Android App Bundle (แบบง่ายๆ)

แต่อุปกรณ์แอนดรอยด์ทั่วโลกนั้นมีเป็นหมื่นรุ่น ถ้า Google Play จะเตรียม APK ไว้ให้ครบทั้งหมดทุกรุ่น ข้อมูลก็คงล้นเซิฟเวอร์กันพอดี ดังนั้น Google Play จึงไม่ได้สร้าง APK เตรียมไว้ให้กับอุปกรณ์แอนดรอยด์แต่ละรุ่นโดยตรง แต่ใช้วิธีแบ่งข้อมูลไว้ใน APK เป็นหลายๆชุด โดยแยกตาม Configuration ที่สำคัญแทน

Google Play จะนำ AAB มาสร้างเป็น APKS ซึ่งข้างในประกอบไปด้วย APK หลายๆไฟล์

และการสร้าง APK แบบนี้จะเรียกกันว่า Configuration APKs

ดังนั้นแอปที่รองรับ Android App Bundle จะถูก Google Play สร้างเป็นไฟล์ APK ไว้หลายๆไฟล์โดยแยกตาม Configuration ที่สามารถเป็นไปได้ แล้วจะรวมเฉพาะ APK ที่จำเป็นให้กลายเป็น APKS แล้วส่งให้เครื่องนั้นๆดาวน์โหลดแทน

เอ๋!? เดี๋ยวนะ APKS มันคืออะไร? ต่างจาก APK ยังไง? แล้วมันติดตั้งลงในเครื่องได้ยังไง?

ทั้งหมดนี้อยู่ในความสามารถของแอนดรอยด์ที่เรียกว่า Split APKs

 

ความสามารถ Split APKs ที่มีมาตั้งแต่ Android 5.0 Lollipop

ในสมัยที่ระบบแอนดรอยด์เปลี่ยน Runtime จาก Dalvik เป็น ART นั้น ทำให้แอนดรอยด์สามารถติดตั้ง APK หลายๆตัวสำหรับ 1 แอปได้ โดยที่ APK แต่ละตัวจะเก็บข้อมูลคนละส่วนกัน

APK ที่อยู่ใน APKS เมื่อติดตั้งลงใน Pixel 4

โดยจะแบ่ง APK เป็น 2 ประเภทด้วยกันคือ Base APK ซึ่งจะมีแค่ตัวเดียวเท่านั้น และเป็น APK หลักที่เก็บข้อมูลที่ไม่จำเป็นต้องแยก และอีกประเภทคือ Configuration APK ซึ่งสามารถมีได้หลายตัว และแบ่งออกเป็นหลายๆ APK เพื่อแยกข้อมูลออกตามปัจจัยต่างๆเพื่อนำไปติดตั้ง

ถึงแม้ว่าจะมีการแบ่งประเภทก็ตาม ที่สิ่งที่เราเห็นก็คือเป็นไฟล์​ .apk เหมือน APK ทั่วๆไปเลย (ต้องดูไฟล์ที่อยู่ข้างในถึงจะรู้)

แต่ทั้งนี้ Split APKs ไม่ใช่ความสามารถที่ผู้ใช้ทั่วไปจะเข้าถึงได้ซักเท่าไร เพราะ APK ที่สามารถรวมเป็น APKS ได้นั้น ไม่ได้หาดาวน์โหลดได้ทั่วไป เพราะ Google Play เป็นคนสร้างขึ้นมา และเวลาติดตั้งลงในเครื่องก็เอา APK ที่อยู่ใน APKS มาติดตั้งลงในเครื่องทันที

ลองเช็ค APK ของแอป Twitter ที่อยู่ในเครื่องด้วย Android Debug Bridge (ADB) ก็จะเห็นว่าติดตั้งไว้ในเครื่องมากกว่า 1 ตัว เพราะว่าทีมพัฒนาของ Twitter ใช้ Android App Bundle นั่นเอง

และแน่นอนว่าถ้าขาด APK ไปบางตัว ก็จะไม่สามารถใช้งานแอปได้เลย

 

APK ตัวเดียวอาจจะไม่เพียงพอต่อการลงแอปอีกต่อไป

แหล่งดาวน์โหลด APK จะใช้วิธีดึง APK จากเครื่องที่ติดตั้งแอปนั้นๆ โดยใช้ ADB เพื่อดึงไฟล์ base.apk ออกมา แล้วนำไปอัปโหลดขึ้นเว็ปเพื่อแจกจ่ายต่อไป นั่นหมายความว่าถ้าใช้วิธีแบบนี้กับแอปที่เป็น Android App Bundle ก็จะได้แค่ไฟล์ base.apk ที่เป็น Base APK เท่านั้น ยังขาด Configuration APK อีกหลายๆตัวที่ทำให้แอปสามารถทำงานได้ (ทำให้เปิดแอปปุปแล้วแอปเด้งทันทีนั่นเอง 😢)

และสำหรับอุปกรณ์แอนดรอยด์ที่ผ่านการรับรองจาก Google (Google-certified device) และเป็น Android 10 ขึ้นไป การติดตั้ง APK ที่เป็น Android App Bundle แค่บาง APK (มีแค่ Base APK) จะติดตั้งไม่ผ่านทันที

ไม่สามารถติดตั้ง APK ที่เป็น Base APK ของ Twitter บน Pixel 3 (Android 10) ได้

โดยอ้างอิงจากเอกสารของ Android App Bundle ในเว็ป Android Developers ซึ่งเป็นเว็ปอย่างเป็นทางการสำหรับนักพัฒนาแอนดรอยด์จาก Google

กล่าวไว้ใน https://developer.android.com/guide/app-bundle#known_issues

นั่นหมายความว่าถ้าเครื่องของคุณเป็น Android 10 ขึ้นไป และติดตั้ง APK จากแอปที่เป็น Android App Bundle ทั้งๆที่ APK ไม่ครบสมบูรณ์ได้ล่ะก็…

นี่อาจจะเป็นหนึ่งในวิธีตรวจสอบว่า “เครื่องของเราเป็นอุปกรณ์ที่ผ่านการรับรองจาก Google หรือไม่” ก็ได้นะ

 

มีวิธีไหนที่ทำให้เราสามารถนำ APK แบบนี้ ไปติดตั้งในอีกเครื่องได้มั้ย?

จริงๆก็มีวิธีนะ และเป็นวิธีที่ง่ายมากๆด้วย เนื่องจาก Split APKs เป็นความสามารถของแอนดรอยด์ตั้งแต่แรก ไม่ได้ผูกขาดอะไรกับ Google Play เลยซักนิด ดังนั้นนักพัฒนาจึงสามารถสร้างแอปเพื่อดึงและติดตั้งแอปที่เป็น Split APKs ได้

และ 1 ในนั้นก็คือแอปที่ชื่อว่า Split APKs Installer (SAI)

Split APKs Installer (SAI)
Split APKs Installer (SAI)

ซึ่งแอปดังกล่าวจะช่วยให้เราสามารถดึง APK ของแอปที่ต้องการออกมาได้ทั้งหมด แล้วติดตั้ง APK ทั้งหมดลงในเครื่องได้

ตัวอย่างแอป Split APKs Installer (SAI) ที่สามารถ Export และติดตั้งแอปที่เป็น Split APKs ได้

และที่สำคัญ วิธีนี้จะใช้ได้ผลก็ต่อเมื่อ เครื่องต้นทางและเครื่องปลายทางนั้นมีสเปคที่ใกล้เคียงกัน

นั่นก็เพราะว่า Google Play จะสร้าง APK โดยแยกตาม Configuration ดังนี้

 

ปัจจัยที่ส่งผลต่อการสร้าง Configuration APKs ใน Google Play

  • CPU Architecture : สถาปัตยกรรมของ CPU ในเครื่องนั้นๆ เช่น ARM 64-bit, ARM 32-bit, x86 64-bit หรือ x86 32-bit เป็นต้น
  • Screen Density : ความคมชัดของหน้าจอเครื่องนั้นๆ : เช่น MDPI, HDPI, XHDPI, XXHDPI หรือ XXXHDPI เป็นต้น
  • Device Language : ภาษาที่กำหนดไว้ใน Settings ของเครื่องนั้นๆ เช่น ภาษาไทย ภาษาอังกฤษ​ หรือภาษาญี่ปุ่น เป็นต้น โดยผู้ใช้สามารถเลือกได้มากกว่า 1 ภาษา

ปัจจัยที่มีผลมากที่สุดและอาจจะทำให้แอปใช้งานไม่ได้เลย ก็คือ CPU Architecture หรือสถาปัตยกรรมของ CPU เพราะถ้าเครื่องต้นทางและปลายทางใช้ CPU คนละสถาปัตยกรรม จะทำให้ Split APKs ใช้งานร่วมกันไม่ได้ เช่น เครื่องต้นทางใช้เป็น ARM 64-bit แต่เครื่องปลายทางเป็น ARM 32-bit เป็นต้น

ปัจจัยรองลงมาจะยังใช้งานแอปได้อยู่ แต่อาจจะแสดงหน้าจอเพี้ยน นั่นก็คือ Screen Density หรือความคมชัดของหน้าจอ เพราะถ้าเครื่องต้นทางและปลายทางมีความคมชัดหน้าจอไม่เหมือนกัน จะทำให้ภาพที่ใช้แสดงในแอปมีขนาดผิดเพี้ยนได้เป็นบางครั้ง ซึ่งถ้าเครื่องต้นทางและปลายทางเป็นมือถือแอนดรอยด์เหมือนกันก็จะไม่ค่อยเจอปัญหานี้ แต่ถ้าเครื่องต้นทางเป็นมือถือแอนดรอยด์และเครื่องปลายทางเป็นแทบเล็ต ก็มีโอกาสที่ภาพในแอปจะเพี้ยนได้

ส่วนภาษาที่จะแสดงภายในแอปนั้น โดยปกตินักพัฒนาจะนิยมกำหนดให้แสดงเป็นภาษาอังกฤษเป็นภาษาพื้นฐาน จึงมักจะไม่ค่อยเจอปัญหาภาษาที่ไม่ตรงกันซักเท่าไร

 

แอปไหนบ้างบน Google Play ที่เปลี่ยนมาใช้ Android App Bundle กันแล้ว?

ในปัจจุบันนี้หลายๆแอปต่างพากันเปลี่ยนมาใช้ Android App Bundle กันมากขึ้นเรื่อยๆ รวมไปถึงแอปยอดนิยมหลายๆตัวอย่าง YouTube, Gmail, LINE, Facebook, Twitter, Netflix, Spotify และอื่นๆอีกมากมาย รวมไปถึงแอปหลายๆตัวในประเทศไทยด้วย

เหล่าแอปที่เปลี่ยนมาใช้ Android App Bundle เป็นกลุ่มแรกสุด โดยมีตัวเลขกำกับอยู่ข้างบนซึ่งหมายถึงเปอร์เซ็นต์ของขนาดแอปที่ลดลงไปจากการเปลี่ยนมาใช้ Android App Bundle

และแอปที่ยังไม่ได้เปลี่ยนมาใช้เป็น Android App Bundle ก็จะเป็นแอปจำพวกเกมซะส่วนใหญ่

 

แล้ว Android App Store อื่นๆ รองรับ Android App Bundle มั้ย?

เท่าที่รู้คือ Galaxy Store (ของ Samsung) และ AppGallery (ของ Huawei) ยังไม่รองรับ Android App Bundle นะ ดังนั้นแอปที่อยู่ในนี้จะเป็น Universal APK หรือก็คือเป็น APK แบบปกตินั่นเอง

แต่ Android App Bundle ก็ไม่ใช่ความลับทางการค้าของ Google แต่อย่างใด เพราะนักพัฒนาแอปก็สามารถใช้งานและเรียนรู้การทำงานในส่วนนี้ได้ทั้งหมด ดังนั้น Android App Store อื่นๆก็อาจจะรองรับ Android App Bundle ในอนาคตก็เป็นได้

 

สรุป

จริงๆแล้ว Split APKs และ Android App Bundle เป็นสิ่งที่ทีมพัฒนาแอนดรอยด์ของ Google ได้สร้างขึ้นมาเพื่อช่วยอำนวยความสะดวกให้กับนักพัฒนา และเพิ่มลูกเล่นต่างๆให้กับระบบแอนดรอยด์ (เช่น แอปสามารถดาวน์โหลดฟีเจอร์เพิ่มทีหลังได้โดยไม่ต้องอัปเดตแอปใหม่) เพื่อทำให้ระบบแอนดรอยด์นั้นตอบโจทย์กับผู้ใช้ทั่วไปมากขึ้น

จึงทำให้ APK ในปัจจุบันนั้นมีการทำงานที่ซับซ้อนมากขึ้น (สำหรับผู้ใช้ทั่วไป) และส่งผลต่อผู้ใช้ที่ต้องการลงแอปด้วยการนำ APK มาติดตั้งลงในเครื่องนั่นเอง

 

ภาคผนวกสำหรับคำศัพท์ที่ใช้ในบทความนี้

Configuration APKs เป็นวิธีการสร้าง APK หลายๆไฟล์ ซึ่งแบ่งประเภทของ APK เป็น Base APK และ Configuration APK

Base APK เป็น APK หลักของ Configuration APKs ที่แอปจะขาดไปไม่ได้ เพราะประกอบไปด้วยชุดคำสั่งสำคัญที่ทำให้แอปสามารถทำงานได้ ใน Configuration APKs จะมี Base APK แค่เพียงตัวเดียวเท่านั้น

Configuration APK เป็น APK ที่เก็บเฉพาะข้อมูล (ไม่ใช่ชุดคำสั่ง) ที่จะใช้ในแอป โดยแยกตาม Configuration ที่สำคัญของแอนดรอยด์ ใน Configuration APKs จะมี Configuration APK ได้มากกว่า 1 ตัว ขึ้นอยู่กับเครื่องที่ติดตั้งแอปนั้นๆ

Configuration ปัจจัยหลักที่ทำให้อุปกรณ์แอนดรอยด์แต่ละเครื่องแตกต่างกัน ซึ่งในบทความนี้จะประกอบไปด้วย สถาปัตยกรรม CPU ของเครื่องนั้นๆ (CPU ABI), ความคมชัดของหน้าจอ (Density) และภาษาที่ตั้งไว้ในเครื่อง (Locale)

Split APKs ความสามารถที่เพิ่มเข้ามาใน Android 5.0 Lollipop เพื่อให้อุปกรณ์แอนดรอยด์สามารถติดตั้ง APK ได้มากกว่า 1 ตัว โดยที่ APK เหล่านั้นจะต้องมีการทำงานที่สอดคล้องกัน

Android App Bundle รูปแบบไฟล์ที่นักพัฒนาแอปแอนดรอยด์ส่งขึ้น Google Play เพื่อแปลงเป็น Configuration APKs

APKS เป็นไฟล์ที่มี APK อยู่ข้างในหลายๆไฟล์ที่สร้างแบบ Configuration APKs ที่มักจะลงได้เฉพาะเครื่องที่มี Configuration ตรงกันเท่านั้น