สร้าง APK หลายรายการสำหรับ API ระดับต่างๆ

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

เมื่อพัฒนาแอปพลิเคชัน Android เพื่อใช้ประโยชน์จาก APK หลายรายการบน Google Play ก็เป็นสิ่งสำคัญที่จะใช้แนวทางปฏิบัติที่ดีตั้งแต่เริ่มต้น และป้องกันอาการปวดศีรษะโดยไม่จำเป็น ต่อไปในกระบวนการพัฒนา บทเรียนนี้แสดงวิธีสร้าง APK หลายรายการ โดยแต่ละแอปจะครอบคลุมระดับ API ต่างๆ กันไปเล็กน้อย และคุณยังจะได้รับเครื่องมือบางอย่างด้วย จำเป็นต่อการทำให้การดูแลรักษาโค้ดเบส APK หลายรายการเป็นไปอย่างราบรื่นที่สุด

ยืนยันว่าคุณต้องมี APK หลายรายการ

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

หากคุณสามารถจัดการได้ การจำกัดแอปพลิเคชันของคุณให้อยู่ใน APK เดียวมีหลายประเภท ข้อดี ได้แก่

  • การเผยแพร่และการทดสอบทำได้ง่ายขึ้น
  • มีฐานของโค้ดเพียงค่าเดียวที่ต้องบำรุงรักษา
  • แอปพลิเคชันของคุณสามารถปรับให้เข้ากับการเปลี่ยนแปลงการกำหนดค่าอุปกรณ์
  • การคืนค่าแอปในอุปกรณ์ต่างๆ ใช้งานได้ปกติ
  • หมดห่วงเรื่องความชื่นชอบของตลาด พฤติกรรมจาก "การอัปเกรด" จาก APK หนึ่งไปยัง ถัดไป หรือ APK ใดไปกับอุปกรณ์ระดับใด

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

ทำแผนภูมิข้อกำหนดของคุณ

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

ในการสร้างแผนภูมิ APK หลายรายการ ให้เริ่มต้นด้วยแถวเซลล์ที่แสดง API ระดับต่างๆ ของแพลตฟอร์ม Android ใส่เซลล์เกินลงไปที่ท้ายเพื่อแสดงถึงอนาคต เวอร์ชัน Android

3 4 5 6 7 8 9 10 11 12 13 +

ตอนนี้มีเพียงสีในแผนภูมิให้แต่ละสีแสดงถึง APK ลองดูตัวอย่างว่า คุณสามารถใช้ APK แต่ละรายการกับ API บางระดับได้

3 4 5 6 7 8 9 10 11 12 13 +

เมื่อสร้างแผนภูมินี้แล้ว ให้แจกจ่ายให้กับทีม การสื่อสารของทีมในโปรเจ็กต์ ทำได้ง่ายขึ้นทันที เพราะแทนที่จะถามว่า "APK สำหรับ API ระดับ 3-6 เป็นยังไงบ้าง คุณ Android 1.x one เป็นอย่างไรบ้าง" แค่พูดว่า " APK สีน้ำเงินเป็นอย่างไร ไปด้วยกัน"

ใส่โค้ดและทรัพยากรทั่วไปทั้งหมดไว้ในโปรเจ็กต์ไลบรารี

ไม่ว่าคุณจะปรับเปลี่ยนแอปพลิเคชัน Android ที่มีอยู่ หรือเริ่มต้นแอปพลิเคชันใหม่ตั้งแต่ต้น สิ่งแรกที่คุณควรทำกับฐานของโค้ด และสิ่งสำคัญที่สุดคือ ทุกอย่าง ที่อยู่ในโครงการห้องสมุดต้องอัปเดตเพียงครั้งเดียว (เช่น สตริงที่แปลเป็นภาษาท้องถิ่น ธีมสี ข้อบกพร่องที่แก้ไขแล้วในโค้ดที่แชร์) ซึ่งจะช่วยลดเวลาในการพัฒนาและลด ข้อผิดพลาดต่างๆ ที่สามารถหลีกเลี่ยงได้ง่ายๆ

หมายเหตุ: แม้ว่ารายละเอียดการใช้งานเกี่ยวกับวิธีสร้างและ รวมโครงการห้องสมุดอยู่นอกเหนือขอบเขตของบทเรียนนี้ คุณสามารถเรียนรู้ได้อย่างรวดเร็ว โดยอ่านสร้างไลบรารี Android

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

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

สร้างโปรเจ็กต์ APK ใหม่

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

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

เมื่อสร้างโปรเจ็กต์แล้ว ให้เพิ่มโปรเจ็กต์ไลบรารีเป็นการอ้างอิงไปยังโปรเจ็กต์ APK แต่ละโปรเจ็กต์ ถ้า ให้กำหนดกิจกรรมเริ่มต้นในโปรเจ็กต์ไลบรารี และขยายกิจกรรมนั้นใน APK ของคุณ การมีการกำหนดกิจกรรมเริ่มต้นในโครงการห้องสมุดทำให้คุณสามารถใส่ การเริ่มต้นแอปพลิเคชันของคุณในที่เดียว เพื่อให้ APK แต่ละรายการไม่ต้อง การนำ "Universal" มาใช้ใหม่ เช่น การเริ่มต้น Analytics การตรวจสอบการอนุญาตให้ใช้สิทธิ ขั้นตอนการเริ่มต้นใช้งานที่ไม่ค่อยมีการเปลี่ยนแปลงจาก APK ไปเป็น APK

ปรับไฟล์ Manifest

เมื่อผู้ใช้ดาวน์โหลดแอปพลิเคชันที่ใช้ APK หลายรายการผ่าน Google Play APK ที่จะใช้นั้นได้รับเลือกโดยใช้กฎง่ายๆ 2 ข้อดังนี้

  • ไฟล์ Manifest ต้องแสดงให้เห็นว่า APK ดังกล่าวมีสิทธิ์
  • จาก APK ที่มีสิทธิ์ จำนวนเวอร์ชันสูงสุดจะชนะ

ตัวอย่างเช่น เรามาลองชุด APK หลายรายการที่อธิบายไว้ก่อนหน้านี้ และสมมติว่าเราไม่ได้ กำหนดระดับ API สูงสุดสำหรับ APK ใดก็ได้ จากการพิจารณาแต่ละรายการ ช่วงที่เป็นไปได้ของ APK แต่ละรายการ ซึ่งจะมีลักษณะดังนี้

3 4 5 6 7 8 9 10 11 12 13 +
3 4 5 6 7 8 9 10 11 12 13 +
3 4 5 6 7 8 9 10 11 12 13 +

เนื่องจาก APK ที่มี minSdkVersion สูงกว่าจะต้องมี ที่สูงขึ้น เรารู้ว่าค่าของ versionCode สูงกว่า คือ สีแดง ≥ เขียว ≥ สีน้ำเงิน ดังนั้น เราจึงสามารถยุบแผนภูมิให้มีลักษณะดังนี้

3 4 5 6 7 8 9 10 11 12 13 +

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

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

คุณต้องมีรหัสเวอร์ชันที่ดีเพื่อให้ APK ทั้งหมดของคุณอยู่ใน "แทร็ก" แยกกัน สคีม เวอร์ชันที่แนะนำนั้นอยู่ที่บริเวณรหัสเวอร์ชันของ คู่มือนักพัฒนาซอฟต์แวร์ของเรา เนื่องจากชุด APK ตัวอย่างมีการจัดการกับ 1 ใน 3 ที่เป็นไปได้เท่านั้น ให้แบ่งแต่ละ APK ด้วย 1000 ได้โดยตั้งค่าตัวเลขสองหลักแรกเป็น minSdkVersion สำหรับ APK นั้นๆ และเพิ่มจากตรงนั้น ซึ่งอาจมีลักษณะดังนี้

น้ำเงิน: 03001, 03002, 03003, 03004...
เขียว: 07001, 07002, 07003, 07004...
แดง:11001, 11002, 11003, 11004...

เมื่อนำทั้งหมดนี้มารวมกัน ไฟล์ Manifest ของ Android ก็น่าจะมีลักษณะดังต่อไปนี้

สีน้ำเงิน:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="03001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    ...

สีเขียว:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="07001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="7" />
    ...

สีแดง:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="11001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="11" />
    ...

ตรวจสอบเช็กลิสต์ก่อนการเปิดตัว

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

  • APK ทั้งหมดต้องมีชื่อแพ็กเกจเดียวกัน
  • APK ทั้งหมดต้องรับรองด้วยใบรับรองเดียวกัน
  • หาก APK ทับซ้อนกันในเวอร์ชันแพลตฟอร์ม รายการที่มี minSdkVersion สูงกว่าต้องมีรหัสเวอร์ชันที่สูงกว่า
  • ตรวจสอบตัวกรองในไฟล์ Manifest อีกครั้งเพื่อหาข้อมูลที่ขัดแย้งกัน (APK ที่รองรับเฉพาะคัพเค้กในหน้าจอ XLARGE จะไม่เห็นไม่มีใครเห็น)
  • ไฟล์ Manifest ของ APK แต่ละรายการต้องไม่ซ้ำกันในหน้าจอ พื้นผิว openGL หรือเวอร์ชันแพลตฟอร์มที่รองรับอย่างน้อย 1 รายการ
  • ลองทดสอบ APK แต่ละรายการบนอุปกรณ์อย่างน้อย 1 เครื่อง นอกเสียจากว่า คุณมีโปรแกรมจำลองอุปกรณ์ที่ปรับแต่งได้มากที่สุดตัวหนึ่งในธุรกิจที่อยู่ในเครื่องการพัฒนาของคุณ สุดๆ ไปเลย

นอกจากนี้ควรตรวจสอบ APK ที่คอมไพล์แล้วก่อนนำเข้าสู่ตลาด เพื่อให้แน่ใจว่าไม่ได้มี ที่อาจซ่อนแอปพลิเคชันของคุณบน Google Play ได้ วิธีนี้ค่อนข้างง่ายด้วยการใช้ "aapt" ของ Google Aapt (เครื่องมือแพ็กเกจเนื้อหา Android) เป็นส่วนหนึ่งของกระบวนการสร้างสำหรับการสร้างและ ทำแพ็กเกจแอปพลิเคชัน 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: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

เมื่อคุณตรวจสอบเอาต์พุต aapt อย่าลืมตรวจสอบว่าไม่มีค่าที่ขัดแย้งกัน รองรับหน้าจอและหน้าจอที่เข้ากันได้ และคุณไม่มี "used-feature" โดยไม่ตั้งใจ ค่า ที่เพิ่มเข้ามาอันเป็นผลมาจากสิทธิ์ที่คุณตั้งค่าไว้ในไฟล์ Manifest ในตัวอย่างข้างต้น APK จะไม่เปิดเผยต่ออุปกรณ์จำนวนมาก

เหตุผล การเพิ่มสิทธิ์ที่จำเป็น SEND_SMS ทำให้ได้เพิ่มข้อกำหนดด้านฟีเจอร์ของ android.hardware.telephony โดยปริยาย เนื่องจาก API 11 คือ Honeycomb (เวอร์ชันที่เพิ่มประสิทธิภาพของ Android โดยเฉพาะสำหรับแท็บเล็ต) และไม่มีอุปกรณ์ Honeycomb ที่มีฮาร์ดแวร์สำหรับโทรศัพท์ Google Play จะกรอง APK นี้ออกในทุกกรณี จนกว่าอุปกรณ์ในอนาคตจะมีระดับ API ที่สูงกว่าและมีฮาร์ดแวร์โทรศัพท์

โชคดีที่ปัญหานี้แก้ไขได้ง่ายๆ ด้วยการเพิ่มค่าต่อไปนี้ลงในไฟล์ 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 กำหนดเป้าหมายไปยังอุปกรณ์ที่ต้องการ ขอแสดงความยินดี ทุกอย่างเรียบร้อยแล้ว