【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )
文章目錄
- 一、APK 文件結(jié)構(gòu)
- 二、APK 打包流程
- 三、APK 安裝流程
- 四、安卓虛擬機
一、APK 文件結(jié)構(gòu)
Android 應(yīng)用的安裝包時 以 " .apk " 為后綴的 APK 文件 ;
APK 是 " Android Package " 的縮寫 ;
將打包好的 APK 文件安裝到 Android 手機中 , 就是可運行的應(yīng)用程序 ;
APK 文件結(jié)構(gòu) :
① assets : 資源文件 , 該目錄下的資源文件不經(jīng)過 aapt 工具編譯 ;
② lib : 存放 動態(tài)庫 “.so” 文件 , NDK 中 C / C++ 調(diào)用的函數(shù)庫 ;
③ META-INF : 該目錄中存放 apk 的簽名文件 ;
- CERT.SF : 摘要加密 , 使用私鑰 對 摘要明文 加密后的 密文信息 , 是加密文件 , 如果要解密該文件 , 必須使用與私鑰配對的公鑰進行解密 ;
- CERT.RSA : 文件是簽名證書文件 , 存放的是公鑰和加密算法的描述 ;
- MANIFEST.MF : 文件摘要 , 存放程序清單文件 , 包含了 APK 安裝包 中所有文件的 摘要明文 ;
- 剩余文件 : 都是可忽略的資源文件 ;
④ res : 資源文件 , 經(jīng)過了 aapt 工具編譯后的文件 ; 這個目錄下的文件不再介紹 , 太熟悉了 ;
⑤ AndroidManifest.xml : 清單文件 , 聲明了 Application , 組件 , 權(quán)限 , 元數(shù)據(jù) 等信息 ;
⑥ classes.dex : Dalvik 字節(jié)碼文件 , Android 中的可執(zhí)行文件 , 可以在 Android 系統(tǒng)中運行 ;
⑦ resources.arsc : 資源文件映射表 , 使用 aapt 編譯 res 目錄下的資源文件形成的文件 , 用于根據(jù) id 查找資源路徑 ;
二、APK 打包流程
APK 打包流程 :
① 使用 AAPT 工具打包資源文件 , 生成 R.java , resources.ap 文件 ;
② 使用 AIDL tool 工具 , 處理 AIDL 文件 , 生成對應(yīng)的 Java 文件 ;
③ 使用 javac 工具編譯 Java 源碼為 class 字節(jié)碼文件 ;
④ 使用 dx 工具將 class 字節(jié)碼文件打包成 dex 字節(jié)碼文件 , 這是 Dalvik 虛擬機字節(jié)碼文件 ;
⑤ 使用 apkbuilder 工具生成未簽名的 apk 文件 ;
⑥ 使用 jarsigner 工具對 apk 文件進行簽名 , 生成簽名后的文件 ;
⑦ 使用 zipalign 工具對簽名后的 apk 文件進行對齊操作 ;
三、APK 安裝流程
APK 444 種安裝方式 :
① 系統(tǒng)程序安裝 ;
② 使用應(yīng)用市場安裝 ;
③ 手機自帶安裝 ;
④ 使用 ADB 調(diào)試工具安裝 ;
APK 安裝流程 :
① 將 APK 安裝包復(fù)制到 /data/app 目錄下解壓 , 掃描安裝包 ;
② 將 dex 文件保存 /data/dalvik-cache 目錄中 ;
③ 在 /data/data/包名 下創(chuàng)建對應(yīng) apk 包名的應(yīng)用數(shù)據(jù)目錄 ;
系統(tǒng)自帶程序在 /system/app 目錄下 , 獲得 adb root 權(quán)限后才能刪除 ;
應(yīng)用卸載 , 就是將 /data/app/ , /data/dalvik-cache/ , /data/data/ 等目錄下的相關(guān)文件刪除 ;
四、安卓虛擬機
虛擬機是一個可以運行 class , odex , oat 可執(zhí)行文件的運行環(huán)境 ;
常見的虛擬機有 Java 虛擬機 , Dalvik 虛擬機 , ART 虛擬機 ;
Java 虛擬機 :
運行的 class 字節(jié)碼文件 , 運行程序時解碼 class 文件中的內(nèi)容 ;
基于棧架構(gòu) , 需要頻繁在棧上讀寫數(shù)據(jù) , 造成較多的指令分派 , 更多的內(nèi)存訪問次數(shù) , 比較耗費 CPU 時間 ;
編譯時 : Java 源碼 , 使用 javac 編譯器 , 編譯成 class 字節(jié)碼文件 ;
運行時 : 類加載器通過 Java 類庫驗證字節(jié)碼 , 驗證通過會后進入 Java 虛擬機 , 進入 Java 解釋器 或 即時編譯器 , 然后進入運行時系統(tǒng) , 之后進入操作系統(tǒng) , 然后調(diào)用硬件 ;
Dalvik 虛擬機 :
基于 JIT 機制 ( 即時編譯技術(shù) ) , Android 5.05.05.0 以下使用的虛擬機是 Dalvik 虛擬機 , 該虛擬機的可執(zhí)行文件是 dex 文件 , 該文件比 class 字節(jié)碼文件更小 ;
JIT ( Just In Time ) 即時編譯技術(shù) , 對應(yīng) Dalvik 虛擬機 ;
基于寄存器架構(gòu) , 通過寄存器間接訪問數(shù)據(jù) , 該方式比基于棧架構(gòu)速度更快 ;
ART 虛擬機 :
Android 5.05.05.0 以上使用的虛擬機是 ART 虛擬機 ;
AOT ( Ahhead Of Time ) 預(yù)編譯技術(shù) , 對應(yīng) ART 虛擬機 ;
Java 虛擬機 / Dalvik 虛擬機 / ART 虛擬機 都向上層提供了 333 個接口 ,
JNI_GetDefaultJavaVMInitArgs
JNI_CreateJavaVM
JNI_GetCreatedJavaVMS ;
虛擬機之間可實現(xiàn)無縫銜接 ;
Dalvik 虛擬機 與 ART 虛擬機區(qū)別 : 虛擬機中有個 persist.sys.dvlvik.vm.lib 字段 ,
如果該字段存儲的是 libdvm.so , 該虛擬機是 Dalvik 虛擬機 ;
如果該字段存儲的是 ;ibart.so , 該虛擬機是 ART 虛擬機 ;
Dalvik 虛擬機 與 ART 虛擬機可執(zhí)行文件 :
Dalvik 虛擬機加載 dex 文件加載時不是直接加載 dex 文件 , 加載執(zhí)行的是 odex 文件 , odex 文件是通過 dexopt 工具對 dex 進行優(yōu)化生成的 ;
ART 虛擬機加載 dex 文件時加載的是 oat 文件 , oat 文件時通過 dex2oat 工具對 dex 文件進行優(yōu)化生成的 ;
總結(jié)
以上是生活随笔為你收集整理的【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 插件化】“ 插桩式 “
- 下一篇: 【FFmpeg】Windows 搭建 F