1. 程式人生 > >Android安全/開發基礎--15--應用程式配置檔案詳解(AndroidManifest.xml)

Android安全/開發基礎--15--應用程式配置檔案詳解(AndroidManifest.xml)

=================================================================

Android應用程式都需要有清單檔案。該檔案必須命名為AndroidManifest.xml且必須防止在應用程式根目錄中。它聲明瞭應用程式元件、可見性、訪問規則、庫、功能特性以及應用程式能夠正常執行的最低Android版本。

14-1、完整的可巢狀的標籤列表

<uses-sdk><?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>                            //任何Activity都可以受許可權保護
            <intent-filter>
                <action />
                <category />
				<data />
            </ intent-filter>
			<meta-data />
        </ activity>
        
        <activity-alias>
			<intent-filter>  </ intent-filter>
			<meta-data />
		</ activity-alias>
		
		<service>                             //任何Service都可以受許可權保護
            <intent-filter>  </ intent-filter>
			<meta-data />
		</ service>
		
        <receiver>                            //1,利用許可權保護自身,只接受它希望監聽的廣播
            <intent-filter>  </ intent-filter>       //2,Braodcaster選擇可以接收的Broadcast的Receiver
			<meta-data />
        </ receiver>  
        
        <provider>                            //可以指定許可權保護該元件的安全
     		<grant-uri-permission />
			<meda-data />
			<path-permission />
		</ provider>
		
		<uses-library />
    </application>
</manifest>

14-2、<Manifest>標籤屬性

AndroidManifest.xml配置檔案的根元素,必須包含一個<application>元素並且指定xlmns:android和package屬性。xlmns:android指定了Android的名稱空間,預設情況下是“http://schemas.android.com/apk/res/android”;而package是標準的應用包名,也是一個應用程序的預設名稱。當然還有一些其他常用的屬性需要注意一下,比如android:versionCode是給裝置程式識別版本用的,必須是一個整數值代表app更新過多少次;而android:versionName則是給使用者檢視版本用的,需要具備一定的可讀性,比如“1.0.0”這樣的。

1、package:軟體包的名稱
2、android:sharedUserId:如果兩個或者更多的應用程式共享相同的LinuxID,則使用該屬性
3、android:sharedUserLabel:共享使用者ID的使用者可讀名稱,在設定android:sharedUserId屬性後才生效
4、android:versionCode:內部使用的由應用程式跟蹤修正的版本程式碼。升級時引用
5、android:versionName:顯示給使用者的應用程式版本
6、android:installLocation:定義了APK將要安裝的位置。內部儲存還是SD卡中

14-3、<application>
標籤屬性

應用配置的根元素,位於<manifest>下層,包含所有與應用有關配置的元素,其屬性可以作為子元素的預設屬性,常用的屬性包括:應用名android:label,應用圖示android:icon,應用主題android:theme等。當然,<application>標籤還提供了其他豐富的配置屬性。

1、android:allowTaskReparenting:設定Activity從啟動它的任務轉移到另一個有親緣任務關係的任務中
2、android:backupAgent:應用程式備份代理的名稱
3、android:debuggable:是否允許除錯應用程式
4、android:enabled:是否可以例項化應用程式元件
5、android:hasCode:如果設定為true,則啟動元件時,應用程式將嘗試載入某些程式碼
6、android:hardwareAccelerated:是否允許應用程式支援硬體加速渲染
7、android:icon:應用程式圖示
8、android:killAfterRestore:如果設定為true,在全系統還原期間一旦設定被還原,應用程式將會被終止
9、android:largeHeap:允許Android系統為應用程式建立一個大Dalvik堆並增加應用程式記憶體覆蓋區
10、android:label:應用程式的使用者可讀標籤
11、android:logo:應用程式的logo
12、android:manageSparceActivity:管理應用程式記憶體的Activity的名稱
13、android:name:包含了在啟動其他元件之前將被例項化的子類的完全限定名稱
14、android:permission:該屬性可以被元件鎖覆蓋,用於設定客戶端必須與應用程式互動的許可權
15、android:persistent:該屬性通常被系統應用程式使用,允許應用程式一直執行
16、android:process:元件執行的程序名稱1
17、android:restoreAnyVersion:允許裝置代理嘗試恢復,即使當前儲存的備份比現在嘗試恢復的版本還要新
18、android:supportsRtl:該屬性設定為true時,支援從右至左的佈局
19、android:taskAffinity:除非被Activity顯式設定,否則允許所有Activity與包名稱有關聯
20、android:theme:應用程式樣式資源的應用

14-4、<permission>標籤屬性

許可權宣告標籤,定義了供給<uses-permission>使用的具體許可權,通常情況下我們不需要為自己的應用程式宣告某個許可權,除非需要給其他應用程式提供可呼叫的程式碼或者資料,這個時候你才需要使用<permission>標籤。該標籤中提供了android:name許可權名標籤,許可權圖示android:icon以及許可權描述android:description等屬性,另外還可以和<permission-group>以及<permission-tree>配合使用來構造更有層次的、更有針對性許可權系統。

1、android:name:所要宣告的新許可權的名稱
2、android:description:所要宣告的新許可權的詳細描述
3、android:icon:許可權圖示
4、android:label:在安裝時顯示給使用者的標籤
5、android:permissionGroup:分配許可權給既有的使用者定義組或新組。如果沒有指定名稱,許可權不屬於任何組
6、android:protectionLevel:指定許可權的保護等級

14-5、<permission-group>標籤屬性

1、android:name:新的許可權組名稱,類似於之前在<permission>標籤中提到的名稱
2、android:description:宣告的新許可權組的詳細描述
3、android:icon:許可權組圖示
4、android:label:安裝時顯示的標籤

14-6、<permission-tree>標籤屬性

1、android:name:新許可權樹的名稱。該名稱應該有至少3個被句點(.)隔開的部分
2、android:icon:許可權樹圖示
3、android:label:安裝時顯示給使用者的標籤

14-7、<service>標籤屬性

Service服務元件的宣告標籤,用於定義與描述一個具體的Android服務,主要屬性有:Service服務類名android:name,服務圖示android:icon,服務描述android:label以及服務開關android:enabled等。

1、android:enabled屬性定義系統是否可以例項化Service。該屬性預設值為true
2、android:exported屬性限制Service的公開。如果Service包含Intent Filter,則他對其他應用程式是可見的(私有的)。該屬性預設值為true

14-8、<provider>標籤屬性

<provider>標籤除了和其他元件相同的android:name、android:icon和android:label等基礎屬性之外,還提供了用於支援其功能的特殊屬性,如:內容提供者標識名稱android:authorities,對指定URI授予許可權標識android:grantUriPermission以及具體的讀、寫許可權,即android:readPermission和android:writePermission等。

1、android:anthorities:列出了被應用程式公開的Provider
2、android:enabled:指定系統可以啟動Provider
3、android:grantUriPermission:用來提供對資料的一次性訪問,這些資料受到許可權的保護,否則無法通過元件訪問
4、android:initOrder:是Provider啟動的順序。數值越高,啟動越早
5、android:label:Provider的使用者可讀標籤
6、android:multiprocess:預設為false,則Provider只在定義它的應用程式程序中例項化
7、android:permission:宣告客戶端必須與Provider互動的許可權
8、android:process:定義了Provider應該執行的程序
9、android:syncable:是否允許將資料同步到伺服器上

14-9、<receiver>標籤屬性

Boardcast Receiver廣播接收器元件的宣告標籤,用於定義與描述一個具體的Android廣播接收器,其主要屬性和<service>標籤有些類似:Boardcast Receiver接收器類名android:name,接收器圖示android:icon,接收器描述android:label以及接收器開關android:enabled等。

1、android:enabled:設定為true,允許系統例項化Receiver。預設值為true
2、android:exported:設定為true,使Receiver對系統的所有程式都可見
3、android:name:實現Receiver的類名,是一個必須的屬性並且應該是完全限定的類名
4、android:permission:利用許可權保護Receiver,使用該屬性指定傳送Intent到Receiver的元件應該具有的許可權
5、android:process:預設情況下在應用程式的程序中例項化Receiver

14-10、<instrumentation>標籤屬性

用於宣告Instrumentation測試類來監控Android應用的行為並應用到相關的功能測試中,其中比較重要的屬性有:測試功能開關android:functionalTest,profiling除錯功能開關android:handleProfiling,測試用例目標物件android:targetPackage等。另外,我們需要注意的是Instrumentation物件是在應用程式的元件之前被例項化的,這點在組織測試邏輯的時候需要被考慮到。

1、android:functionalTest: 用於指定Instrumentation類是否應該作為一個功能性的測試來執行。
2、android:handleProfiling:指定Instrumentation物件是否會開啟和關閉分析功能。預設是false
3、android:targetPackage: Instrumentation物件將要執行的應用。
4、android:icon:Instrumentation類呈現給使用者的圖示。
5、android:label:使用者可讀的Instrumentation類的標籤。
6、1android:name:Instrumentation子類的名稱。

14-11、<uses-sdk>標籤屬性

用於指定Android應用中所需要使用的SDK的版本,比如我們的應用必須運行於Android 2.0以上版本的系統SDK之上,那麼就需要指定應用支援最小的SDK版本數為5;當然,每個SDK版本都會有指定的整數值與之對應,比如我們最常用的Android 2.2.x的版本數是8。除了可以指定最低版本之外,<uses-sdk>標籤還可以指定最高版本和目標版本。

1、android:minSdkVersion:應用執行所需的最小API Level。如果系統的API Level比在這個屬性中指定的值更低,那麼Android系統將阻止使用者安裝這個應用。
2、android:targetSdkVersion:定義應用的目標API Level。如果沒有設定,那麼它的預設值同minSdkVersion給定的值相等。
3、android:maxSdkVersion:設計的應用能執行的最大API Level。

14-12、<uses-configuration><uses-feature>標籤屬性

這兩個標籤都是用於描述應用所需要的硬體和軟體特性,以便防止應用在沒有這些特性的裝置上安裝。<uses-configuration>標籤中,比如有些裝置帶有D-pad或者Trackball這些特殊硬體,那麼android:reqFiveWayNav屬性就需要設定為true;而如果有一些裝置帶有硬體鍵盤,android:reqHardKeyboard也需要被設定為true。另外,如果裝置需要支援藍芽,我們可以使用<uses-feature android:name="android.hardware.bluetooth" />來支援這個功能。這兩個標籤主要用於支援一些特殊的裝置中的應用。

1、android:reqFiveWayNav:應用程式是否需要五維導航鍵 —“true”使用,“false”不使用。
2、android:reqHardKeyboard:應用程式是否需要用到硬體鍵盤 — “true”使用,“false”不使用。
3、android:reqKeyboardType:當存在鍵盤時,應用程式需要用到的鍵盤型別。本屬性不區分硬鍵盤和軟鍵盤。
4、android:reqNavigation:當裝置存在時,應用程式需要用到的導航裝置。
5、android:reqTouchScreen:當裝置存在時,應用程式需要用到的觸控式螢幕型別。

1、android:glEsVersio:應用程式需要的 OpenGL ES 版本。 高 16 位代表大版本號,低 16 位代表小版本號。
2、android:name:定義一項應用程式需要用到的軟、硬體特性,用字串格式的描述符表示。
3、android:required:布林值,指明應用程式是否需要用到 android:name 屬性給出的特性。預設true。

14-13、<uses-library>標籤屬性

用於指定Android應用可使用的使用者庫,除了系統自帶的android.app、android.content、android.view和android.widget這些預設類庫之外,有些應用可能還需要一些其他的Java類庫作為支援,這種情況下我們就可以使用<uses-library>標籤讓ClassLoader載入其類庫供Android應用執行時用。

14-14、<supports-screens>標籤屬性

對於一些應用或者遊戲來說,只能支援某些螢幕大小的裝置或者在某些裝置中的效果比較好,我們就會使用<supports-screens>標籤來指定支援的螢幕特徵。其中比較重要的屬性包括:螢幕自適應屬性android:resizeable,小屏(android:smallScreens)、中屏(android:normal Screens)、大屏(android:largeScreens)和特大屏(android:xlargeScreens)支援屬性,按螢幕渲染影象屬性android:anyDensity以及最小螢幕寬度屬性android:requiresSmallest WidthDp等。

1、android:smallScreens:指明應用程式是否支援 small 尺寸的螢幕。最小
2、android:normalScreens:指明應用程式是否支援“normal”尺寸的螢幕。較小
3、android:largeScreens:指明應用程式是否支援 xlarge 尺寸的螢幕。較大
4、android:anyDensity:指明應用程式是否包含適應所有螢幕密度的資源。最大

14-15、<activity>標籤屬性

Activity活動元件(即介面控制器元件)的宣告標籤,Android應用中的每一個Activity都必須在AndroidManifest.xml配置檔案中宣告,否則系統將不識別也不執行該Activity。<activity>標籤中常用的屬性有:Activity對應類名android:name,對應主題android:theme,載入模式android:launchMode,鍵盤互動模式android:windowSoftInputMode等。另外,<activity>標籤還可以包含用於訊息過濾的<intent-filter>元素,當然還有可用於儲存預定義資料的<meta-data>元素。

1、android:allowTaskReparenting:用來標記Activity能否從啟動的Task移動到有著affinity的Task。
2、android:alwaysRetainTaskState:用來標記Activity所在的Task的狀態是否總是由系統來保持。
3、android:clearTaskOnLaunch:用來標記是否從Task中清除所有的Activity,除了根Activity外。
4、android:configChanges:阻止因為某種配置變化而發生的Activity重啟。
5、android:enabled:activity是否可以被例項化。
6、android:excludeFromRecents:是否可被顯示在最近開啟的activity列表裡。
7、android:exported:是否允許activity被其它程式呼叫。
8、android:finishOnTaskLaunch:用來標記當用戶再次啟動它的Task時已經存在的Activity例項是否要關閉。
9、android:icon:它代表Activity和圖示。
10、android:label:該屬性用於描述該Activity的一個標籤,通常是隨著Activity圖示一起顯示出來的。
11、android:launchMode:用於指示Activity如何啟動。
12、android:multiprocess:該屬性表示Activity的例項是否可以執行在啟動它的元件所在的應用程式程序中。
13、android:name:該屬性表示Activity的類名,它是Activity的子類。
14、android:noHistory:這個屬性用於設定在使用者離開該Activity,並且它在螢幕上不再可見的時候,是否應該從Activity的堆疊中刪除。
15、android:permission:表示的是許可權名稱。
16、android:process:該屬性表示該Activity執行的程序名稱。
17、android:screenOrientation:activity顯示的模式,"unspecified"預設值"landscape"風景畫模式,寬度比高度大一些"portrait"肖像模式,高度比寬度大。
18、android:stateNotNeeded:是否activity被銷燬和成功重啟並不儲存狀態。
19、android:taskAffinity:該屬性指明對該Activity有親和力的任務。
20、android:theme:activity的樣式主題,如果沒有設定,則activity的主題樣式從屬於應用程式。
21、android:windowSoftInputMode:activity主視窗與軟鍵盤的互動模式。

14-16、<activity-alias>標籤屬性

Activity元件別名的宣告標籤,簡單來說就是Activity的快捷方式,屬性android:targetActivity表示的就是其相關的Activity名,當然必須是前面已經宣告過的Activity。除此之外,其他比較常見的屬性有:Activity別名名稱android:name,別名開關android:enabled,許可權控制android:permission等。另外,我們還需要注意的是,Activity別名也是一個獨立的Activity,可以擁有自己的<intent-filter><meta-data>元素。

1、android:enabled:該屬性用來決定目標Activity可否通過別名被系統例項化,預設為true。
2、android:exported:為true的話,則目標Activity可被其他應用調起,如為false則只能被應用自身調起。
3、android:icon:允許自定義icon,可以不同於應用本身在桌面的icon。
4、android:label:該屬性類似於android:icon
5、android:name:該屬性可以為任意字串,但最好符合類名命名規範。
6、android:permission:該屬性指明瞭通過別名宣告調起目標Activity所必需的許可權。
7、android:targetActivity:該屬性指定了目標Activity,即通過activity-alias調起的Activity是哪個。

14-17、<intent-filter><action>、<category>、<data>標籤屬性

<intent-filter>用於Intent訊息過濾器的宣告,我們瞭解到Intent訊息對於Android應用系統來說,是非常重要的“粘合劑”,<intent-filter>元素可以放在<activity>、<activity-alias>、<service>和<receiver>元素標籤中,來區分可用於處理訊息的Activity控制器、Service服務和廣播接收器Broadcast Receiver。另外,我們還知道Intent訊息還包含有名稱、動作、資料、類別等幾個重要屬性。這點與該標籤的寫法也有一定的關係,比如<intent-filter>中必須包含有<action>元素,即用於描述具體訊息的名稱;<category>標籤則用於表示能處理訊息元件的類別,即該Action所符合的類別;而<data>元素則用於描述訊息需要處理的資料格式,我們甚至還可以使用正則表示式來限定資料來源。

14-18、<meta-data>標籤屬性

用於儲存預定義資料,和<intent-filter>類似,<meta-data>也可以放在<activity>、<activity-alias>、<service>和<receiver>這四個元素標籤中。Meta資料一般會以鍵值對的形式出現,個數沒有限制,而這些資料都將被放到一個Bundle物件中,程式中我們則可以使用ActivityInfo、ServiceInfo甚至ApplicationInfo物件的metaData屬性中讀取。

1、android:name:元資料項的名字,為了保證這個名字是唯一的,採用Java風格的命名規範。
2、android:resource:資源的一個引用,指定給這個項的值是該資源的id。
3、android:value:指定給這一項的值。