了解 Android CPU 架構 (ABI):為什麼 arm64-v8a、armeabi-v7a 和 x86 很重要
如果您曾經合併過一組拆分的 APK 文件,然後發現您的手機返回“應用程式未安裝”,或者更糟的是,您看到它安裝得很好,但在您點擊圖標的瞬間就崩潰了,那麼真正的問題很可能與損壞的下載無關。几乎可以肯定,这与架构有关:手机运行的 CPU 与编译应用程序本机代码的 CPU 之间不匹配。大多數 Android 用戶從來都不需要考慮這個問題,直到它悄悄破壞某些東西的那一刻,然後它很快就會變得相關。以下是 CPU 架構對於 APK 的含義、為什麼 Play 商店中的單一應用程式會秘密地以多個不同的版本形式發布,以及如何在安裝任何內容之前檢查相容性。
什麼是 ABI
ABI 代表應用程式二進位介面。實際上,它是晶片理解的指令集——處理器可以直接執行的原始機器碼格式。大多數 Android 應用程式(用 Java 或 Kotlin 編寫的部分)都會編譯成在 Android 運行時 (ART) 內運行的字節碼,而 ART 並不特別關心它恰好位於哪個晶片上。該層在設計上與架構無關,這也是 Android 應用程式通常可以在如此廣泛的硬體上「正常運行」的一個重要原因。
本機代碼則是另一回事。許多應用程序,尤其是遊戲、相機應用程式、機器學習工具以及任何進行大量音訊或視訊處理的應用程序,都透過 Android NDK 提供用 C 或 C++ 編寫的本機庫。這些函式庫提前編譯成特定指令集的機器碼,而為一種指令集建構的晶片通常無法執行為不同指令集所寫的機器碼。這就是 ABI 作為值得理解的東西而存在的全部原因:當應用程式包含一個本機 .so 函式庫時,其相容性就與該函式庫所針對的架構相關聯。
您將會遇到的架構
這個領域曾經有更多的種類(還記得簡單的 armeabi 或 MIPS 嗎?),但到 2026 年,該領域已縮小到四個值得了解的 ABI:
| ABI | 位元寬 | 典型裝置 | 筆記 |
|---|---|---|---|
| arm64-v8a | 64位元ARM | 大約自 2019 年以來售出的幾乎所有手機 | 新應用程式的預設目標;多年來,Google 一直要求新的 Play 商店提交內容支援 64 位元。 |
| armeabi-v7a | 32位元ARM | 較舊或廉價的設備,一些低成本手機仍在新興市場銷售 | 儘管大多數活躍設備不再需要它,但許多應用程式仍然提供向後相容性。 |
| x86 | 32位英特爾 | 基於 Intel 的舊平板電腦、傳統模擬器 | 大部分已經過時;如今您很少會遇到真正的 32 位元 x86 手機。 |
| x86_64 | 64位英特爾 | 一些 Chromebook、桌面 Android 模擬器、一些 x86 平板電腦 | 如果您在模擬器(例如基於 x86 的 Android Studio AVD 或某些 BlueStacks 版本)中測試應用程序,這一點很重要。 |
如果您手上的手機是在過去五、六年內購買的,那麼幾乎可以肯定它是arm64-v8a。值得記住的例外是模擬器和 Chromebook,它們經常在 x86_64 上運行,因為它與底層筆記型電腦或桌上型電腦 CPU 相符。
為什麼應用程式要費心交付多個版本
一個明顯的問題是,為什麼開發人員不將每個架構的本機庫塞進一個 APK 中並完成它。有些應用程式正是這樣做的,它被稱為通用或「胖」APK。缺點是尺寸。與僅包含設備所需的一種架構的構建相比,包含 arm64-v8a、armeabi-v7a、x86 和 x86_64 的本機庫全部捆綁在一起的遊戲的大小可以輕鬆增加一倍或三倍。將其乘以數百萬次安裝,您會看到真正浪費了大量的頻寬和儲存空間,而這些程式碼永遠不會在該裝置上運行。
為了避免這種浪費,Google Play 和 Android App Bundle 格式將應用程式拆分為一個小型基礎 APK 和一系列配置 APK,其中一個專用於架構。當您的手機要求應用程式時,Play 商店會提供基本 APK 以及僅與您的晶片匹配的架構拆分,以及匹配的螢幕密度和語言拆分。您最終會得到一個行為類似於單個應用程式的安裝,但由多個在幕後專門構建的部分組裝而成。
拆分 APK 和應用程式套件如何使用此功能
如果您曾經開啟過 .apks 或 .xapk 軟體包,並注意到 split_config.arm64_v8a.apk、split_config.armeabi_v7a.apk、split_config.xxhdpi.apk 和 split_config.en.apk 等檔案名稱位於 base.apk 旁邊,那麼這正是該系統正在運行的情況,只是作為一組檔案名稱位於 旁邊,那麼這正是該系統正在運行的情況,只是作為一組檔案匯出,而不是由 Play 默默商店提供。密度和语言分割通常可以安全地随意安装,因为手机会简单地忽略它不需要的资源。架构划分是不同的:安装错误的架构,或者无法安装匹配的架构,你就会遇到真正的麻烦。
當您使用轉換器將分割包合併回單一可安裝的 APK 時,合併過程必須選擇要合併的架構分割。一個好的轉換器會保留真正有用的每個架構拆分,或者讓您選擇,而不是默默地只保留一個並希望它與您的設備匹配。
當架構不匹配時會發生什麼
有兩種不同的故障模式值得區分,因為它們對一般使用者來說看起來和感覺都不同。
第一個是徹底的安裝失敗。如果一個應用程式幾乎完全圍繞本機程式碼構建,沒有任何有意義的回退,Android 的套件管理器將根本拒絕安裝它,通常會出現類似 INSTALL_FAILED_NO_MATCHING_ABIS 的錯誤。你甚至無法打開該應用程式;安裝人員把你攔在門口。
第二個更令人沮喪的結果是無聲的部分成功。如果應用程式有一個可以自行正常載入的 Java 或 Kotlin 入口點,但隨後嘗試呼叫您的架構中不存在的本機程式庫,則安裝會正常完成。一切看起來都很好,直到您點擊該圖標,此時應用程式幾乎立即崩潰,通常會在日誌中隱藏 UnsatisfiedLinkError。這是經典的「我轉換了它,安裝了它,然後它立即關閉」的故事,它幾乎總是一個體系結構問題而不是損壞的檔案。
如何檢查自己手機的架構
對於絕大多數人來說,這很簡單:如果您的手機是 2019 年或更高版本的,則假設使用 arm64-v8a 並繼續。如果您想確定,或者您正在使用舊的或不尋常的設備,有一些實用的選擇:
- 尋找手機的確切晶片組型號(在包裝盒上、手冊中或在 GSMArena 等網站上可見)並蒐索該晶片組是 32 位元還是 64 位元 ARM。
- 安裝一個直接報告 CPU 架構的輕量級系統資訊應用程序,有幾個專門用於此目的的免費應用程式。
- 檢查手機原始作業系統版本是否為Android 9或更高版本; Google 在那個時代的 64 位元要求使得 arm64-v8a 基本上保證了任何符合條件的東西。
如何檢查 APK 支援哪些架構
在從 Play 商店外部安裝檔案之前,值得確認其中的內容而不是猜測。 APK 的本機程式庫位於 lib/ 目錄中以其架構命名的資料夾中,例如 lib/arm64-v8a/ 或 lib/armeabi-v7a/。任何可以檢查 APK 內部結構的工具都可以準確地告訴您存在哪些資料夾,從而準確地告訴您該檔案將在哪些裝置上運行。
安裝前檢查
我們的 APK資訊工具 讀取 APK 的內部 lib/ 資料夾並列出其建置的每個架構,因此您可以在旁加載任何內容之前確認相容性。當您使用我們的 XAPKS 到 APK 轉換器 轉換拆分包時,我們也會在每次轉換後自動顯示此信息,列出合併文件中找到的架構,並在構建似乎缺少常見設備所需的切片時對其進行標記。
通用 APK 與單一 ABI APK:您應該使用哪一個?
| 指標 | 通用/胖APK | 單一 ABI APK |
|---|---|---|
| 文件大小 | 更大,有時 2-4 倍 | 體積小,僅包含您的裝置所需的內容 |
| 相容性 | 幾乎適用於任何設備 | 僅適用於匹配的架構 |
| 最適合 | 共享一個應該在任何地方都可以使用的文件,不確定收件人 | 當您已經了解其架構時,您自己的設備 |
| 風險 | ABI 不符的風險非常低 | 如果你選錯了就會失敗或崩潰 |
人們在使用拆分包時常犯的錯誤
- 假設每個分割都是可選的。 密度和語言分裂通常是,但架構分裂不是;合併期間切勿跳過它。
- 僅取得從鏡像網站分離的一種架構。 如果第三方下載僅提供 armeabi-v7a 切片,則它可能會在需要 arm64-v8a 的裝置上失敗,即使應用程式本身是合法的。
- 忘記平板電腦和 Chromebook 並不總是 ARM。 大量運行 Android 應用程式的 Chromebook 以及一些較舊的平板電腦都是 x86 或 x86_64,而不是 ARM。
- 在 x86 模擬器中測試純 ARM APK。 一些較舊的模擬器版本在 x86 上運行,並且僅附帶 ARM 本機庫的 APK 根本無法在其中啟動,無論 APK 如何打包。
- 將“通用”與“單一 ABI”混淆。 通用 APK 故意更大,因為它包含所有內容;單 ABI APK 很小,並且有意限制為一個晶片系列。
重點
- ABI 是晶片可以理解的指令集;它僅對包含本機 (C/C++) 程式碼的應用程式很重要。
- arm64-v8a 幾乎涵蓋所有現代手機; armeabi-v7a 適用於較舊的設備; x86/x86_64 主要出現在模擬器和 Chromebook 中。
- 應用程式通常按架構劃分,以避免將不必要的本機程式碼傳送到每個裝置。
- 不匹配的體系結構要么完全阻止安裝,要么在看似成功的安裝後立即導致崩潰。
- 您可以在安裝任何內容之前檢查設備的架構和 APK 支援的架構,從而完全避免猜測。
常見問題解答 (FAQ)
我需要知道手機的架構才能安裝普通的 Play 商店應用程式嗎?
不會。 Play 商店會自動偵測您的設備,並僅提供相符的架構拆分,因此只有當您從 Play 商店外部載入 APK 時,這才會變得相關。
一個APK可以同時支援多種架構嗎?
是的。通用或胖 APK 將每個受支援架構的本機庫捆綁在一個檔案中。它更大,但可以安裝在任何相容設備上,無論晶片如何。
為什麼我轉換後的 APK 安裝後立即崩潰?
當應用程式有少量可正常安裝的 Java 程式碼,但隨後嘗試載入裝置架構中未包含的本機程式庫,從而在執行時間引發 UnsatisfiedLinkError 時,通常會發生這種情況。
arm64-v8a 是否向後相容於 armeabi-v7a 應用程式?
一般來說是的。大多數arm64-v8a晶片也可以執行32位元ARM指令,因此僅armeabi-v7a的APK通常仍然可以在現代arm64手機上運行,而不是相反。
2026 年 x86 Android 裝置仍然存在嗎?
如今,它們在手機中很少見,但您仍然可以在一些基於 Intel 的舊平板電腦、少數運行 Android 應用程式的 Chromebook 以及大多數桌面 Android 模擬器中找到 x86 或 x86_64。
你不需要記住這些。簡而言之:現代手機幾乎都是arm64-v8a,應用程式按架構劃分以節省空間,如果某些東西在打開後拒絕安裝或崩潰,架構不匹配是在假設文件本身損壞之前首先值得排除的事情之一。