ลดขนาดแอป

ผู้ใช้มักหลีกเลี่ยงการดาวน์โหลดแอปที่มีขนาดใหญ่เกินไป โดยเฉพาะในตลาดเกิดใหม่ซึ่งอุปกรณ์เชื่อมต่อกับเครือข่าย 2G และ 3G ที่ไม่เสถียร หรือใช้งานแผนการที่มีขีดจำกัดข้อมูล หน้านี้อธิบายวิธีลดขนาดการดาวน์โหลดของแอป ซึ่งจะช่วยให้ผู้ใช้ดาวน์โหลดแอปของคุณได้มากขึ้น

อัปโหลดแอปด้วย Android App Bundle

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

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

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

ทําความเข้าใจโครงสร้าง APK

ก่อนที่จะลดขนาดของแอป คุณควรทำความเข้าใจโครงสร้าง APK ของแอป ไฟล์ APK ประกอบด้วยไฟล์ ZIP ที่มีไฟล์ทั้งหมดที่ประกอบกันเป็นแอปของคุณ ซึ่งรวมถึงไฟล์คลาส Java, ไฟล์ทรัพยากร และไฟล์ที่มีทรัพยากรที่คอมไพล์แล้ว

APK มีไดเรกทอรีต่อไปนี้

  • META-INF/: มีไฟล์ลายเซ็น CERT.SF และ CERT.RSA รวมถึงไฟล์ Manifest MANIFEST.MF
  • assets/: มีชิ้นงานของแอป ซึ่งแอปจะเรียกข้อมูลได้โดยใช้ออบเจ็กต์ AssetManager
  • res/: มีทรัพยากรที่ไม่ได้คอมไพล์เป็น resources.arsc
  • lib/: มีโค้ดที่คอมไพล์แล้วซึ่งเจาะจงสำหรับเลเยอร์ซอฟต์แวร์ของโปรเซสเซอร์ ไดเรกทอรีนี้มีไดเรกทอรีย่อยสำหรับแพลตฟอร์มแต่ละประเภท เช่น armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 และ mips

APK ยังมีไฟล์ต่อไปนี้ด้วย เฉพาะ AndroidManifest.xml เท่านั้นที่บังคับ:

  • resources.arsc: มีทรัพยากรที่คอมไพล์แล้ว ไฟล์นี้มีเนื้อหา XML จากการกำหนดค่าทั้งหมดของโฟลเดอร์ res/values/ เครื่องมือสร้างแพ็กเกจจะแยกเนื้อหา XML นี้ออกมา แล้วคอมไพล์เป็นไบนารี และเก็บเนื้อหาไว้ เนื้อหานี้ประกอบด้วยสตริงและสไตล์ภาษา รวมถึงเส้นทางไปยังเนื้อหาที่ไม่ได้รวมอยู่ในไฟล์ resources.arsc โดยตรง เช่น ไฟล์เลย์เอาต์และรูปภาพ
  • classes.dex: มีคลาสที่คอมไพล์ในรูปแบบไฟล์ DEX ที่เครื่องเสมือน Dalvik หรือ ART เข้าใจ
  • AndroidManifest.xml: มีไฟล์ Manifest หลักของ Android ไฟล์นี้จะแสดงชื่อ เวอร์ชัน สิทธิ์เข้าถึง และไฟล์ไลบรารีที่อ้างอิงของแอป โดยไฟล์จะใช้รูปแบบ XML แบบไบนารีของ Android

ลดจํานวนขนาดทรัพยากร

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

นำทรัพยากรที่ไม่ได้ใช้ออก

เครื่องมือ lint ซึ่งเป็นเครื่องมือวิเคราะห์โค้ดแบบคงที่ที่รวมอยู่ใน Android Studio จะตรวจหาทรัพยากรในโฟลเดอร์ res/ ที่ไม่ได้อ้างอิงโดยโค้ด เมื่อเครื่องมือ lint พบทรัพยากรที่อาจไม่ได้ใช้ในโปรเจ็กต์ ระบบจะพิมพ์ข้อความดังตัวอย่างต่อไปนี้

res/layout/preferences.xml: Warning: The resource R.layout.preferences appears
    to be unused [UnusedResources]

ไลบรารีที่คุณเพิ่มลงในโค้ดอาจมีทรัพยากรที่ไม่ได้ใช้ Gradle สามารถนําทรัพยากรออกในนามของคุณโดยอัตโนมัติได้หากเปิดใช้ shrinkResources ในไฟล์ build.gradle.kts ของแอป

Kotlin

android {
    // Other settings.

    buildTypes {
        getByName("release") {
            minifyEnabled = true
            shrinkResources = true
            proguardFiles(getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro")
        }
    }
}

Groovy

android {
    // Other settings.

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

หากต้องการใช้ shrinkResources ให้เปิดใช้การย่อโค้ด ในระหว่างกระบวนการสร้าง R8 จะนําโค้ดที่ไม่ได้ใช้ออกก่อน จากนั้นปลั๊กอิน Android Gradle จะนําทรัพยากรที่ไม่ได้ใช้ออก

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

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

ลดการใช้ทรัพยากรจากคลัง

เมื่อพัฒนาแอป Android คุณมักจะใช้ไลบรารีภายนอกเพื่อปรับปรุงความสามารถในการใช้งานและความอเนกประสงค์ของแอป ตัวอย่างเช่น คุณอาจอ้างอิง AndroidX เพื่อปรับปรุงประสบการณ์ของผู้ใช้บนอุปกรณ์รุ่นเก่า หรือจะใช้ Google Play Services เพื่อดึงข้อมูลการแปลข้อความภายในแอปโดยอัตโนมัติก็ได้

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

การถอดรหัสรูปภาพเคลื่อนไหวเนทีฟ

ใน Android 12 (API ระดับ 31) เราได้ขยาย API ของ NDK ImageDecoder เพื่อถอดรหัสเฟรมและข้อมูลเวลาทั้งหมดจากรูปภาพที่ใช้รูปแบบไฟล์ GIF แบบเคลื่อนไหวและ WebP แบบเคลื่อนไหว

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

ดูรายละเอียดเพิ่มเติมเกี่ยวกับ ImageDecoder API ได้ที่ API reference และตัวอย่างเกี่ยวกับ GitHub

รองรับเฉพาะความหนาแน่นที่เจาะจง

Android รองรับความหนาแน่นของหน้าจอที่ต่างกัน เช่น ต่อไปนี้

  • ldpi
  • mdpi
  • tvdpi
  • hdpi
  • xhdpi
  • xxhdpi
  • xxxhdpi

แม้ว่า Android จะรองรับความหนาแน่นข้างต้น แต่คุณไม่จำเป็นต้องส่งออกชิ้นงานที่แรสเตอร์ไปยังความหนาแน่นแต่ละแบบ

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

หากแอปต้องใช้รูปภาพที่ปรับขนาดเท่านั้น คุณจะประหยัดพื้นที่ได้มากขึ้นด้วยการใช้รูปภาพใน drawable-nodpi/ เพียงรูปแบบเดียว เราขอแนะนำให้ใส่รูปแบบรูปภาพอย่างน้อย xxhdpi รูปแบบในแอป

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความหนาแน่นของหน้าจอ โปรดดูขนาดและความหนาแน่นของหน้าจอ

ใช้ออบเจ็กต์ที่วาดได้

รูปภาพบางรายการไม่จำเป็นต้องมีทรัพยากรรูปภาพนิ่ง เฟรมเวิร์กสามารถวาดรูปภาพแบบไดนามิกขณะรันไทม์แทนได้ ออบเจ็กต์ Drawable หรือ <shape> ใน XML อาจใช้พื้นที่ใน APK เพียงเล็กน้อย นอกจากนี้ ออบเจกต์ XML Drawable ยังสร้างรูปภาพโมโนโครมที่เป็นไปตามหลักเกณฑ์ของ Material Design

ใช้ทรัพยากรซ้ำ

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

Android มียูทิลิตีมากมายในการเปลี่ยนสีของเนื้อหา โดยใช้แอตทริบิวต์ android:tint และ tintMode

นอกจากนี้ คุณยังละเว้นทรัพยากรที่เหมือนกับทรัพยากรอื่นเพียงแค่หมุนเท่านั้นได้ด้วย ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างการเปลี่ยน "ชอบ" เป็น "ไม่ชอบ" โดยหมุนที่ตรงกลางรูปภาพและบิด 180 องศา

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_thumb_up"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromDegrees="180" />

แสดงผลจากโค้ด

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

บีบอัดไฟล์ PNG

เครื่องมือ aapt สามารถเพิ่มประสิทธิภาพทรัพยากรรูปภาพที่วางไว้ใน res/drawable/ ด้วยการบีบอัดแบบไม่สูญเสียคุณภาพในระหว่างกระบวนการสร้าง เช่น เครื่องมือ aapt สามารถแปลง PNG แบบสีจริงที่ไม่ต้องการมากกว่า 256 สีให้เป็น PNG 8 บิตที่มีชุดสี ซึ่งจะทำให้รูปภาพมีคุณภาพเท่าเดิมแต่ใช้พื้นที่หน่วยความจำน้อยลง

aapt มีข้อจํากัดต่อไปนี้

  • เครื่องมือ aapt จะไม่ลดขนาดไฟล์ PNG ที่มีอยู่ในโฟลเดอร์ asset/
  • ไฟล์ภาพต้องใช้สีไม่เกิน 256 สีเพื่อให้เครื่องมือ aapt เพิ่มประสิทธิภาพได้
  • เครื่องมือ aapt อาจทำให้ไฟล์ PNG ที่บีบอัดแล้วมีขนาดใหญ่ขึ้น หากต้องการป้องกันปัญหานี้ คุณสามารถใช้ Flag isCrunchPngs เพื่อปิดใช้กระบวนการนี้สำหรับไฟล์ PNG ได้โดยทำดังนี้
  • Kotlin

        buildTypes.all { isCrunchPngs = false }
        

    ดึงดูด

        buildTypes.all { isCrunchPngs = false }
        

บีบอัดไฟล์ PNG และ JPEG

คุณลดขนาดไฟล์ PNG ได้โดยไม่สูญเสียคุณภาพของรูปภาพโดยใช้เครื่องมืออย่าง pngcrush, pngquant หรือ zopflipng เครื่องมือเหล่านี้ทั้งหมดสามารถลดขนาดไฟล์ PNG ขณะเดียวกันก็คงคุณภาพของรูปภาพให้เหมือนเดิม

เครื่องมือ pngcrush มีประสิทธิภาพมาก เครื่องมือนี้จะทำซ้ำตัวกรอง PNG และพารามิเตอร์ zlib (Deflate) โดยใช้ฟิลเตอร์และพารามิเตอร์แต่ละชุดร่วมกันในการบีบอัดรูปภาพ จากนั้นระบบจะเลือกการกำหนดค่าที่ให้เอาต์พุตที่บีบอัดแล้วมีขนาดเล็กที่สุด

หากต้องการบีบอัดไฟล์ JPEG คุณสามารถใช้เครื่องมืออย่าง packJPG และ guetzli

ใช้รูปแบบไฟล์ WebP

คุณใช้รูปแบบไฟล์ WebP สำหรับรูปภาพแทนไฟล์ PNG หรือ JPEG ได้ด้วย รูปแบบ WebP มีการบีบอัดแบบสูญเสียบางส่วนและโปร่งใส เช่น JPG และ PNG และสามารถบีบอัดได้ดีกว่า JPEG หรือ PNG

คุณสามารถแปลงรูปภาพ BMP, JPG, PNG หรือ GIF แบบคงที่ที่มีอยู่เป็นรูปแบบ WebP โดยใช้ Android Studio ดูข้อมูลเพิ่มเติมได้ที่สร้างรูปภาพ WebP

ใช้กราฟิกเวกเตอร์

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

อย่างไรก็ตาม ระบบจะใช้เวลานานขึ้นอย่างมากในการเรนเดอร์แต่ละVectorDrawableออบเจ็กต์ และรูปภาพขนาดใหญ่จะใช้เวลานานกว่าที่จะปรากฏบนหน้าจอ ดังนั้น ให้พิจารณาใช้กราฟิกเวกเตอร์เหล่านี้เมื่อแสดงรูปภาพขนาดเล็กเท่านั้น

ดูข้อมูลเพิ่มเติมเกี่ยวกับการทำงานกับออบเจ็กต์ VectorDrawable ได้ที่Drawable

ใช้ภาพกราฟิกเวกเตอร์สำหรับรูปภาพเคลื่อนไหว

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

แต่ให้ใช้ AnimatedVectorDrawableCompat เพื่อสร้างรูปภาพเวกเตอร์ที่เคลื่อนไหวได้แทน

ลดโค้ดเนทีฟและโค้ด Java

คุณสามารถใช้วิธีการต่อไปนี้เพื่อลดขนาดโค้ดฐาน Java และโค้ดเนทีฟในแอป

นำโค้ดที่สร้างขึ้นที่ไม่จำเป็นออก

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

หลีกเลี่ยงการแจกแจง

Enum รายการเดียวจะเพิ่มขนาดไฟล์ classes.dex ของแอปประมาณ 1.0-1.4 KB การเพิ่มเหล่านี้อาจทําให้ระบบที่ซับซ้อนหรือคลังที่ใช้ร่วมกันมีข้อมูลเพิ่มขึ้นอย่างรวดเร็ว หากเป็นไปได้ ให้พิจารณาใช้@IntDefคําอธิบายประกอบและการลดขนาดโค้ดเพื่อนำการแจกแจงออกและแปลงเป็นจำนวนเต็ม การแปลงประเภทนี้จะรักษาประโยชน์ด้านความปลอดภัยของประเภททั้งหมดของ enum

ลดขนาดไบนารีดั้งเดิม

หากแอปของคุณใช้โค้ดแบบเนทีฟและ Android NDK คุณสามารถลดขนาดแอปเวอร์ชันที่เผยแพร่ได้โดยการเพิ่มประสิทธิภาพโค้ด เทคนิคที่มีประโยชน์ 2 อย่างคือการนำสัญลักษณ์การแก้ไขข้อบกพร่องออกและไม่แยกไลบรารีเนทีฟ

นำสัญลักษณ์การแก้ไขข้อบกพร่องออก

การใช้สัญลักษณ์สำหรับแก้ไขข้อบกพร่องจะเหมาะสมในกรณีที่แอปอยู่ระหว่างการพัฒนาและยังต้องการการแก้ไขข้อบกพร่อง ใช้เครื่องมือ arm-eabi-strip ที่มีให้ใน Android NDK เพื่อนำสัญลักษณ์การแก้ไขข้อบกพร่องที่ไม่จำเป็นออกจากไลบรารีที่มาพร้อมเครื่อง หลังจากนั้น คุณจะคอมไพล์บิลด์ของรุ่นได้

หลีกเลี่ยงการแยกไลบรารีที่มาพร้อมเครื่อง

เมื่อสร้างแอปเวอร์ชันที่เผยแพร่ ให้แพ็กเกจไฟล์ .so ที่ไม่ได้บีบอัดไว้ใน APK โดยตั้งค่า useLegacyPackaging เป็น false ในไฟล์ build.gradle.kts ของแอป การปิดใช้ Flag นี้จะป้องกันไม่ให้ PackageManager คัดลอกไฟล์ .so จาก APK ไปยังระบบไฟล์ระหว่างการติดตั้ง วิธีนี้จะทำให้อัปเดตของแอปมีขนาดเล็กลง

ดูแลรักษา APK แบบลีนหลายรายการ

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

หากไม่ได้เผยแพร่แอปใน Google Play คุณสามารถแบ่งกลุ่มแอปออกเป็น APK หลายรายการโดยแยกตามปัจจัยต่างๆ เช่น รองรับขนาดหน้าจอหรือพื้นผิว GPU

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

สำหรับข้อมูลเพิ่มเติม โปรดดูสร้าง APK หลายรายการและการรองรับ APK หลายรายการ