1. 程式人生 > >APK檔案結構和安裝過程

APK檔案結構和安裝過程

APK檔案結構

Android應用是用Java編寫的,利用Android SDK編譯程式碼,並且把所有的資料和資原始檔打包成一個APK (Android Package)檔案,這是一個字尾名為.apk的壓縮檔案,APK檔案中包含了一個Android應用程式的所有內容,是Android平臺用於安裝應用程式的檔案。APK就是一個zip壓縮包,解開這個APK包我們可以看到以下的結構:


Figure 1 APK檔案結構

1)       assets目錄:用於存放需要打包到APK中的靜態檔案,和res的不同點在於,assets目錄支援任意深度的子目錄,使用者可以根據自己的需求任意部署資料夾架構,而且res目錄下的檔案會在.R檔案中生成對應的資源ID,assets不會自動生成對應的ID,訪問的時候需要AssetManager類。

2)       lib目錄:這裡存放應用程式依賴的native庫檔案,一般是用C/C++編寫,這裡的lib庫可能包含4中不同型別,根據CPU型號的不同,大體可以分為ARM,ARM-v7a,MIPS,X86,分別對應著ARM架構,ARM-V7架構,MIPS架構和X86架構,這些so庫在APK包中的構成如下圖Figure2:


Figure 2 lib目錄結構

其中,不同的CPU架構對應著不同的目錄,每個目錄中可以放很多對應版本的so庫,且這個目錄的結構固定,使用者只能按照這個目錄存放自己的so庫。目前市場上使用的移動終端大多是基於ARM或者ARM-V7a架構的,X86和MIPS架構的移動智慧終端比較少,所以有些應用程式lib目錄下只包含armeabi目錄或者armeabi-v7a目錄,也就是說,這四個目錄要根據CPU的架構來選,而市面上ARM架構的手機佔大多數,所以一般的APK只包含ARM和ARM-V7a的so。

3)       res目錄:res是resource的縮寫,這個目錄存放資原始檔,存在這個資料夾下的所有檔案都會對映到Android工程的.R檔案中,生成對應的ID,訪問的時候直接使用資源ID即R.id.filename,res資料夾下可以包含多個資料夾,其中anim存放動畫檔案;drawable目錄存放影象資源;layout目錄存放佈局檔案;values目錄存放一些特徵值,colors.xml存放color顏色值,dimens.xml定義尺寸值,string.xml定義字串的值,styles.xml定義樣式物件;xml資料夾存放任意xml檔案,在執行時可以通過Resources.getXML()讀取;raw是可以直接複製到裝置中的任意檔案,他們無需編譯。

4)       META-INF目錄:儲存應用的簽名信息,簽名信息可以驗證APK檔案的完整性。AndroidSDK在打包APK時會計算APK包中所有檔案的完整性,並且把這些完整性儲存到META-INF資料夾下,應用程式在安裝的時候首先會根據META-INF資料夾校驗APK的完整性,這樣就可以保證APK中的每一個檔案都不能被篡改。以此來確保APK應用程式不被惡意修改或者病毒感染,有利於確保Android應用的完整性和系統的安全性。META-INF目錄下包含的檔案有CERT.RSA,CERT.DSA,CERT.SF和MANIFEST.MF,其中CERT.RSA是開發者利用私鑰對APK進行簽名的簽名檔案,CERT.SF,MANIFEST.MF記錄了檔案中檔案的SHA-1雜湊值。

5)       AndroidManifest.xml:是Android應用程式的配置檔案,是一個用來描述Android應用“整體資訊”的設定檔案,簡單來說,相當於Android應用向Android系統“自我介紹”的配置檔案,Android系統可以根據這個“自我介紹”完整地瞭解APK應用程式的資訊,每個Android應用程式都必須包含一個AndroidManifest.xml檔案,且它的名字是固定的,不能修改。我們在開發Android應用程式的時候,一般都把程式碼中的每一個Activity,Service,Provider和Receiver在AndroidManifest.xml中註冊,只有這樣系統才能啟動對應的元件,另外這個檔案還包含一些許可權宣告以及使用的SDK版本資訊等等。程式打包時,會把AndroidManifest.xml進行簡單的編譯,便於Android系統識別,編譯之後的格式是AXML格式,如下圖Figure3所示:


Figure 3 AXML格式

       axml頭:其中的axml頭是固定標識axml檔案的,其值固定時0x00080003。

axml檔案長度:標識axml檔案的大小。

StringDataSegment:xml檔案中所有字串型別儲存在此。

ResourceIdSegment:xml檔案中宣告的資原始檔ID保存於此。

XmlContentSegment:是xml的內容段,按照xml檔案中的結構依次排開,儲存xml的資料內容。

6)       classes.dex:

傳統的Java程式,首先先把Java檔案編譯成class檔案,位元組碼都儲存在了class檔案中,Java虛擬機器可以通過解釋執行這些class檔案。而Dalvik虛擬機器是在Java虛擬機器進行了優化,執行的是Dalvik位元組碼,而這些Dalvik位元組碼是由Java位元組碼轉換而來,一般情況下,Android應用在打包時通過AndroidSDK中的dx工具將Java位元組碼轉換為Dalvik位元組碼。dx工具可以對多個class檔案進行合併,重組,優化,可以達到減小體積,縮短執行時間的目的。dx工具的轉換過程如圖所示:


Figure 4 dx工具把.class檔案轉換成dex檔案

       如圖Figure 4,dx工具把每個.class檔案的每個區域的內容進行去重,重組,優化重排後生成dex檔案,生成的dex檔案可以在Dalvik虛擬機器執行,且速度比較快。

7)       resources.arsc:用來記錄資原始檔和資源ID之間的對映關係,用來根據資源ID尋找資源。Android的開發是分模組的,res目錄專門用來存放資原始檔,當在程式碼中需要呼叫資原始檔時,只需要呼叫findviewbyId()就可以得到資原始檔,每當在res資料夾下放一個檔案,aapt就會自動生成對應的ID儲存在.R檔案,我們呼叫這個ID就可以,但是隻有這個ID還不夠,.R檔案只是保證編譯程式不報錯,實際上在程式執行時,系統要根據ID去尋找對應的資源路徑,而resources.arsc檔案就是用來記錄這些ID和資原始檔位置對應關係的檔案。

APK安裝過程

Adroid的應用安裝涉及到如下幾個目錄:

/data/app:存放使用者安裝的APK的目錄,安裝時,把APK拷貝於此。

/data/data:應用安裝完成後,在/data/data目錄下自動生成和APK包名(packagename)一樣的資料夾,用於存放應用程式的資料。

/data/dalvik-cache:存放APK的odex檔案,便於應用啟動時直接執行。

具體安裝過程如下:

首先,複製APK安裝包到/data/app下,然後校驗APK的簽名是否正確,檢查APK的結構是否正常,進而解壓並且校驗APK中的dex檔案,確定dex檔案沒有被損壞後,再把dex優化成odex,使得應用程式啟動時間加快,同時在/data/data目錄下建立於APK包名相同的資料夾,如果APK中有lib庫,系統會判斷這些so庫的名字,檢視是否以lib開頭,是否以.so結尾,再根據CPU的架構解壓對應的so庫到/data/data/packagename/lib下。

APK安裝的時候會把DEX檔案解壓並且優化位odex,odex的格式如Figure 5圖所示:


Figure 5 odex檔案格式

odex在原來的dex檔案頭添加了一些資料,在檔案尾部添加了程式執行時需要的依賴庫和輔助資料,使得程式執行速度更快。


相關推薦

APK檔案結構安裝過程

APK檔案結構 Android應用是用Java編寫的,利用Android SDK編譯程式碼,並且把所有的資料和資原始檔打包成一個APK (Android Package)檔案,這是一個字尾名為.apk的壓縮檔案,APK檔案中包含了一個Android應用程式的所有內容,是

Android程式打包安裝過程apk安裝釋放檔案過程

一、Android程式打包&安裝的過程 用解壓縮軟體開啟-->>Helloworld.apk-->>META-INF目錄下,我們可以看到如下的目錄結構 這裡面的檔案

linux內核結構啟動過程

LINUX 內核 linux內核結構和啟動過程(以下內容來自教學課件)一、Linux內核結構arch與體系結構相關的代碼。對應於每個支持的體系結構,有一個相應的子目錄如x86、arm等與之對應,相應目錄下有對應的芯片與之對應drivers設備驅動代碼,占整個內核代碼量的一半以上,裏面的每個子目錄對應一

Linux系統openssl安裝步驟安裝過程問題解決

安裝步驟,首先解壓安裝檔案openssl-1.0.0d.tar ,然後進入目錄執行config命令 ./config --prefix=/home/alipms/lib/openssl  (64位作業系統:./config --prefix=/home/alipms/lib/

深度學習:深度信念網路(DBN)結構訓練過程

深度信念網路在處理維數比較多的資料時,可以起到壓縮資料維度的作用。其經典結構為: DBN由多個RBM堆疊而成,訓練過程由預訓練和微調構成 深度信念網路訓練步驟: (1)預訓練:分別單獨無監督的訓練每一層RBM網路,確保特徵向量對映到不同特徵空間,都儘可能的保留特徵資訊;它通過一個非監督

《C++語言程式設計基礎》學習類與物件之多檔案結構預編譯命令​​​​​​​

C++程式的一般組織結構: 一個工程可以劃分為多個原始檔,例如: 類宣告檔案(.h檔案) 類實現檔案(.cpp檔案) 類的使用檔案(main()所在的.cpp檔案) 利用工程來組合各個檔案。Point.h class Point { //類的定義 public:

Springboot檔案結構配置檔案

1.檔案結構 | -demo1-------------------------------------專案名稱 | | -.idea | | | -libraries | | | | -compiler.xml | |

【關於PyCharm安裝載入Pyecharts視覺化庫的方法安裝過程中出現的No Module Named XXX的解決方案】

作者:我是你的眼中花花花郵箱:[email protected] 原始碼安裝 $ git clone https://github.com/pyecharts/pyecharts.git $ cd pyecharts $ pip install -r re

xp系統安裝win10:不是有效的win32應用程式安裝過程的反覆重啟問題

在點選啟動程式安裝win10時,卻提示不是有效的win32程式,無法執行,下圖: 這時利用bios引導就可以實現安裝win10系統了。 額額額。。。還有 我在安裝win10的過程中總是重複這

vue 原始碼學習(一) 目錄結構構建過程簡介

Flow vue框架使用了Flow作為型別檢查,來保證專案的可讀性和維護性。vue.js的主目錄下有Flow的配置.flowconfig檔案,還有flow目錄,指定了各種自定義型別。 在學習原始碼前可以先看下Flow的語法 官方文件 目錄結構 vue.js原始碼主要在src下 src ├── com

vue 源碼學習(一) 目錄結構構建過程簡介

編譯 需求 類型檢查 fig文件 key 不同 time enc 來看 Flow vue框架使用了Flow作為類型檢查,來保證項目的可讀性和維護性。vue.js的主目錄下有Flow的配置.flowconfig文件,還有flow目錄,指定了各種自定義類型。 在學習源碼前可以先

MongoDB命令安裝過程

mysql 和Mongodb區別 MongoDB 一:基於分散式檔案儲存 二:高負載情況下新增更多節點 三:將資料儲存於一個文件   MogoDB對事物的支援比較弱 MogoDB運維慢 mongodb與mysql命令對比 傳統的關係資料庫一般由資料庫(database)、表(ta

解析Tomcat內部結構請求過程

<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.Versi

3.Springboot 之 檔案結構配置檔案

專案檔案結構 新建的Springboot專案的檔案結構如下: |-customer(專案名稱) | - src | | - main | | | - java | | | - resources | | | | - static |

Bootloader的結構啟動過程

CPU上電後,會在某個地址開始執行,比如MIPS結構的CPU會從0xBFC00000取第一條指令,而ARM結構的CPU則從0x00000000開始,嵌入式開發板中,需要把儲存器件ROM或Flash等對映到這個地址。而Bootloader就存在這個地址的開始處,這

dos只複製檔案結構目錄

XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W][/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U] [/K] [/N] [/O]

Matlab2014的下載安裝過程

1 下載Matlab2014,下載連結如下: 提取碼獲取方式:掃描下面二維碼關注微信公眾號,回覆關鍵字matlab 下載內容如下: 2 選擇一個orksMMlabR14a.part01進行解壓可以得到一個Matlab803的ISO檔案,對這個檔案進行解壓

ssm框架學習---mybatis學習檔案結構程式碼示例

準備工作:mybatis的jar包,資料庫的驅動包,日誌log4j和單元測試的包 開發模式:(1)基於原始dao開發,需要編寫dao介面和dao介面的實現類                     (2)基於mapper開發,只需編寫dao介面,但是需要遵守一定規範(對映檔

安卓專案的目錄結構專案安裝啟動過程描述

專案目錄說明: src:存放java程式的原始檔 gen:由開發工具自動生成的檔案。不是開發人員建立,工具自動建立。其中有一個R檔案,使用者等級各種資源的id,是由編譯器在編譯的時候指定的。R檔案會根據res下面各個資源的詳細情況進行一一描述,每一個資源都對應一個編號。R檔

Android APK安裝過程學習筆記

屏蔽 組成 學習 二進制 替換 壓縮包 基於 壓縮 方式 1.什麽是APK   APK,即Android Package,Android安裝包。不同平臺的安裝文件格式都不同,類似於Windows的安裝包是二進制的exe格式,Mac的安裝包是dmg格式。APK可以再Andro