Apk檔案是Android上的安裝檔案,一個Android安裝包包含了與該應用程式相關的所有檔案。
Apk檔案本質上是一個zip包,包括AndroidManifest.xml檔案、應用程式代碼(.dex檔案)、資源檔等。
其中AndroidManifest.xml檔案位於根目錄下,主要包括以下各個元素:
1、包名(package):若沒有指定apk的檔案名稱,編譯後程式包將以應用內Java主程式包的包名命名。
2、認證(certificate):指定應用程式所授予的信任層級,目前的認證層級包括platform(system)、shared、media以及應用自訂認證。
3、許可權組(permission-group):許可權組的定義是為了描述一組具有共同特性的許可權。
4、許可權(permission):許可權用來描述是否擁有做某件事的權力。Android系統中的許可權是分級的,分為普通層級(normal)、危險層級(dangerous),簽名層級(signature)和系統/簽名層級(signature or system)。
系統中所有預定義的許可權根據作用的不同,分別屬於不同的層級。對於normal和dangerous層級的許可權,稱之為低級許可權,應用申請即授予;其他兩級許可權,稱之為進階許可權或系統許可權,應用擁有platform層級的認證才能申請,當應用試圖在沒有許可權的情況下做受限操作時,應用將被系統殺掉以示警。
5、許可權樹(permission-tree):許可權樹的設定是為了統一管理一組許可權,聲明於該樹下的許可權所有者歸屬該應用。系統提供了API,應用可以在運行時動態添加:PackageManager.addPermission()
6、使用許可權(uses-permission):應用需要的許可權應當在此處申請,所申請的許可權應當被系統或某個應用所定義,否則視為無效申請。同時使用許可權的申請需要遵循許可權授予條件,非platform認證的應用無法申請進階許可權。
7、SDK(uses-sdk):標識本應用啟動並執行SDK版本,高相容性的應用可以忽略此項。
8、Application:Application是Android應用內最進階別(top level)的模組,每個應用內最多隻能有一個application,如果應用沒有指定該模組,一個預設的application將被啟用,application在應用啟動時最先被載入,並存活在應用的整個運行時生命週期。因此一些初始化的工作適合在本模組完成。Application元素有許多屬性,其中“persistent”表示本應用是否常駐記憶體,“enable”表示本應用當前是否應當被載入。
9、Activity:Activity是application模組運行時的子項目,標識了一個UI。一個應用可以聲明並實現零至多個其他運行時模組,包括activity,activity通過增加intent-filter來標識哪些intent可以被處理,同時intent也是調度activity的主要參數。
10、Receiver:Receiver也是application運行時的子項目,receiver通過增加intent-filter來標識他需要接受哪些intent。當收到intent後,receiver將根據不同的intent進行不同的處理。當一個intent發出後,所有註冊了該intent的receiver都將會收到,系統會根據receiver在系統中的註冊次序順序發送;當一個receiver有多個未接收的intent時,將按照intent發送的次序順序接收。
11、Service:Service也是application的運行時子項目,屬於後台模組,啟動後將長時間運行,除非停止該service或所在應用進程被殺死。
12、Provider:Provider也是application的運行時字元素,繼承與ContentProvider,是對該應用管理的使用者資料的結構化接入,是基於資料庫操作方式的封裝。如果應用允許外部應用訪問/管理它的使用者資料,provider是android平台提供的最佳方式。
13、Activity-alias:已有activity的別名。
14、Uses-library:標識應用啟動所必須的共用庫。
AndroidManifest.xml的結構大綱:
<manifest> 檔案根節點, 描述了程式包的所有內容. <uses-permission> 請求一個安全授權, 必須被授予該許可權, 您的程式包才能正確的操作. 0~N <permission> 聲明一個安全授權, 用來限制哪些應用可以訪問您的程式包內的組件和特有機制. 0~N <instrumentation> <application> 描述程式包內應用層級組件的根節點. 該節點能夠描述應用程式的全域(和/或)預設屬性, 例如標籤, 表徵圖, 主題, 需要的授權, 等等.包含零個或一個這樣的節點 <activity> Activity 是應用於使用者互動的最主要機制. 當一個應用啟動並執行時候, 使用者看到的第一個螢幕就是activity, 並且, 使用者所使用的其他絕大多數螢幕(介面)也會是 <intent-filter> <action> <category> <type> <scheme> <authority> <path> <receiver> 一個IntentReceiver 可以讓應用接收到一次資料變化和一次行為發生的通知, 甚至這個應用沒有在運行也可以. 同activity 標籤一樣, 你可以選擇包含一個或多個<intent-filter>元素 <service>Service 是一個在後台任意時刻都可以啟動並執行組件. 同activity 標籤一樣, 你可以選擇包含一個或多個<intent-filter>元素 <provider>ContentProvider組件是用來管理資料持久化及資料發布的, 發布的資料可以被其他的應用訪問.