Tìm hiểu về Kiến trúc CPU của Android (ABI): Tại sao arm64-v8a, armeabi-v7a và x86 lại quan trọng

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

Nếu bạn đã từng hợp nhất một tập hợp các tệp APK bị chia tách và thấy điện thoại của mình báo lỗi "Ứng dụng chưa được cài đặt" hoặc tệ hơn là thấy nó cài đặt bình thường nhưng lại gặp sự cố ngay khi bạn nhấn vào biểu tượng, rất có thể vấn đề thực sự không liên quan gì đến quá trình tải xuống bị hỏng. Gần như chắc chắn là về kiến trúc: sự không khớp giữa CPU mà điện thoại của bạn chạy và CPU mà mã gốc của ứng dụng được biên dịch cho đó. Hầu hết người dùng Android không bao giờ phải nghĩ về điều này, cho đến thời điểm nó lặng lẽ phá vỡ thứ gì đó và sau đó nó nhanh chóng trở nên phù hợp. Dưới đây là ý nghĩa của kiến trúc CPU đối với APK, lý do tại sao một ứng dụng trên Cửa hàng Play lại bí mật gửi dưới dạng nhiều bản dựng khác nhau và cách kiểm tra tính tương thích trước khi bạn cài đặt bất kỳ thứ gì.

ABI là gì

ABI là viết tắt của Giao diện nhị phân ứng dụng. Về mặt thực tế, đó là tập lệnh mà chip hiểu được - định dạng mã máy thô mà bộ xử lý có thể thực thi trực tiếp. Hầu hết ứng dụng Android, các phần được viết bằng Java hoặc Kotlin, đều được biên dịch thành mã byte chạy bên trong Android Runtime (ART) và ART không đặc biệt quan tâm đến việc nó sẽ nằm trên con chip nào. Lớp đó có thiết kế không phụ thuộc vào kiến trúc, đây là một phần quan trọng giải thích tại sao các ứng dụng Android thường "chỉ hoạt động" trên nhiều loại phần cứng như vậy.

Mã gốc là một câu chuyện khác. Rất nhiều ứng dụng, đặc biệt là trò chơi, ứng dụng máy ảnh, công cụ học máy và bất kỳ ứng dụng nào xử lý âm thanh hoặc video nặng, đều cung cấp các thư viện gốc được viết bằng C hoặc C++ thông qua Android NDK. Các thư viện đó được biên dịch trước thành mã máy cho một tập lệnh cụ thể và một con chip được tạo cho một tập lệnh thường không thể thực thi mã máy được viết cho một tập lệnh khác. Đó là toàn bộ lý do ABI tồn tại như một thứ đáng để hiểu: thời điểm một ứng dụng bao gồm dù chỉ một thư viện .so gốc, khả năng tương thích của nó sẽ gắn liền với kiến trúc mà thư viện đó được xây dựng.

Những kiến trúc bạn sẽ gặp phải

Đã từng có nhiều sự đa dạng hơn trong không gian này (bạn còn nhớ armeabi hoặc MIPS đơn giản không?), nhưng đến năm 2026, lĩnh vực này đã thu hẹp xuống còn bốn ABI đáng biết:

ABIĐộ rộng bitThiết bị điển hìnhGhi chú
arm64-v8aCÁNH TAY 64-bitHầu như mọi điện thoại được bán kể từ khoảng năm 2019Mục tiêu mặc định cho ứng dụng mới; Google đã yêu cầu hỗ trợ 64-bit cho các lần gửi mới trên Cửa hàng Play trong vài năm nay.
armeabi-v7aCÁNH TAY 32-bitThiết bị cũ hơn hoặc bình dân, một số điện thoại giá rẻ vẫn được bán ở các thị trường mới nổiVẫn được nhiều ứng dụng cung cấp để có khả năng tương thích ngược, mặc dù hầu hết các thiết bị đang hoạt động không còn cần đến nó nữa.
x86Intel 32-bitMáy tính bảng cũ, trình mô phỏng cũ dựa trên IntelHầu hết đã lỗi thời; ngày nay bạn sẽ hiếm khi bắt gặp một chiếc điện thoại x86 32-bit thực sự.
x86_64Intel 64-bitMột số Chromebook, trình giả lập Android trên máy tính để bàn, một số máy tính bảng x86Điều quan trọng nếu bạn thử nghiệm ứng dụng trong trình mô phỏng như Android Studio AVD dựa trên x86 hoặc một số bản dựng BlueStacks nhất định.

Nếu bạn đang cầm một chiếc điện thoại đã mua trong vòng 5 hoặc 6 năm qua thì gần như chắc chắn đó là arm64-v8a. Các trường hợp ngoại lệ cần nhớ là trình mô phỏng và Chromebook, thường chạy trên x86_64 thay vào đó, vì x86_64 phù hợp với CPU máy tính xách tay hoặc máy tính để bàn cơ bản.

Tại sao ứng dụng lại bận tâm vận chuyển nhiều bản dựng

Một câu hỏi hiển nhiên là tại sao các nhà phát triển không gộp tất cả thư viện gốc của mọi kiến trúc vào một tệp APK duy nhất cho xong. Một số ứng dụng thực sự làm đúng như vậy, và nó được gọi là APK phổ quát (universal) hay APK "đầy đủ" (fat APK). Nhược điểm là kích thước. Một trò chơi có các thư viện gốc dành cho arm64-v8a, armeabi-v7a, x86 và x86_64 được gói cùng nhau có thể dễ dàng tăng gấp đôi hoặc gấp ba kích thước so với một bản dựng chỉ chứa một kiến trúc mà thiết bị của bạn cần. Nhân con số đó lên hàng triệu lượt cài đặt và bạn sẽ thấy một lượng băng thông và bộ nhớ bị lãng phí thực sự đáng kể đối với mã sẽ không bao giờ chạy trên thiết bị đó.

Để tránh lãng phí đó, Google Play và định dạng Android App Bundle đã chia ứng dụng thành một APK cơ sở nhỏ cộng với một loạt APK cấu hình, một trong số đó dành riêng cho kiến trúc. Khi điện thoại của bạn yêu cầu ứng dụng, Cửa hàng Play sẽ cung cấp APK cơ sở cùng với chỉ phân chia kiến trúc phù hợp với chip của bạn, cùng với phân chia ngôn ngữ và mật độ màn hình phù hợp. Bạn kết thúc với một bản cài đặt hoạt động giống như một ứng dụng duy nhất nhưng được tập hợp từ một số phần được xây dựng có mục đích ở hậu trường.

Cách phân chia APK và gói ứng dụng sử dụng tính năng này

Nếu bạn đã từng mở gói .apks hoặc .xapk và nhận thấy các tên tệp như split_config.arm64_v8a.apk, split_config.armeabi_v7a.apk, split_config.xxhdpi.apk và split_config.en.apk nằm cạnh base.apk, thì đó chính xác là hệ thống này đang hoạt động, chỉ được xuất dưới dạng tập hợp tệp thay vì được Cửa hàng Play âm thầm phân phối. Sự phân chia mật độ và ngôn ngữ thường an toàn để cài đặt bừa bãi vì điện thoại sẽ đơn giản bỏ qua các tài nguyên mà nó không cần. Sự phân chia kiến trúc là khác nhau: cài đặt sai hoặc không cài đặt kiến trúc phù hợp và bạn sẽ gặp rắc rối thực sự.

Khi bạn sử dụng trình chuyển đổi để hợp nhất gói phân tách trở lại thành một APK có thể cài đặt duy nhất, quá trình hợp nhất phải chọn kiến trúc nào được phân chia để gộp vào. Một trình chuyển đổi tốt sẽ giữ mọi phân chia kiến trúc thực sự hữu ích hoặc cho phép bạn chọn, thay vì âm thầm chỉ giữ một kiến trúc và hy vọng nó phù hợp với thiết bị của bạn.

Điều gì xảy ra khi kiến trúc không phù hợp

Có hai chế độ lỗi riêng biệt đáng để biết vì chúng trông và cảm nhận khác với người dùng thông thường.

Đầu tiên là lỗi cài đặt hoàn toàn. Nếu một ứng dụng được xây dựng gần như hoàn toàn dựa trên mã gốc mà không có dự phòng có ý nghĩa, thì trình quản lý gói của Android sẽ từ chối cài đặt ứng dụng đó, thường xuất hiện lỗi như INSTALL_FAILED_NO_MATCHING_ABIS. Bạn thậm chí sẽ không bao giờ mở được ứng dụng; trình cài đặt chặn bạn ở cửa.

Kết quả thứ hai, đáng thất vọng hơn là thành công một phần thầm lặng. Nếu một ứng dụng có điểm truy cập Java hoặc Kotlin tự tải tốt nhưng sau đó cố gắng gọi vào một thư viện gốc không có trong kiến trúc của bạn thì quá trình cài đặt sẽ hoàn tất bình thường. Mọi thứ đều ổn cho đến khi bạn nhấn vào biểu tượng, lúc đó ứng dụng gần như gặp sự cố ngay lập tức, thường kèm theo UnsatisfiedLinkError bị chôn trong nhật ký. Đây là câu chuyện cổ điển "Tôi đã chuyển đổi nó, nó cài đặt, sau đó nó đóng ngay lập tức" và hầu như luôn là sự cố kiến trúc chứ không phải là tệp bị hỏng.

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

Cách kiểm tra cấu trúc điện thoại của bạn

Đối với đại đa số mọi người, điều này rất đơn giản: nếu điện thoại của bạn từ năm 2019 trở lên, hãy giả sử arm64-v8a và tiếp tục. Nếu bạn muốn chắc chắn hoặc bạn đang xử lý một thiết bị cũ hơn hoặc khác thường, một số tùy chọn thiết thực:

Cách kiểm tra kiến trúc mà APK hỗ trợ

Trước khi cài đặt một tệp từ bên ngoài Cửa hàng Play, bạn nên xác nhận nội dung bên trong tệp đó thay vì đoán mò. Thư viện gốc của APK nằm trong các thư mục được đặt tên theo kiến trúc của chúng bên trong thư mục lib/, chẳng hạn như lib/arm64-v8a/ hoặc lib/armeabi-v7a/. Bất kỳ công cụ nào có thể kiểm tra cấu trúc bên trong của APK đều có thể cho bạn biết chính xác thư mục nào hiện diện, từ đó cho bạn biết chính xác tệp sẽ chạy trên thiết bị nào.

Kiểm tra trước khi cài đặt

Công cụ thông tin APK của chúng tôi đọc thư mục lib/ nội bộ của APK và liệt kê mọi kiến ​​trúc mà nó được xây dựng để bạn có thể xác nhận tính tương thích trước khi tải bất kỳ thứ gì. Khi bạn chuyển đổi gói phân tách bằng Công cụ chuyển đổi XAPKS sang APK của chúng tôi, chúng tôi cũng tự động hiển thị gói này sau mỗi chuyển đổi, liệt kê các kiến ​​trúc được tìm thấy trong tệp đã hợp nhất và gắn cờ gói đó khi bản dựng dường như thiếu một phần mà các thiết bị thông thường sẽ cần.

APK phổ quát và APK đơn ABI: Bạn nên sử dụng loại nào?

Tiêu chíAPK phổ quát / béoAPK ABI đơn
Kích thước tệpLớn hơn, đôi khi 2-4xNhỏ gọn, chỉ chứa những gì thiết bị của bạn cần
Khả năng tương thíchHoạt động trên hầu hết mọi thiết bịChỉ hoạt động trên kiến trúc phù hợp
Tốt nhất choChia sẻ một tệp sẽ hoạt động ở mọi nơi, người nhận không chắc chắnThiết bị của riêng bạn, khi bạn đã biết kiến trúc của nó
Rủi roNguy cơ không khớp ABI rất thấpSẽ thất bại hoặc sụp đổ nếu bạn chọn sai

Những sai lầm phổ biến mà mọi người mắc phải với các gói chia nhỏ

Bài học chính

  • ABI là tập lệnh mà một con chip có thể hiểu được; nó chỉ quan trọng đối với các ứng dụng bao gồm mã gốc (C/C++).
  • arm64-v8a bao gồm hầu hết mọi điện thoại hiện đại; armeabi-v7a dành cho các thiết bị cũ hơn; x86/x86_64 chủ yếu hiển thị trong trình mô phỏng và Chromebook.
  • Các ứng dụng thường được phân chia theo kiến trúc để tránh gửi mã gốc không cần thiết đến mọi thiết bị.
  • Kiến trúc không khớp sẽ chặn hoàn toàn quá trình cài đặt hoặc gây ra sự cố ngay lập tức sau khi cài đặt có vẻ thành công.
  • Bạn có thể kiểm tra cả kiến trúc của thiết bị và kiến trúc được hỗ trợ của APK trước khi cài đặt bất kỳ thứ gì, tránh hoàn toàn việc phỏng đoán.

Câu Hỏi Thường Gặp (FAQ)

Tôi có cần biết cấu trúc điện thoại của mình để cài đặt ứng dụng Cửa hàng Play thông thường không?

Không. Cửa hàng Play tự động phát hiện thiết bị của bạn và chỉ phân chia kiến trúc phù hợp, vì vậy điều này chỉ có liên quan khi bạn tải APK từ bên ngoài Cửa hàng Play.

Một APK có thể hỗ trợ nhiều kiến trúc cùng một lúc không?

Đúng. APK phổ quát hoặc gói gọn các thư viện gốc cho mọi kiến trúc được hỗ trợ trong một tệp. Nó lớn hơn nhưng sẽ cài đặt trên mọi thiết bị tương thích bất kể chip.

Tại sao APK đã chuyển đổi của tôi cài đặt nhưng sau đó bị lỗi ngay lập tức?

Điều này thường xảy ra khi ứng dụng có một lượng nhỏ mã Java cài đặt tốt nhưng sau đó cố tải thư viện gốc không được đưa vào kiến trúc thiết bị của bạn, gây ra UnsatisfiedLinkError khi chạy.

Arm64-v8a có tương thích ngược với ứng dụng armeabi-v7a không?

Nói chung là có. Hầu hết các chip arm64-v8a cũng có thể thực thi các lệnh ARM 32 bit, do đó, APK chỉ có armeabi-v7a thường sẽ vẫn chạy trên điện thoại arm64 hiện đại chứ không phải ngược lại.

Các thiết bị Android x86 có còn tồn tại vào năm 2026 không?

Ngày nay, chúng hiếm có trên điện thoại nhưng bạn vẫn sẽ tìm thấy x86 hoặc x86_64 trong một số máy tính bảng chạy Intel cũ hơn, một số Chromebook chạy ứng dụng Android và hầu hết các trình mô phỏng Android trên máy tính để bàn.

Bạn không cần phải ghi nhớ bất kỳ điều gì trong số này. Phiên bản ngắn gọn: điện thoại hiện đại hầu như luôn có arm64-v8a, các ứng dụng được phân chia theo kiến trúc để tiết kiệm dung lượng và nếu có thứ gì đó từ chối cài đặt hoặc gặp sự cố ngay sau khi mở, kiến trúc không khớp là một trong những điều đầu tiên cần loại trừ trước khi cho rằng bản thân tệp bị hỏng.

Được thiết kế và ghi lại bởi Mst Shaefale Nhà phát triển chính và Kiến trúc sư gói Android • Đã xác minh trên Android 12–15

Bà Shaefale duy trì việc hợp nhất XAPK/APKS phía máy khách, trình phân tích cú pháp tệp kê khai nhị phân và các công cụ ký APK v1+v2 tại xapktoapk.com. Phát hiện lệnh đã lỗi thời hoặc thay đổi hệ điều hành? Gửi một ghi chú biên tập.