主頁 > 移動端開發 > ??Android Apk 的打包程序 ?? 只需兩幅圖

??Android Apk 的打包程序 ?? 只需兩幅圖

2021-09-18 14:43:59 移動端開發

官方介紹

在分析安裝程序之前,需要先了解一下 Android 專案是如何經過編譯->打包生成最終的 .apk 格式的安裝包,谷歌有一張官方圖片來描述 apk 的打包流程,如下圖所示,

Android 應用模塊的構建程序(如上圖所示)遵循以下一般步驟:

  • 1、編譯器將你的源代碼轉換為 DEX(Dalvik 可執行檔案)檔案,其中包括在 Android 設備上運行的位元組碼,以及其他所有內容到編譯資源中,

  • 2、APKPackager將DEX檔案和編譯后的資源組合成一個APK,但是,在將你的應用安裝并部署到Android設備之前,必須對APK進行簽名,

  • 3、APKPackager使用除錯或發布密鑰庫對你的 APK 進行簽名:
    • 3.1如果你正在構建應用程式的除錯版本,即你打算僅用于測驗和分析的應用程式,則打包程式會使用除錯密鑰庫對你的應用程式進行簽名,Android Studio 使用除錯密鑰庫自動配置新專案,

    • 3.2如果你正在構建你打算在外部發布的應用程式的發布版本,則打包程式會使用發布密鑰庫對你的應用程式進行簽名,

  • 4、在生成最終的 APK 之前,打包程式使用zipalign工具來優化你的應用程式,以便在設備上運行時使用更少的記憶體,

在構建程序結束時,你將擁有應用的除錯 APK 或發布 APK,可用于部署、測驗或發布給外部用戶,

以上是官方介紹,下面咱開始自己的理解,

自我救贖

開始新專案時,Android Studio 會自動為您創建其中的部分檔案,并為其填充合理的默認值,所以不管一個完整的 Android 專案可能包含多個 module,而從宏觀上看每一個 module 中的內容可以分為 2 部分:

  • Resources 資源檔案

  • Java 或者 Kotlin 源代碼

因此整個專案的編譯打包程序也是針對這 2 部分來完成,如下圖:

編譯階段

Resources 資源檔案

資源檔案包括專案中 res 目錄下的各種 XML 檔案、影片、drawable 圖片、音視頻等,AAPT 工具負責編譯專案中的這些資源檔案,所有資源檔案會被編譯處理,XML 檔案(drawable 圖片除外)會被編譯成二進制檔案,所以解壓 apk 之后無法直接打開 XML 檔案,但是 assets 和 raw 目錄下的資源并不會被編譯,會被原封不動的打包到 apk 壓縮包中,

資源檔案編譯之后的產物包括兩部分:resources.arsc 檔案和一個 R 檔案,前者保存的是一個資源索引表,后者定義了各個資源 ID 常量,這兩者結合就可以在代碼中找到對應的資源參考,如 下圖 檔案:

可以看出,R 檔案 中的資源 ID 是一個 4 位元組的無符號整數,用 16 進制表示,其中,最高的 1 位元組表示 Package ID,次高的 1 個位元組表示 Type ID,最低的 2 位元組表示 Entry ID,

resources.arsc 相當于一個資源索引表,也可以理解為一個 map 映射表,其中 map 的 key 就是 R.java 中的資源 ID,而 value 就是其對應的資源所在路徑,實際上 resources.arsc 里面還有其他資訊,關于 resource.arsc 的決議可以參考 決議編譯之后的Resource.arsc檔案格式,

原始碼部分

專案中的源代碼首先會通過 javac 編譯為 .class 位元組碼檔案,然后這些 .class 檔案連同依賴的三方庫中的 .class 檔案一同被 dx 工具優化為 .dex 檔案,如果有分包,那么也可能會生成多個 .dex 檔案,

實際上源代碼檔案也包括 AIDL 介面檔案編譯之后生成的 .java 檔案,Android 專案中如果包含 .aidl 介面檔案,這些 .aidl 檔案會被編譯成 .java 檔案,

打包階段

最后使用工具 APK Builder 將經過編譯之后的 resource 和 .dex 檔案一起打包到 apk 中,實際上被打包到 apk 中的還有一些其他資源,比如 AndroidManifest.xml 清單檔案和三方庫中使用的動態庫 .so 檔案,

APK檔案結構

APK(Android Package),可以看做是一個zip壓縮包,可以將.apk改為.zip解壓,其檔案結構如下:

  • assert:存放的原生資源檔案,通過AssetManager類訪問

  • lib:native庫檔案

  • META-INF:存放簽名資訊,用來保證APK包的完整性和系統的安全,系統安裝APK時,應用管理器會按照對應演算法對包里檔案做校驗,如果校驗結果與META-INF中內容不一致,則不會安裝這個APK,
    • CERT.SF:生成每個檔案相對的密鑰

    • MANIFEST.MF:數字簽名資訊

  • res:種資源檔案系統會在R.java里面自動生成該資源檔案的ID,所以訪問這種資源檔案比較簡單,通過R.XXX.ID即可

  • AndroidManifest.xml:每個應用都必須定義和包含,描述應用的名字、版本權限、參考的庫檔案等資訊,apk中的AndroidManifest.xml經過壓縮,可以通過AXMLPrinter2工具解開,

  • classes.dex:是JAVA原始碼編譯后生成的JAVA位元組碼檔案,但Android使用的dalvik虛擬機與標準的JAVA虛擬機不兼容,dex檔案與class檔案相比,不論是檔案結構還是opcode都不一樣,

  • resources.arsc:編譯后的二進制資源檔案, apk 創建好之后,還不能直接使用,需要使用工具 jarsigner 對其進行簽名,因為 Android 系統不會安裝沒有進行簽名的程式,簽名之后會生成 META_INF 檔案夾,此檔案夾中保存著跟簽名相關的各個檔案,

PackageManagerService(PMS) 在安裝程序中會檢查 apk 中的簽名證書的合法性,具體內容稍后介紹,

常理來說,簽名之后的 apk 應該是可以正常安裝使用了,但是實際打包程序還會多一步使用工具 zipalign 對 apk 優化操作,

zipalign:是一種 zip 歸檔檔案對齊工具,它對 apk 中的未壓縮資源(圖片、視頻等)進行對齊操作,相對于檔案開頭都是對齊的,這樣一來,你便可直接通過 mmap(2) 訪問這些檔案,而無需在 RAM 中復制相關資料并減少了應用的記憶體用量,

在將 APK 檔案分發給最終用戶之前,應該先使用 zipalign 進行優化,如果你使用 Android Studio 進行構建,則此步驟會自動完成,

mmap(2):mmap, munmap - 將檔案或設備映射或取消映射到記憶體中,

至此一個完整的 apk 安裝包就創建成功,

整個編譯打包流程可以用下圖來描述:

AIDL:AIDL 是 Android 中 IPC(Inter-Process Communication,行程間通信)方式中的一種,AIDL是Android Interface definition language的縮寫,對于小白來說,AIDL的作用是讓讓你可以在自己的 APP 里系結一個其他 APP 的Service,這樣你的 APP 可以和其他 APP 互動,

注意:只有在需要不同應用的客戶端通過 IPC 方式訪問服務,并且希望在服務中進行多執行緒處理時,你才有必要使用 AIDL,如果你無需跨不同應用執行并發 IPC,則應通過實作 Binder 來創建介面;或者,如果你想執行 IPC,但不需要處理多執行緒,請使用 Messenger 來實作介面, 無論如何,在實作 AIDL 之前,請你務必理解系結服務(系結服務是 Service 類的實作,可讓其他應用與其進行系結和互動,),

AAPT2:會決議資源、為資源編制索引,并將資源編譯為針對 Android 平臺進行過優化的二進制格式,

javac:將所有 .java 檔案 (包括 R 檔案和 aidl 生成的 .java 檔案),通過 javac 工具生成 .class 檔案

dx .class 檔案連同依賴的三方庫中的 .class 檔案一同被 dx 工具優化為 .dex 檔案

Apk 已經打包好了,接下來看一下 PackageManagerService 是如何將其安裝到設備中的這個下文給到,

相關推薦

Android Gradle 詳解

Android apk 包體積優化

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/301078.html

標籤:其他

上一篇:Unity WebView 插件??(一)3D WebView 插件 基本介紹

下一篇:Android系統編程入門系列之應用資料檔案化保存

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more