定義:AndrodiManifest.xml文件爲Android程序的入口文件,而且是必須的,位於整個項目的根目錄下。拿到一個Android項目,能夠先從AndroidManifest.xml文件入手,進行分析。它提供了一些必要的信息,好比程序的入口Activity,其餘組件的聲明,權限的聲明,包名,版本信息等。php
Manifest能夠作如下事情:android
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<uses-permission />
<permission />
<permission-tree />
<permission-group />
<instrumentation />
<uses-sdk />
<uses-configuration />
<uses-feature />
<supports-screens />
<compatible-screens />
<supports-gl-texture />
<application>
<activity>
<intent-filter>
<action />
<category />
<data />
</intent-filter>
<meta-data />
</activity>
<activity-alias>
<intent-filter> . . . </intent-filter>
<meta-data />
</activity-alias>
<service>
<intent-filter> . . . </intent-filter>
<meta-data/>
</service>
<receiver>
<intent-filter> . . . </intent-filter>
<meta-data />
</receiver>
<provider>
<grant-uri-permission />
<meta-data />
<path-permission />
</provider>
<uses-library />
</application>
</manifest>複製代碼
清單文件的根元素,必須包含標籤,指定命名空間xmlns:android和package屬性app
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="string" android:sharedUserId="string" android:sharedUserLabel="string resource" android:versionCode="integer" android:versionName="string" android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
. . .
</manifest>複製代碼
xmlns:android,定義android命名空間,一般設置爲「schemas.android.com/apk/res/and… 關於xml的命名空間,能夠看這裏ide
package:不一樣的APP具備不一樣的包名。以Java包名風格進行命名,必須惟一。性能
sharedUserId:具備相同的uderId而且具備相同簽名的APP能夠共享和訪問彼此的數據,甚至能夠在同一個進程裏面運行,此時必須設置相同。測試
sharedUserLabel:給共享userId定義了用戶可讀標籤,只有設置了sharedUserId,此屬性纔有意義。ui
versionCode:內部版本號。必須是整數,Integer類型。用來判斷版本的升級,每一次發佈都必須必以前的要大。若是versionName沒有設置,則設置成此值。spa
versionName:展現給用戶看的版本號。爲String類型。設計
installLocation:設置apk文件的默認安裝路徑。code
聲明APP須要使用到的權限,Android5.1或如下在安裝的時候聲請,Android6.0或以上的須要運行時權限申請
<uses-permission android:name="string" android:maxSdkVersion="integer" />複製代碼
name:權限的名稱。能夠是系統定義的權限,也能夠是其餘應用的權限,或者是使用自定義的權限
maxSdkVersion:此申請的權限最高的做用Android版本。當一些權限在高版本無需申請的時候能夠設置此值,好比 WRITE_EXTERNAL_STORAGE,在API 19就不須要進行申請了,能夠進行以下操做
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />複製代碼
自定義權限,以限制訪問指定的組件或APP——本APP或其餘APP,起到保護的做用。
<permission android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" android:permissionGroup="string" android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />複製代碼
description:自定義的用戶可讀的權限描述,
icon:權限的icon圖標
label:展現給用戶的權限名字
name:權限的命名,爲一串惟一的英文字符,如:com.example.READ_ACTIVITY。須要注意的是Android系統不容許不一樣的包名定義相同的權限名(permission name),除非不一樣的包名具備相同的簽名證書。若是一個APP1聲明瞭權限名A,則系統不容許另一個聲明瞭權限名A的不一樣簽名證書的APP2進行安裝。爲了不這種狀況發生,能夠以本身APP的包名爲前綴進行權限聲明
permissionGroup:權限所屬的權限組,此項的值必須爲中聲明的name或者是其餘APP聲明的。若是此項不設置,則此權限不屬於權限組。
protectionLevel:權限的級別。
要訪問授權限保護的組件,必須在進行聲明,不管是官方定義的仍是自定義的,如:
<manifest>
<permission android:name="com.example.READ_ACTIVITY"/>
<uses-permission android:name="com.example.READ_ACTIVITY" />
<application>
<activity android:name="com.example.TestActivity" android:permission="com.example.READ_ACTIVITY" >
</activity>
</application>
</manifest>複製代碼
TestActivity聲明瞭READ_ACTIVITY權限保護,若是要啓動TestActivity,必需要申請READ_ACTIVITY權限
聲明一個權限樹,能夠在此節點上動態添加權限,PackageManager.addPermission()。如聲明瞭權限樹com.example.project.taxes,在此節點上能夠動態添加權限:
com.example.project.taxes.CALCULATE
com.example.project.taxes.deductions.MAKE_SOME_UP
com.example.project.taxes.deductions.EXAGGERATE
須要注意的是此項聲明的不是權限,是權限的命名空間。
<permission-tree android:icon="drawable resource" android:label="string resource" ] android:name="string" />複製代碼
icon和label與permission的相似。
name爲權限的命名,如:com.example.project.taxes
聲明一個邏輯上的權限分組
<permission-group android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" />複製代碼
聲明一個Instrumentation類,用來監控APP和系統的交互。Instrumentation對象會在APP的全部組件以前進行實例化。
<instrumentation android:functionalTest=["true" | "false"] android:handleProfiling=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:targetPackage="string" />複製代碼
functionalTest:是否進行功能性的測試。true:是。false:否。默認值爲false
handleProfiling:true:自定義性能分析的開始和結束時間。false:性能分析整個運行過程。默認值爲false
name:Instrumentation子類的全名。好比:com.example.project.StringInstrumentation
targetPackage:Instrumentation對象所依賴的目標包名
<uses-sdk android:minSdkVersion="integer" android:targetSdkVersion="integer" android:maxSdkVersion="integer" />複製代碼
minSdkVersion:指定APP運行的所需最低API級別的整數,若是系統API級別低於此值,則會阻止用戶安裝。若是不聲明該屬性,則默認爲1。
targetSdkVersion:指定APP目標API級別的整數,不過不聲明該屬性,則默認和minSdkVersion同樣
maxSdkVersion:APP可以運行在系統的最大API級別。在Android2.0.1如下,若是APP指定的此項低於系統的API級別,則會安裝不了,已安裝的會被隱藏掉。Android2.0.1(不包含)以上的系統不會檢查安裝的APP的此項屬性,因此不會出現2.0.1如下的狀況。此值通常不進行設置。
用來設置APP須要的相關硬件和軟件的配置。大部分APP都不須要此屬性。
<uses-configuration android:reqFiveWayNav=["true" | "false"] android:reqHardKeyboard=["true" | "false"] android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"] android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"] android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />複製代碼
reqFiveWayNav:是否須要五維導航控制,如方向版(D-pad),軌跡球等。
reqHardKeyboard:是否須要物理鍵盤
reqKeyboardType:設置所需鍵盤的類型
reqNavigation:指定方向控制的確切類型或不指定(undefined,爲默認值)
reqTouchScreen:觸摸屏的類型。
用來聲明APP所要使用和依賴的單一的軟硬件功能。該項所提供的require屬性若是是須要的功能,那麼若是缺乏的話就會沒法使用。好比聲明瞭<uses-feature android:name="android.hardware.camera" require="true"/>,若是缺乏攝像頭,那麼就會沒法使用。而且必須單獨地爲每一個功能進行聲明。很重要的一點是GooglePlay會根據此項所聲明的功能進行過濾提供給兼容設備的用戶,用戶只能下載和其設備相容的APP。
<uses-feature android:name="string" android:required=["true" | "false"] android:glEsVersion="integer" />複製代碼
name:硬件或軟件功能的字符串描述。
required:true,當設備沒有改指定的功能(name)時,APP沒法正常工做或設計爲沒法正常工做;false,有該功能優先使用該功能,無也可正常工做。默認值爲true
glEsVersion:所須要的OpenGL ES版本。高16位表示主版本號,底16位表示次版本號。例如,要指定 OpenGL ES 2.0 版,您須要將其值設置爲「0x00020000」;要指定 OpenGL ES 3.2,則需將其值設置爲「0x00030002」。若是聲明多個,則選擇最高版本的那個,其它的忽略。若是不聲明,則默認爲1.0版本,全部Android設備都支持。