หากเผยแพร่แอปใน Google Play คุณควรสร้างและอัปโหลด Android App Bundle เมื่อคุณเผยแพร่ APK หลายรายการ Google Play จะสร้างและแสดง APK ที่เพิ่มประสิทธิภาพสำหรับการกำหนดค่าอุปกรณ์ของผู้ใช้แต่ละรายโดยอัตโนมัติ เพื่อให้ผู้ใช้ดาวน์โหลดเฉพาะโค้ดและทรัพยากรที่จำเป็นต่อการใช้งานแอปของคุณ การเผยแพร่ APK หลายรายการมีประโยชน์ในกรณีที่คุณไม่ได้เผยแพร่แอปใน Google Play แต่ต้องสร้าง รับรอง และจัดการ APK แต่ละรายการด้วยตนเอง
เมื่อพัฒนาแอปพลิเคชัน Android เพื่อใช้ประโยชน์จาก APK หลายรายการใน Google Play คุณควรใช้แนวทางปฏิบัติแนะนำตั้งแต่เริ่มต้น เพื่อหลีกเลี่ยงปัญหาที่ไม่จำเป็นในกระบวนการพัฒนา บทเรียนนี้จะแสดงวิธีสร้าง APK หลายรายการของแอป โดยแต่ละรายการจะครอบคลุมขนาดหน้าจอระดับต่างๆ นอกจากนี้ คุณยังจะได้รับเครื่องมือที่จําเป็นในการทำให้การดูแลรักษาโค้ดฐาน APK หลายรายการเป็นไปอย่างราบรื่นที่สุด
ยืนยันว่าคุณต้องการ APK หลายรายการ
เมื่อพยายามสร้างแอปพลิเคชันที่ใช้งานได้กับอุปกรณ์ Android หลายขนาด แน่นอนว่าคุณต้องการให้แอปพลิเคชันใช้ประโยชน์จากพื้นที่ว่างทั้งหมดในอุปกรณ์ขนาดใหญ่ได้ โดยไม่เสียความสามารถในการใช้งานร่วมกันหรือความสามารถในการใช้งานบนหน้าจอขนาดเล็ก ในช่วงแรกอาจดูเหมือนว่าการสนับสนุน APK หลายรายการเป็นวิธีแก้ปัญหาที่ดีที่สุด แต่มักไม่เป็นเช่นนั้น ส่วนการใช้ APK เดียวแทนในคู่มือนักพัฒนาแอป APK หลายรายการมีข้อมูลที่เป็นประโยชน์เกี่ยวกับวิธีดำเนินการนี้ด้วย APK เดียว รวมถึงการใช้ไลบรารีการสนับสนุน นอกจากนี้ คุณควรอ่านคำแนะนำเกี่ยวกับการรองรับหน้าจอหลายหน้าจอ และยังมีไลบรารีสนับสนุนที่คุณดาวน์โหลดได้โดยใช้ Android SDK ซึ่งจะช่วยให้คุณใช้ฟragment ในอุปกรณ์รุ่นก่อน Honeycomb ได้ (ทำให้การรองรับหน้าจอหลายหน้าจอใน APK เดียวง่ายขึ้นมาก)
หากจัดการได้ การจำกัดแอปพลิเคชันของคุณไว้ใน APK เดียวมีข้อดีหลายประการ ดังนี้
- การเผยแพร่และการทดสอบทำได้ง่ายขึ้น
- มีฐานโค้ดเพียงฐานเดียวที่ต้องดูแลรักษา
- แอปพลิเคชันสามารถปรับตัวตามการเปลี่ยนแปลงการกำหนดค่าอุปกรณ์
- กู้คืนแอปในอุปกรณ์ต่างๆ ได้
- คุณไม่ต้องกังวลเกี่ยวกับความต้องการของตลาด ลักษณะการทํางานจากการ "อัปเกรด" จาก APK หนึ่งไปยังอีก APK หนึ่ง หรือ APK ใดเหมาะกับอุปกรณ์ระดับใด
ส่วนที่เหลือของบทนี้จะถือว่าคุณได้ค้นคว้าหัวข้อนี้ ศึกษาเนื้อหาในแหล่งข้อมูลที่ลิงก์มาอย่างละเอียด และพิจารณาแล้วว่า APK หลายรายการเป็นเส้นทางที่เหมาะสมสําหรับแอปพลิเคชันของคุณ
จัดทำแผนภูมิข้อกำหนด
เริ่มต้นด้วยการสร้างแผนภูมิง่ายๆ เพื่อระบุจำนวน APK ที่ต้องการและขนาดหน้าจอที่แต่ละ APK รองรับ แต่โชคดีที่การจัดทำแผนภาพข้อกำหนดนั้นทำได้อย่างรวดเร็วและง่ายดาย รวมถึงมีข้อมูลอ้างอิงสำหรับใช้ภายหลัง เริ่มต้นด้วยแถวของเซลล์ที่แสดงขนาดหน้าจอต่างๆ ที่พร้อมใช้งานบนแพลตฟอร์ม Android
เล็ก | ปกติ | ใหญ่ | xlarge |
จากนั้นให้ระบายสีในแผนภูมิโดยให้แต่ละสีแสดง APK ต่อไปนี้คือตัวอย่างวิธีใช้ APK แต่ละรายการกับหน้าจอขนาดหนึ่งๆ
เล็ก | ปกติ | ใหญ่ | xlarge |
คุณอาจมี APK 2 รายการได้เช่นกัน ซึ่งได้แก่ "ขนาดเล็กและอื่นๆ" หรือ "ขนาดใหญ่และอื่นๆ" ทั้งนี้ขึ้นอยู่กับความต้องการ การใส่สีในแผนภูมิยังช่วยให้การสื่อสารภายในทีมง่ายขึ้นด้วย ตอนนี้คุณเรียก APK แต่ละรายการว่า "น้ำเงิน" "เขียว" หรือ "แดง" ได้เลย ไม่ว่าจะครอบคลุมหน้าจอประเภทต่างๆ กี่ประเภทก็ตาม
ใส่โค้ดและทรัพยากรทั่วไปทั้งหมดในโปรเจ็กต์ไลบรารี
ไม่ว่าคุณจะแก้ไขแอปพลิเคชัน Android ที่มีอยู่หรือเริ่มแอปพลิเคชันใหม่ตั้งแต่ต้น การดำเนินการนี้เป็นสิ่งที่ควรทำกับโค้ดเบสเป็นอันดับแรกและสำคัญที่สุด ทุกอย่างที่รวมอยู่ในโปรเจ็กต์ไลบรารีต้องอัปเดตเพียงครั้งเดียว (เช่น สตริงที่แปลเป็นภาษาท้องถิ่น ธีมสี ข้อบกพร่องที่แก้ไขในโค้ดที่แชร์) ซึ่งจะช่วยประหยัดเวลาในการพัฒนาและลดโอกาสที่จะเกิดข้อผิดพลาดที่หลีกเลี่ยงได้ง่ายๆ
หมายเหตุ: แม้ว่ารายละเอียดการใช้งานเกี่ยวกับวิธีสร้างและรวมโปรเจ็กต์ไลบรารีจะอยู่นอกขอบเขตของบทเรียนนี้ แต่คุณสามารถทบทวนข้อมูลได้โดยอ่านหัวข้อสร้างไลบรารี Android
หากคุณแปลงแอปพลิเคชันที่มีอยู่ให้รองรับ APK หลายรายการ ให้ตรวจสอบโค้ดเบสเพื่อหาไฟล์สตริงที่แปลแล้วทุกไฟล์ รายการค่า สีธีม ไอคอนเมนู และเลย์เอาต์ที่จะไม่เปลี่ยนแปลงใน APK ต่างๆ แล้วใส่ข้อมูลทั้งหมดไว้ในโปรเจ็กต์ไลบรารี โค้ดที่จะเปลี่ยนแปลงไม่มากนักควรอยู่ในโปรเจ็กต์ไลบรารีด้วย คุณอาจพบว่าตัวเองขยายคลาสเหล่านี้เพื่อเพิ่มเมธอด 1-2 รายการจาก APK ไปยัง APK
ในทางกลับกัน หากคุณกำลังสร้างแอปพลิเคชันตั้งแต่ต้น ให้พยายามเขียนโค้ดในโปรเจ็กต์ไลบรารีก่อน จากนั้นจึงย้ายโค้ดไปยัง APK แต่ละรายการหากจำเป็น วิธีนี้จัดการได้ง่ายกว่ามากในระยะยาว เมื่อเทียบกับการเพิ่มลงในรายการแรก แล้วเพิ่มในรายการถัดไป แล้วเพิ่มในรายการถัดไปอีก แล้วหลังจากผ่านไปหลายเดือนก็พยายามหาวิธีย้ายข้อมูลบล็อกนี้ไปไว้ในส่วนไลบรารีโดยไม่ทำให้ข้อมูลเสียหาย
สร้างโปรเจ็กต์ APK ใหม่
คุณควรมีโปรเจ็กต์ Android แยกต่างหากสำหรับ APK แต่ละรายการที่จะเผยแพร่ จัดระเบียบโปรเจ็กต์ไลบรารีและโปรเจ็กต์ APK ที่เกี่ยวข้องทั้งหมดไว้ในโฟลเดอร์หลักเดียวกันเพื่อให้จัดระเบียบได้ง่าย นอกจากนี้ โปรดทราบว่า APK แต่ละรายการต้องมีชื่อแพ็กเกจเดียวกัน แม้ว่าจะไม่จำเป็นต้องใช้ชื่อแพ็กเกจเดียวกับไลบรารีก็ตาม หากคุณมี APK 3 รายการตามรูปแบบที่อธิบายไว้ก่อนหน้านี้ ไดเรกทอรีรูทอาจมีลักษณะดังนี้
alexlucas:~/code/multi-apks-root$ ls foo-blue foo-green foo-lib foo-red
เมื่อสร้างโปรเจ็กต์แล้ว ให้เพิ่มโปรเจ็กต์คลังเป็นข้อมูลอ้างอิงสำหรับโปรเจ็กต์ APK แต่ละโปรเจ็กต์ หากเป็นไปได้ ให้กำหนดกิจกรรมเริ่มต้นในโปรเจ็กต์คลัง และขยายกิจกรรมนั้นในโปรเจ็กต์ APK การกําหนดกิจกรรมเริ่มต้นในโปรเจ็กต์ไลบรารีช่วยให้คุณรวมการเริ่มต้นแอปพลิเคชันทั้งหมดไว้ในที่เดียวได้ เพื่อให้แต่ละ APK ไม่จำเป็นต้องใช้งาน "สากล" ซ้ำ เช่น การเริ่มต้น Analytics, การตรวจสอบการอนุญาตให้ใช้สิทธิ และกระบวนการเริ่มต้นอื่นๆ ที่ไม่ได้เปลี่ยนแปลงมากนักจาก APK หนึ่งไปยังอีก APK หนึ่ง
ปรับไฟล์ Manifest
เมื่อผู้ใช้ดาวน์โหลดแอปพลิเคชันที่ใช้ APK หลายรายการผ่าน Google Play ระบบจะเลือก APK ที่ถูกต้องให้ใช้โดยทำตามกฎง่ายๆ 2 ข้อต่อไปนี้
- ไฟล์ Manifest ต้องแสดงให้เห็นว่า APK นั้นๆ มีสิทธิ์
- APK ที่มีหมายเลขเวอร์ชันสูงสุดจะเป็นผู้ชนะ
ตัวอย่างเช่น มาดูชุด APK หลายรายการที่อธิบายไว้ก่อนหน้านี้ และสมมติว่า APK แต่ละรายการได้รับการตั้งค่าให้รองรับหน้าจอทุกขนาดที่ใหญ่กว่าขนาดหน้าจอ "เป้าหมาย" ของแอป เมื่อพิจารณาทีละรายการ ช่วงที่เป็นไปได้ของ APK แต่ละรายการจะมีลักษณะดังนี้
เล็ก | ปกติ | ใหญ่ | xlarge |
เล็ก | ปกติ | ใหญ่ | xlarge |
เล็ก | ปกติ | ใหญ่ | xlarge |
อย่างไรก็ตาม เมื่อใช้กฎ "เวอร์ชันที่สูงกว่าจะชนะ" หากเราตั้งค่าแอตทริบิวต์ versionCode ใน APK แต่ละรายการให้สีแดง ≥ เขียว ≥ น้ำเงิน แผนภูมิจะยุบเหลือเพียงรูปแบบนี้
เล็ก | ปกติ | ใหญ่ | xlarge |
ต่อไป สมมติว่า APK สีแดงมีข้อกำหนดบางอย่างที่อีก 2 รายการไม่มี หน้าตัวกรองใน Google Play ของคู่มือนักพัฒนาแอป Android มีรายการสาเหตุที่เป็นไปได้ทั้งหมด สมมติว่าสีแดงต้องใช้กล้องหน้า อันที่จริง จุดประสงค์ทั้งหมดของ APK สีแดงคือการใช้พื้นที่หน้าจอที่เหลือเพื่อทำสิ่งต่างๆ ที่น่าสนใจด้วยกล้องหน้า แต่ปรากฏว่าอุปกรณ์ขนาดใหญ่บางรุ่นไม่มีกล้องหน้าด้วยซ้ำ น่ากลัวจัง
แต่โชคดีที่หากผู้ใช้เรียกดู Google Play จากอุปกรณ์ดังกล่าว Google Play จะดูไฟล์ Manifest และเห็นว่า Red ระบุกล้องหน้าเป็นข้อกำหนด แล้วจึงละเว้นแอปดังกล่าวโดยปริยาย เนื่องจากพิจารณาแล้วว่า Red กับอุปกรณ์ดังกล่าวไม่เข้ากัน จากนั้นระบบจะเห็นว่า สีเขียวไม่เพียงเข้ากันได้กับอุปกรณ์ขนาดใหญ่เท่านั้น แต่ยังเข้ากันได้กับอุปกรณ์ที่มีหรือไม่มีกล้องหน้า ผู้ใช้ยังคงดาวน์โหลดแอปจาก Google Play ได้ เนื่องจากแม้จะเกิดเหตุการณ์ไม่คาดคิดกับกล้องหน้า แต่ยังมี APK ที่รองรับขนาดหน้าจอดังกล่าว
คุณต้องมีรูปแบบโค้ดเวอร์ชันที่ดีเพื่อให้ APK ทั้งหมดอยู่ใน "แทร็ก" แยกกัน รหัสที่แนะนําจะอยู่ในส่วนรหัสเวอร์ชันของคู่มือนักพัฒนาแอป เนื่องจากชุด APK ตัวอย่างจัดการกับมิติข้อมูลได้เพียง 1 ใน 3 รายการเท่านั้น การแยก APK แต่ละรายการด้วย 1, 000 แล้วเพิ่มจากค่านั้นจึงเพียงพอแล้ว ซึ่งอาจมีลักษณะดังนี้
น้ำเงิน: 1001, 1002, 1003, 1004...
สีเขียว: 2001, 2002, 2003, 2004...
สีแดง:3001, 3002, 3003, 3004...
เมื่อรวมทั้งหมดเข้าด้วยกันไฟล์ Manifest ของ Android ของคุณอาจมีลักษณะดังนี้
สีน้ำเงิน:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1001" android:versionName="1.0" package="com.example.foo"> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" /> ...
สีเขียว:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="2001" android:versionName="1.0" package="com.example.foo"> <supports-screens android:smallScreens="false" android:normalScreens="false" android:largeScreens="true" android:xlargeScreens="true" /> ...
สีแดง:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="3001" android:versionName="1.0" package="com.example.foo"> <supports-screens android:smallScreens="false" android:normalScreens="false" android:largeScreens="false" android:xlargeScreens="true" /> ...
โปรดทราบว่าในทางเทคนิคแล้ว APK หลายรายการจะใช้ได้กับแท็ก supports-screens หรือแท็ก compatible-screens โดยทั่วไปแล้ว เราขอแนะนำให้ใช้ Supports-screens และโดยทั่วไปแล้วการใช้ทั้ง 2 แท็กในไฟล์ Manifest เดียวกันนั้นเป็นสิ่งที่ไม่ควรทำอย่างยิ่ง เนื่องจากจะทำให้เกิดความซับซ้อนโดยไม่จำเป็นและเพิ่มโอกาสที่จะเกิดข้อผิดพลาด นอกจากนี้ โปรดทราบว่าไฟล์ Manifest จะตั้งค่าสำหรับขนาดหน้าจอแต่ละขนาดอย่างชัดเจนแทนที่จะใช้ประโยชน์จากค่าเริ่มต้น (small และ normal จะถือเป็น True โดยค่าเริ่มต้นเสมอ) วิธีนี้จะช่วยคุณประหยัดเวลาและลดความยุ่งยากในภายหลัง เช่น ไฟล์ Manifest ที่มี SDK เป้าหมายน้อยกว่า 9 จะมีการตั้งค่า xlarge เป็นเท็จโดยอัตโนมัติ เนื่องจากยังไม่มีขนาดดังกล่าว ดังนั้นโปรดระบุข้อมูลอย่างชัดเจน
ตรวจสอบรายการตรวจสอบก่อนการเปิดตัว
โปรดตรวจสอบรายการต่อไปนี้อีกครั้งก่อนอัปโหลดไปยัง Google Play โปรดทราบว่ารายการเหล่านี้เกี่ยวข้องกับ APK หลายรายการโดยเฉพาะ และไม่ได้แสดงรายการตรวจสอบที่สมบูรณ์สำหรับแอปพลิเคชันทั้งหมดที่อัปโหลดไปยัง Google Play
- APK ทั้งหมดต้องมีชื่อแพ็กเกจเดียวกัน
- APK ทั้งหมดต้องลงชื่อด้วยใบรับรองเดียวกัน
- ตั้งค่าขนาดหน้าจอทุกขนาดที่คุณต้องการให้ APK รองรับเป็น "จริง" ในไฟล์ Manifest ขนาดหน้าจอทุกขนาดที่คุณต้องการหลีกเลี่ยง ให้ตั้งค่าเป็นเท็จ
- ตรวจสอบตัวกรองไฟล์ Manifest อีกครั้งเพื่อหาข้อมูลที่ขัดแย้งกัน (APK ที่รองรับเฉพาะ Cupcake ในหน้าจอขนาดใหญ่พิเศษจะไม่มีใครเห็น)
- ไฟล์ Manifest ของ APK แต่ละไฟล์ต้องไม่ซ้ำกันสำหรับหน้าจอ พื้นผิว OpenGL หรือเวอร์ชันแพลตฟอร์มที่รองรับอย่างน้อย 1 รายการ
- ลองทดสอบ APK แต่ละรายการในอุปกรณ์อย่างน้อย 1 เครื่อง แต่คุณมีโปรแกรมจำลองอุปกรณ์ที่ปรับแต่งได้มากที่สุดแห่งหนึ่งในธุรกิจอยู่ในเครื่องสำหรับพัฒนาซอฟต์แวร์ สนุกได้เลย
นอกจากนี้ คุณควรตรวจสอบ APK ที่คอมไพล์แล้วก่อนเผยแพร่เพื่อให้แน่ใจว่าไม่มีสิ่งใดที่อาจซ่อนแอปพลิเคชันของคุณใน Google Play ซึ่งจริงๆ แล้วไม่ซับซ้อนเลยเมื่อใช้เครื่องมือ "aapt" Aapt (Android Asset Packaging Tool) เป็นส่วนหนึ่งของกระบวนการสร้างสำหรับการสร้างและแพ็กเกจแอปพลิเคชัน Android และเป็นเครื่องมือที่มีประโยชน์มากในการตรวจสอบแอปพลิเคชัน
>aapt dump badging package: name='com.example.hello' versionCode='1' versionName='1.0' sdkVersion:'11' uses-permission:'android.permission.SEND_SMS' application-label:'Hello' application-icon-120:'res/drawable-ldpi/icon.png' application-icon-160:'res/drawable-mdpi/icon.png' application-icon-240:'res/drawable-hdpi/icon.png' application: label='Hello' icon='res/drawable-mdpi/icon.png' launchable-activity: name='com.example.hello.HelloActivity' label='Hello' icon='' uses-feature:'android.hardware.telephony' uses-feature:'android.hardware.touchscreen' main supports-screens: 'xlarge' supports-any-density: 'true' locales: '--_--' densities: '120' '160' '240'
เมื่อตรวจสอบเอาต์พุต aapt ให้ตรวจสอบว่าคุณไม่มีค่าที่ขัดแย้งกันสำหรับ supports-screens และ compatible-screens และไม่มีค่า "uses-feature" ที่ไม่ได้ตั้งใจซึ่งเพิ่มเข้ามาเนื่องจากสิทธิ์ที่คุณกำหนดไว้ในไฟล์ Manifest ในตัวอย่างข้างต้น APK จะมองไม่เห็นในอุปกรณ์ส่วนใหญ่หรือทั้งหมด
เหตุผล การเพิ่มสิทธิ์ที่จำเป็น SEND_SMS จะเพิ่มข้อกำหนดฟีเจอร์ของ android.hardware.telephony โดยปริยาย เนื่องจากอุปกรณ์ขนาดใหญ่ส่วนใหญ่ (หากไม่ใช่ทั้งหมด) เป็นแท็บเล็ตที่ไม่มีฮาร์ดแวร์โทรศัพท์ Google Play จะกรอง APK นี้ออกในกรณีเหล่านี้จนกว่าจะมีอุปกรณ์ในอนาคตที่ทั้งมีขนาดใหญ่พอที่จะรายงานเป็นหน้าจอขนาดใหญ่ และมีฮาร์ดแวร์โทรศัพท์
แต่โชคดีที่ปัญหานี้แก้ไขได้ง่ายๆ โดยการเพิ่มข้อมูลต่อไปนี้ลงในไฟล์ Manifest
<uses-feature android:name="android.hardware.telephony" android:required="false" />
ระบบจะเพิ่มข้อกําหนด android.hardware.touchscreen
โดยนัยด้วย หากต้องการให้ APK แสดงในทีวีที่ไม่ใช่อุปกรณ์หน้าจอสัมผัส คุณควรเพิ่มข้อมูลต่อไปนี้ลงในไฟล์ Manifest
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
เมื่อทำตามรายการตรวจสอบก่อนการเปิดตัวเรียบร้อยแล้ว ให้อัปโหลด APK ไปยัง Google Play ระบบอาจใช้เวลาสักครู่เพื่อให้แอปพลิเคชันปรากฏขึ้นเมื่อเรียกดู Google Play แต่เมื่อปรากฏแล้ว ให้ทำการตรวจสอบครั้งสุดท้าย ดาวน์โหลดแอปพลิเคชันลงในอุปกรณ์ทดสอบที่คุณอาจต้องใช้เพื่อให้แน่ใจว่า APK กำหนดเป้าหมายไปยังอุปกรณ์ที่ต้องการ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเผยแพร่ APK หลายรายการใน Google Play ได้ที่หัวข้อการรองรับ APK หลายรายการ