ทำความเข้าใจกับสถาปัตยกรรม CPU ของ Android (ABI): เหตุใด arm64-v8a, armeabi-v7a และ x86 จึงมีความสำคัญ

Diagram showing one app bundle splitting into arm64-v8a, armeabi-v7a, and x86 architecture-specific APKs

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

ABI คืออะไร

ABI ย่อมาจาก Application Binary Interface ในทางปฏิบัติ มันคือชุดคำสั่งที่ชิปเข้าใจ ซึ่งเป็นรูปแบบรหัสเครื่องดิบที่โปรเซสเซอร์สามารถดำเนินการได้โดยตรง แอพ Android ส่วนใหญ่ส่วนที่เขียนด้วย Java หรือ Kotlin ได้รับการคอมไพล์เป็นไบต์โค้ดที่ทำงานภายใน Android Runtime (ART) และ ART ไม่สนใจเป็นพิเศษว่าชิปตัวนั้นจะนั่งอยู่บนชิปใด เลเยอร์นั้นออกแบบโดยไม่เชื่อเรื่องสถาปัตยกรรม ซึ่งเป็นส่วนสำคัญที่ทำให้แอป Android โดยทั่วไป "ใช้งานได้" กับฮาร์ดแวร์หลากหลายประเภท

รหัสเนทิฟเป็นอีกเรื่องหนึ่ง แอปมากมาย โดยเฉพาะเกม แอปกล้อง เครื่องมือการเรียนรู้ของเครื่อง และอะไรก็ตามที่ต้องใช้การประมวลผลเสียงหรือวิดีโอจำนวนมาก จัดส่งไลบรารีดั้งเดิมที่เขียนด้วยภาษา C หรือ C++ ผ่าน Android NDK ไลบรารีเหล่านั้นจะถูกคอมไพล์ล่วงหน้าเป็นรหัสเครื่องสำหรับชุดคำสั่งเฉพาะชุดหนึ่ง และโดยทั่วไปชิปที่สร้างขึ้นสำหรับชุดคำสั่งชุดหนึ่งโดยทั่วไปจะไม่สามารถรันโค้ดเครื่องที่เขียนขึ้นสำหรับชุดคำสั่งอื่นได้ นั่นคือเหตุผลทั้งหมดที่มี ABI เป็นสิ่งที่ควรค่าแก่การทำความเข้าใจ ทันทีที่แอปมีไลบรารี .so แบบเนทีฟแม้แต่ไลบรารีเดียว ความเข้ากันได้ของแอปจะเชื่อมโยงกับสถาปัตยกรรมที่ไลบรารีถูกสร้างขึ้นมา

สถาปัตยกรรมที่คุณจะพบ

เคยมีความหลากหลายมากขึ้นในพื้นที่นี้ (จำ armeabi ธรรมดาหรือ MIPS ได้ไหม) แต่ภายในปี 2569 เขตข้อมูลได้แคบลงเหลือ ABI สี่แห่งที่ควรรู้:

เอบีไอความกว้างบิตอุปกรณ์ทั่วไปหมายเหตุ
arm64-v8aARM 64 บิตโทรศัพท์แทบทุกเครื่องที่ขายไปตั้งแต่ประมาณปี 2019เป้าหมายเริ่มต้นสำหรับแอปใหม่ Google ต้องการการสนับสนุน 64 บิตสำหรับการส่ง Play Store ใหม่มาหลายปีแล้ว
armeabi-v7aARM 32 บิตอุปกรณ์รุ่นเก่าหรือราคาประหยัด โทรศัพท์ราคาถูกบางรุ่นยังคงจำหน่ายในตลาดเกิดใหม่แอพจำนวนมากยังคงจัดส่งมาให้เพื่อความเข้ากันได้แบบย้อนหลัง แม้ว่าอุปกรณ์ที่ใช้งานอยู่ส่วนใหญ่จะไม่ต้องการมันอีกต่อไป
x86อินเทล 32 บิตแท็บเล็ตที่ใช้ Intel รุ่นเก่า, โปรแกรมจำลองแบบดั้งเดิมส่วนใหญ่ล้าสมัย คุณจะไม่ค่อยพบโทรศัพท์ x86 32 บิตจริง ๆ ในปัจจุบัน
x86_64อินเทล 64 บิตChromebook บางรุ่น, โปรแกรมจำลอง Android บนเดสก์ท็อป, แท็บเล็ต x86 บางรุ่นสิ่งสำคัญหากคุณทดสอบแอปในโปรแกรมจำลอง เช่น Android Studio AVD ที่ใช้ x86 หรือ BlueStacks บางรุ่น

หากคุณถือโทรศัพท์ที่ซื้อมาในช่วงห้าหรือหกปีที่ผ่านมา ก็แทบจะเป็นรุ่น arm64-v8a อย่างแน่นอน ข้อยกเว้นที่ควรจำไว้คือโปรแกรมจำลองและ Chromebook ซึ่งมักจะทำงานบน x86_64 แทน เนื่องจากตรงกับแล็ปท็อปหรือ CPU เดสก์ท็อปที่ใช้งานอยู่

เหตุใดแอปจึงกังวลเรื่องการจัดส่งหลายบิลด์เลย

คำถามหนึ่งที่ชัดเจนคือเหตุใดนักพัฒนาจึงไม่เพียงแค่อัดไลบรารีดั้งเดิมของสถาปัตยกรรมทุกตัวลงใน APK เดียวแล้วจัดการให้เสร็จ แอปบางแอปทำแบบนั้นจริงๆ และเรียกว่า APK ที่เป็นสากลหรือ "อ้วน" ข้อเสียคือขนาด เกมที่มีไลบรารีดั้งเดิมสำหรับ arm64-v8a, armeabi-v7a, x86 และ x86_64 ทั้งหมดรวมเข้าด้วยกันสามารถเพิ่มขนาดเป็นสองเท่าหรือสามเท่าได้อย่างง่ายดาย เมื่อเทียบกับโครงสร้างที่มีสถาปัตยกรรมเดียวที่อุปกรณ์ของคุณต้องการ คูณค่านั้นในการติดตั้งนับล้านครั้ง และคุณกำลังดูปริมาณแบนด์วิธและพื้นที่จัดเก็บที่สูญเปล่าจำนวนมากอย่างแท้จริง สำหรับโค้ดที่จะไม่มีวันทำงานบนอุปกรณ์นั้น

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

แยก APK และ App Bundle ใช้สิ่งนี้อย่างไร

หากคุณเคยเปิดแพ็คเกจ .apks หรือ .xapk และสังเกตเห็นชื่อไฟล์เช่น split_config.arm64_v8a.apk, split_config.armeabi_v7a.apk, split_config.xxhdpi.apk และ split_config.en.apk อยู่ข้างๆ base.apk นั่นคือระบบที่ใช้งานจริง เพียงส่งออกเป็นชุดไฟล์แทนที่จะถูกส่งแบบเงียบๆ โดย Play Store การแยกความหนาแน่นและภาษามักจะปลอดภัยในการติดตั้งโดยไม่เลือกปฏิบัติ เนื่องจากโทรศัพท์จะเพิกเฉยต่อทรัพยากรที่ไม่ต้องการ การแยกทางสถาปัตยกรรมนั้นแตกต่างออกไป: ติดตั้งผิดอัน หรือล้มเหลวในการติดตั้งอันที่ตรงกัน และคุณจะพบกับปัญหาที่แท้จริง

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

จะเกิดอะไรขึ้นเมื่อสถาปัตยกรรมไม่ตรงกัน

มีโหมดความล้มเหลวที่แตกต่างกันสองโหมดที่ควรทราบแยกกัน เนื่องจากมีรูปลักษณ์และความรู้สึกที่แตกต่างจากผู้ใช้ทั่วไป

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

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

Diagram comparing a matching arm64 APK that installs and runs successfully against an x86-only APK that fails to install on an arm64 phone with error INSTALL_FAILED_NO_MATCHING_ABIS

วิธีตรวจสอบสถาปัตยกรรมโทรศัพท์ของคุณเอง

สำหรับคนส่วนใหญ่ สิ่งนี้เป็นเรื่องง่าย: หากโทรศัพท์ของคุณตั้งแต่ปี 2019 หรือใหม่กว่า ให้ใช้ arm64-v8a แล้วเดินหน้าต่อไป หากคุณต้องการแน่ใจหรือกำลังเผชิญกับอุปกรณ์รุ่นเก่าหรือผิดปกติ มีตัวเลือกที่ใช้งานได้จริงดังนี้:

วิธีตรวจสอบสถาปัตยกรรมที่ APK รองรับ

ก่อนที่จะติดตั้งไฟล์จากนอก Play Store คุณควรตรวจสอบก่อนว่ามีอะไรอยู่ข้างใน แทนที่จะเดา ไลบรารีดั้งเดิมของ APK อยู่ในโฟลเดอร์ที่ตั้งชื่อตามสถาปัตยกรรมภายในไดเรกทอรี lib/ เช่น lib/arm64-v8a/ หรือ lib/armeabi-v7a/ เครื่องมือใดก็ตามที่สามารถตรวจสอบโครงสร้างภายในของ APK จะสามารถบอกคุณได้อย่างชัดเจนว่ามีโฟลเดอร์ใดอยู่บ้าง ซึ่งจะบอกคุณได้อย่างชัดเจนว่าไฟล์จะทำงานบนอุปกรณ์ใด

ตรวจสอบก่อนที่จะติดตั้ง

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

Universal APK กับ Single-ABI APK: คุณควรใช้อันไหน

เกณฑ์APK สากล / อ้วนAPK แบบ ABI เดี่ยว
ขนาดไฟล์ใหญ่กว่าบางครั้ง 2-4xเล็ก มีเพียงสิ่งที่อุปกรณ์ของคุณต้องการเท่านั้น
ความเข้ากันได้ทำงานบนอุปกรณ์เกือบทุกชนิดใช้งานได้กับสถาปัตยกรรมที่ตรงกันเท่านั้น
ดีที่สุดสำหรับการแชร์ไฟล์เดียวที่ควรใช้งานได้ทุกที่ โดยผู้รับไม่แน่ใจอุปกรณ์ของคุณ เมื่อคุณทราบสถาปัตยกรรมของมันแล้ว
เสี่ยงความเสี่ยงต่ำมากของ ABI ที่ไม่ตรงกันจะล้มเหลวหรือล้มเหลวหากคุณเลือกผิด

ข้อผิดพลาดทั่วไปที่ผู้คนทำกับแพ็คเกจแบบแยกส่วน

ประเด็นสำคัญ

  • ABI คือชุดคำสั่งที่ชิปเข้าใจ มันสำคัญสำหรับแอพที่มีโค้ดเนทิฟ (C/C++) เท่านั้น
  • arm64-v8a ครอบคลุมโทรศัพท์สมัยใหม่เกือบทุกรุ่น armeabi-v7a สำหรับอุปกรณ์รุ่นเก่า x86/x86_64 ส่วนใหญ่จะแสดงในโปรแกรมจำลองและ Chromebook
  • โดยทั่วไปแอพจะถูกแบ่งตามสถาปัตยกรรมเพื่อหลีกเลี่ยงการจัดส่งโค้ดเนทีฟที่ไม่จำเป็นไปยังทุกอุปกรณ์
  • สถาปัตยกรรมที่ไม่ตรงกันอาจบล็อกการติดตั้งทันทีหรือทำให้เกิดความเสียหายทันทีหลังจากการติดตั้งที่ดูเหมือนจะสำเร็จ
  • คุณสามารถตรวจสอบทั้งสถาปัตยกรรมของอุปกรณ์และสถาปัตยกรรมที่รองรับของ APK ก่อนที่จะติดตั้งสิ่งใด ๆ โดยหลีกเลี่ยงการคาดเดาโดยสิ้นเชิง

คำถามที่พบบ่อย (FAQ)

ฉันจำเป็นต้องรู้สถาปัตยกรรมของโทรศัพท์เพื่อติดตั้งแอป Play Store ปกติหรือไม่

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

APK หนึ่งตัวสามารถรองรับสถาปัตยกรรมหลาย ๆ อันพร้อมกันได้หรือไม่

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

เหตุใด APK ที่แปลงแล้วของฉันจึงติดตั้งแต่กลับเกิดข้อผิดพลาดทันที

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

arm64-v8a เข้ากันได้กับแอพ armeabi-v7a หรือไม่

โดยทั่วไปแล้วใช่ ชิป arm64-v8a ส่วนใหญ่ยังสามารถดำเนินการคำสั่ง ARM 32 บิตได้ ดังนั้น APK ของ armeabi-v7a เท่านั้นมักจะยังคงทำงานบนโทรศัพท์ arm64 สมัยใหม่ ไม่ใช่วิธีอื่น

อุปกรณ์ Android x86 ยังมีอยู่ในปี 2569 หรือไม่

ปัจจุบันหาได้ยากในโทรศัพท์ แต่คุณยังคงพบ x86 หรือ x86_64 ในแท็บเล็ตที่ใช้ Intel รุ่นเก่าบางรุ่น, Chromebook จำนวนหนึ่งที่ใช้แอป Android และโปรแกรมจำลอง Android บนเดสก์ท็อปส่วนใหญ่

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

ออกแบบและจัดทำเอกสารโดย Mst Shaefale หัวหน้านักพัฒนาและสถาปนิกแพ็คเกจ Android • ตรวจสอบแล้วบน Android 12–15

Mst Shaefale ดูแลการควบรวมกิจการ XAPK/APKS ฝั่งไคลเอ็นต์, ตัวแยกวิเคราะห์รายการไบนารี และเครื่องมือลงนาม APK v1+v2 ที่ xapktoapk.com พบคำสั่งที่ล้าสมัยหรือการเปลี่ยนแปลงระบบปฏิบัติการหรือไม่ ส่งบันทึกบรรณาธิการ