การสร้าง APK หลายรายการสำหรับพื้นผิว GL ที่แตกต่างกัน

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

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

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

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

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

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

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

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

คู่มือนักพัฒนาซอฟต์แวร์ Android มีเอกสารอ้างอิงที่เป็นประโยชน์เกี่ยวกับพื้นผิวที่สนับสนุนโดยทั่วไปใน support-gl-texture หน้านี้ยังมีคำแนะนำว่าโทรศัพท์รุ่นใด (หรือรุ่นโทรศัพท์) รุ่นใดบ้างที่รองรับ รูปแบบพื้นผิวที่เฉพาะเจาะจง โปรดทราบว่าโดยทั่วไปเป็นความคิดที่ดีที่ APK รายการหนึ่งของคุณรองรับ ETC1 เนื่องจากรูปแบบพื้นผิวนั้นมีการสนับสนุนโดยอุปกรณ์ที่ใช้ Android ทั้งหมดซึ่งสนับสนุน OpenGL ES ข้อกำหนด 2.0

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

ETC1 ATI โหมด VR

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

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

ไม่ว่าคุณจะปรับเปลี่ยนแอปพลิเคชัน 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 ที่จะใช้นั้นได้รับเลือกโดยใช้กฎง่ายๆ ต่อไปนี้

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

สำหรับพื้นผิว GL กฎข้อสุดท้ายมีความสำคัญ ซึ่งหมายความว่า เช่น ใช้ความระมัดระวังมากเกี่ยวกับการใช้รูปแบบ GL ที่แตกต่างกันในแอปพลิเคชันเดียวกัน หากคุณ เคยใช้ PowerVR 99% ของเวลาทั้งหมด แต่ให้ใช้ ETC1 แทนหน้าจอแนะนำ... จากนั้นไฟล์ Manifest จะต้องระบุการรองรับทั้ง 2 รูปแบบ อุปกรณ์ที่รองรับ ETC1 เท่านั้น จะถือว่าใช้งานร่วมกันได้ แอปของคุณจะดาวน์โหลด และผู้ใช้จะเห็นข้อขัดข้องที่น่าตื่นเต้น ข้อความ กรณีทั่วไปก็คือ หากคุณใช้ APK หลายรายการเพื่อกำหนดเป้าหมาย บนอุปกรณ์ต่างๆ โดยขึ้นอยู่กับการรองรับพื้นผิว GL โมเดลจะเป็นรูปแบบพื้นผิว 1 รูปแบบต่อ APK

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

ยกตัวอย่างเช่น ลองใช้อุปกรณ์สัก 2-3 อย่าง แล้วดูจำนวน APK ที่กำหนดไว้ก่อนหน้านี้ซึ่งเหมาะกับแต่ละอุปกรณ์ อุปกรณ์

FooPhone Nexus S อีโว
ETC1 ETC1 ETC1
โหมด VR ATI TC

สมมติว่ารูปแบบ PowerVR และ ATI เป็นที่ต้องการมากกว่า ETC1 เมื่อมีให้ใช้งานมากกว่า จากข้อมูลของ "จำนวนเวอร์ชันสูงสุดที่ชนะ" ถ้าเราตั้งค่าแอตทริบิวต์ versionCode ใน APK แต่ละรายการ นั่นคือสีแดง ≥ สีเขียว ≥ สีน้ำเงิน ระบบจะเลือกทั้งสีแดงและสีเขียวมากกว่าสีน้ำเงินเสมอ อุปกรณ์ที่รองรับการใช้งานของคุณ และหากอุปกรณ์มีรุ่นที่รองรับทั้งสีแดงและสีเขียว สีแดงจะถูกเลือก

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

น้ำเงิน: 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-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
    ...

สีเขียว:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_AMD_compressed_ATC_texture" />
    ...

สีแดง:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_IMG_texture_compression_pvrtc" />
    ...

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

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

  • APK ทั้งหมดต้องมีชื่อแพ็กเกจเดียวกัน
  • APK ทั้งหมดต้องรับรองด้วยใบรับรองเดียวกัน
  • ตรวจสอบตัวกรองไฟล์ Manifest อีกครั้งเพื่อหาข้อมูลที่ขัดแย้งกัน (APK ที่รองรับเฉพาะ ไม่มีใครเห็นคัพเค้กบนหน้าจอ XLARGE เลย)
  • ไฟล์ Manifest ของ APK แต่ละรายการต้องไม่ซ้ำกันในหน้าจอที่รองรับ พื้นผิว OpenGL หรือ เวอร์ชันแพลตฟอร์ม
  • ลองทดสอบ 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: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

เมื่อคุณตรวจสอบเอาต์พุต aapt อย่าลืมตรวจสอบว่าไม่มีค่าที่ขัดแย้งกัน รองรับหน้าจอและหน้าจอที่เข้ากันได้ และคุณไม่มี "used-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 กำหนดเป้าหมายไปยังอุปกรณ์ที่ต้องการ ขอแสดงความยินดี ทุกอย่างเรียบร้อยแล้ว