Android APK組成編譯打包流程詳解

Android APK(Android Package)是 Android 應用的安裝包文件,其組成和打包流程涉及多個步驟和文件結構。以下是詳細的說明:


一、APK 的組成

APK 是一個 ZIP 格式的壓縮包,包含應用運行所需的所有文件。解壓后主要包含以下內容:

  1. classes.dex

    • 由 Java/Kotlin 代碼編譯后的 Dalvik/ART 字節碼文件。

    • 如果方法數超過 65536,會生成多個?classes2.dexclasses3.dex?等(需啟用 MultiDex)。

  2. resources.arsc

    • 編譯后的二進制資源索引表,包含字符串、布局、顏色等資源的映射關系,用于快速查找資源。

  3. AndroidManifest.xml

    • 應用的配置文件(二進制格式),聲明包名、權限、組件(Activity/Service 等)、最低 SDK 版本等。

  4. res/?目錄

    • 存放編譯后的資源文件(圖片、布局 XML、動畫等),原始 XML 會被編譯為二進制格式以優化讀取效率。

  5. assets/?目錄

    • 存放原始資源文件(如字體、配置文件),通過?AssetManager?直接訪問,不參與資源 ID 生成。

  6. lib/?目錄

    • 存放原生庫(.so?文件),按 CPU 架構分目錄(如?armeabi-v7a,?arm64-v8a,?x86)。

  7. META-INF/?目錄

    • 包含應用簽名信息(MANIFEST.MF,?CERT.SF,?CERT.RSA),用于驗證 APK 完整性。

  8. kotlin/?目錄

    • 如果使用 Kotlin,會包含 Kotlin 標準庫的相關文件。

  9. 其他文件

    • 如 ProGuard/R8 生成的映射文件(mapping.txt)、AAPT2 生成的資源映射等。


二、APK 打包流程

Android 應用的構建流程通過 Gradle 和 Android 構建工具鏈(如 AAPT2、D8、R8 等)完成,主要步驟如下:

1. 資源處理
  • 工具:AAPT2 (Android Asset Packaging Tool)

    • 編譯?res/?下的資源文件(XML、圖片等),生成?resources.arsc?和二進制 XML。

    • 生成?R.java?文件,為每個資源分配唯一 ID。

2. 代碼編譯
  • Java/Kotlin 編譯

    • 將 Java/Kotlin 源代碼編譯為?.class?文件(javac?或?kotlinc)。

  • DEX 轉換

    • 使用?D8 或 R8 工具?將?.class?文件轉換為 Android 虛擬機所需的?.dex?文件,優化字節碼并可能啟用代碼混淆(通過 R8)。

3. 資源與代碼合并
  • 工具:Android Gradle Plugin

    • 合并所有模塊的資源文件,處理資源沖突。

    • 將?classes.dexresources.arsclib/assets/?等文件打包到臨時 APK 中。

4. 原生庫處理
  • 將 JNI 庫(.so?文件)按 CPU 架構分類,并打包到 APK 的?lib/?目錄。

5. APK 簽名
  • 工具:apksigner?或?jarsigner

    • 使用開發者密鑰對 APK 進行簽名,確保應用來源可信且未被篡改。

    • 生成?META-INF/?目錄下的簽名文件。

6. APK 對齊優化
  • 工具:zipalign

    • 對 APK 中的未壓縮文件進行內存對齊(4 字節邊界),提升運行時加載效率。

    • zipalign 主要工作是將apk包進行對齊處理。使apk包中的所有資源文件,起始偏移為4字節的整數倍,這樣通過mmap內存映射訪問apk時的速度會更快。

工具名稱功能介紹在操作系統中的路徑
aaptAndroid資源打包工具${ANDROID_SDK_HOME}/build-tools/30.0.0/aapt
aidlAndroid接口描述語言轉化為.java文件的工具${ANDROID_SDK_HOME}/build-tools/30.0.0/aidl
javacjava Compiler java代碼轉class文件${JDK_HOME}/javac或/usr/bin/javac
dex轉化.class文件為Davik VM能識別的.dex文件${ANDROID_SDK_HOME}/build-tools/30.0.0/dx
apkbuilder生成apk包???沒有找到
jarsigner.jar文件的簽名工具${JDK_HOME}/jarsigner或/usr/bin/jarsigner
zipalign字節碼對齊工具${ANDROID_SDK_HOME}/tools/zipalign

三、詳細構建流程圖

源代碼 (Java/Kotlin)  --> 編譯 --> .class 文件 --> D8/R8 --> classes.dex
資源文件 (res/, assets/) --> AAPT2 --> resources.arsc + 二進制 XML
原生庫 (JNI) --> 按架構分類打包到 lib/
合并所有文件 --> 未簽名 APK --> 簽名 --> 簽名后的 APK --> zipalign 對齊 --> 最終 APK

四、構建工具鏈演進

  • AAPT → AAPT2:支持增量資源編譯,提升構建速度。

  • DX → D8:更快的 DEX 編譯,更好的字節碼優化。

  • ProGuard → R8:將代碼壓縮(Shrinking)、優化(Optimization)、混淆(Obfuscation)與 DEX 編譯合并為一步。


五、優化與擴展

  • Android App Bundle (AAB):Google 推出的動態分發格式,按設備配置生成優化后的 APK。

  • Split APKs:根據屏幕密度、ABI 等拆分 APK,減少用戶下載體積。

  • 資源混淆:通過工具(如 AndResGuard)對資源文件名進行混淆,進一步縮減 APK 體積。


六、虛擬機演進

虛擬機是一個可以運行 class , odex , oat 可執行文件的運行環境 ;

常見的虛擬機有 Java 虛擬機、Dalvik 虛擬機?、?ART 虛擬機 ;

Java 虛擬機 : 運行的 class 字節碼文件 , 運行程序時解碼 class 文件中的內容 ; 基于棧架構 , 需要頻繁在棧上讀寫數據 , 造成較多的指令分派 , 更多的內存訪問次數 , 比較耗費 CPU 時間 ;

編譯時 : Java 源碼 , 使用 javac 編譯器 , 編譯成 class 字節碼文件 ; 運行時 : 類加載器通過 Java 類庫驗證字節碼 , 驗證通過會后進入 Java 虛擬機 , 進入 Java 解釋器 或 即時編譯器 , 然后進入運行時系統 , 之后進入操作系統 , 然后調用硬件 ;

Dalvik 虛擬機 : 基于 JIT 機制 ( 即時編譯技術 )?

Android 5.0 以下使用的虛擬機是 Dalvik 虛擬機 , 該虛擬機的可執行文件是 dex 文件 , 該文件比 class 字節碼文件更小 ; JIT ( Just In Time ) 即時編譯技術 , 對應 Dalvik 虛擬機 ; 基于寄存器架構 , 通過寄存器間接訪問數據 , 該方式比基于棧架構速度更快 ;

ART 虛擬機 :

Android 5.0 以上使用的虛擬機是 ART 虛擬機 ; AOT ( Ahhead Of Time ) 預編譯技術 , 對應 ART 虛擬機 ; Java 虛擬機 / Dalvik 虛擬機 / ART 虛擬機 都向上層提供了 3 個接口JNI_GetDefaultJavaVMInitArgs JNI_CreateJavaVM JNI_GetCreatedJavaVMS ; 虛擬機之間可實現無縫銜接 ;

Dalvik 虛擬機 與 ART 虛擬機區別 : 虛擬機中有個 persist.sys.dvlvik.vm.lib 字段 , 如果該字段存儲的是 libdvm.so , 該虛擬機是 Dalvik 虛擬機 ; 如果該字段存儲的是 ;ibart.so , 該虛擬機是 ART 虛擬機 ;

Dalvik 虛擬機 與 ART 虛擬機可執行文件 :

Dalvik 虛擬機加載 dex 文件加載時不是直接加載 dex 文件 , 加載執行的是 odex 文件 , odex 文件是通過 dexopt 工具對 dex 進行優化生成的 ;

ART 虛擬機加載 dex 文件時加載的是 oat 文件 , oat 文件時通過 dex2oat 工具對 dex 文件進行優化生成的 ;


通過理解 APK 的組成和打包流程,開發者可以更好地優化應用性能、調試構建問題,并掌握高級構建技術(如模塊化、動態交付)。

參考:

1. 深入詳解Apk編譯打包流程

2.?APK 打包流程 ( 文件結構 | 打包流程 | 安裝流程 | 安卓虛擬機 )

3.?Android 打包流程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70915.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70915.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Token相關設計

文章目錄 1. 雙Token 機制概述1.1 訪問令牌(Access Token)1.2 刷新令牌(Refresh Token) 2. 雙Token 認證流程3. Spring Boot 具體實現3.1 生成 Token(使用 JWT)3.2 解析 Token3.3 登錄接口(返回…

HTTP 請求時傳遞多部分表單數據

HTTP 請求時傳遞多部分表單數據(multipart/form-data) --data-raw $------demo11111\r\nContent-Disposition: form-data; name"Filedata"; filename"截屏2025-02-27 15.45.46.png"\r\nContent-Type: image/png\r\n\r\n\r\n------d…

Java基礎關鍵_013_日期處理

目 錄 一、傳統 API 1.System.currentTimeMillis() (1)說明 (2)實例 2.構造方法 (1)說明 (2)無參構造 (3)有參構造 3.日期格式化 (1&am…

51單片機中reg52.h與regx52.h在進行位操作時的不同

reg52.h中不能使用例如 P2_0;這樣的定義 而只能使用 P2^0;這樣的定義 但是都不可以對位進行直接賦值操作; 而 regx52.h中可以使用 P2_0和P2^0;但是只有使用下劃線的才可以對位進行賦值操作 例如P2_0 1; 但不可以是P2^0 1; 在 C 語言中,…

基于Rook的Ceph云原生存儲部署與實踐指南(上)

#作者:任少近 文章目錄 1 Ceph環境準備2 rook部署ceph群集2.1 Rook 幫助地址2.2 安裝ceph2.3 獲取csi鏡像2.4 Master參加到osd2.5 設置默認存儲 3 Rook部署云原生RBD塊存儲3.1 部署storageclass資源3.2 部署WordPress使用RBD3.3 WordPress訪問 4 Rook部署云原生RGW…

FastExcel與Reactor響應式編程深度集成技術解析

一、技術融合背景與核心價值 在2025年企業級應用開發中,大規模異步Excel處理與響應式系統架構的結合已成為技術剛需。FastExcel與Reactor的整合方案,通過以下技術協同實現突破性性能: 內存效率革命:FastExcel的流式字節操作與Re…

DeepSeek R1/V3滿血版——在線體驗與API調用

前言:在人工智能的大模型發展進程中,每一次新模型的亮相都宛如一顆投入湖面的石子,激起層層波瀾。如今,DeepSeek R1/V3 滿血版強勢登場,為大模型應用領域帶來了全新的活力與變革。 本文不但介紹在線體驗 DeepSeek R1/…

Spring Data JPA 中的分頁實現:從 BasePage 到 Pageable

文章目錄 Spring Data JPA 中的分頁實現:從 BasePage 到 Pageable背景:為什么需要分頁?認識 BasePage 類深入 toPageable() 方法1. 處理頁碼和頁面大小2. 處理排序方向3. 處理排序字段4. 生成 Pageable 對象 實戰:如何使用 BasePa…

Android Studio 新版本Gradle發布本地Maven倉庫示例

發布代碼到JitPack示例:https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2(Gradle 8.10.2 AGP 8.8.0 JDK17) 的本地 Maven 倉庫發布示例,包含aar和jar的不同配置: 1.…

python量化交易——金融數據管理最佳實踐——qteasy創建本地數據源

文章目錄 qteasy金融歷史數據管理總體介紹本地數據源——DataSource對象默認數據源查看數據表查看數據源的整體信息最重要的數據表其他的數據表 從數據表中獲取數據向數據表中添加數據刪除數據表 —— 請盡量小心,刪除后無法恢復!!總結 qteas…

Android中使用Robolectric測試點擊事件(不需要手機)

文章目錄 一、前言二、簡單示例三、參考文檔 一、前言 Robolectric 是一個由 Google 維護的開源 Android 測試框架,它允許你以 Android 運行時環境運行單元測試。 Robolectric 提供了一個模擬 Android 運行時環境,允許你測試你的代碼是否正確地使用 And…

Spring Boot 接口 JSON 序列化優化:忽略 Null 值的九種解決方案詳解

一、針對特定接口null的處理: 方法一:使用 JsonInclude 注解 1.1 類級別:在接口返回的 ?DTO 類或字段? 上添加 JsonInclude 注解,強制忽略 null 值: 類級別:所有字段為 null 時不返回 JsonInclude(Js…

ds回答-開源llm應用開發平臺

以下是幾個著名的開源 LLM 應用開發平臺,涵蓋不同場景和技術特點: 1. Dify 特點:低代碼 / 無代碼開發、支持 RAG 檢索、Agent 智能體、模型管理、LLMOps 全流程優化。核心功能:可視化工作流編排、數百種模型兼容(如 GP…

LDR6020 PD3.1 協議芯片在特定設備中的應用

在電子設備互聯互通的時代,芯片技術成為提升設備性能與功能的關鍵驅動力。LDR6020 PD3.1 協議芯片以其出色的性能,在 TYPE-C 臺式顯示器 / 便攜顯示器、一拖二快充線以及手機電腦轉接器等設備中展現出獨特價值,為用戶帶來更便捷、高效的使用體…

wzl-django學習

####################################################總的urls.py from django.contrib import admin from django.urls import path,include, re_path from django.views.static import serve from django.conf import settings from drf_yasg import openapi from drf_yas…

python -ssh學習

def exe_sshcmd(ip,username,userpswd,port,cmd): """ 功能:SSH登錄到指定設備,并執行對應的命令 入參:前四項為ssh登錄shell的ip和port,具備管理員權限的用戶名和密碼, cmd可以…

PDF處理控件Aspose.PDF教程:使用 Python 將 PDF 轉換為 TIFF

TIFF文件是高質量圖像的首選。它們廣泛用于印刷、存檔和圖形設計。企業通常需要轉換PDF文檔以獲得更好的兼容性。了解如何以編程方式執行此轉換可以節省時間和資源。在這篇教程中,我們將探討如何使用 Python 將 PDF 轉換為 TIFF。 本文涵蓋以下主題: P…

服務器IPMI用戶名、密碼批量檢查

背景 大規模服務器部署的時候,少不了較多的網管和監測平臺,這些平臺會去監控服務器的性能、硬件等指標參數,為了便于管理和控制,則需要給服務器IPMI帶外管理添加較多的用戶,這就需要對較多的服務器檢查所對應的IPMI用…

< 自用文兒 > Gobuster 暴力掃描工具與 SecLists 安全測試詞表集合

Ethice 道德問題 GFW 的保護下,很多的設備操作系統是停留在更老的版本,應用軟件也是,因此很多的漏洞沒有被修復。通訊沒有使用加密,例如網頁沒有使用 HTTPS 網站很多。幾乎是半裸的在網絡上等著被食。 不做惡是下限。 環境&…

【Cadence射頻仿真學習筆記】2.4GHz低噪放LNA仿真設計

課程分為3個部分, 一、LNA結構與噪聲優化方法 噪聲優化的方法是:限定功耗的噪聲和功率同時匹配噪聲匹配和功率匹配一般不會同時達到, 對于PCSNIM結構的噪聲分析,我們只需要了解與哪些參數有關優化思路是:1.信號源阻抗…