AndroidManifest.xml檔案詳解

yangxi_001發表於2014-06-11

本文為安全專家李洋的最新一篇專欄文章《AndroidManifest.xml檔案詳解》。AndroidManifest.xml是一個跟安全相關的配置檔案,該配置檔案是Android安全保障的一個不可忽視的方面,本文對AndroidManifest檔案進行詳細介紹。

以下為全部內容:

瞭解AndroidManifest.xml檔案的主要用途

AndroidManifest.xml主要包含以下功能:

  1. 說明application的java 資料包,資料包名是application的唯一標識;
  2. 描述application的component;
  3. 說明application的component執行在哪個process下;
  4. 宣告application所必須具備的許可權,用以訪問受保護的部分API,以及與其他application的互動;
  5. 宣告application其他的必備許可權,用以component之間的互動;
  6. 列舉application執行時需要的環境配置資訊,這些宣告資訊只在程式開發和測試時存在,釋出前將被刪除;
  7. 宣告application所需要的AndroidAPI的最低版本級別,例如1.0,1.1,1.5等;
  8. 列舉application所需要連結的庫;

熟悉AndroidManifest.xml檔案的結構及元素

AndroidManifest.xml檔案的結構、元素,以及元素的屬性,可以在AndroidSDK文件中檢視詳細說明。而在看這些眾多的元素以及元素的屬性前,需要先了解一下這些元素在命名、結構等方面的規則:

  1. 元素:在所有的元素中只有<manifest>和<application>是必需的,且只能出現一次。如果一個元素包含有其他子元素,必須通過子元素的屬性來設定其值。處於同一層次的元素,這些元素的說明是沒有順序的。
  2. 屬性:按照常理,所有的屬性都是可選的,但是有些屬性是必須設定的。那些真正可選的屬性,即使不存在,其也有預設的數值項說明。除了根元素<manifest>的屬性,所有其他元素屬性的名字都是以android:字首的;
  3. 定義類名:所有的元素名都對應其在SDK中的類名,如果你自己定義類名,必須包含類的資料包名,如果類與application處於同一資料包中,可以直接簡寫為“.”;
  4. 多數值項:如果某個元素有超過一個數值,這個元素必須通過重複的方式來說明其某個屬性具有多個數值項,且不能將多個數值項一次性說明在一個屬性中;
  5. 資源項說明:當需要引用某個資源時,其採用如下格式:@[package:]type:name。例如<activity android:icon=”@drawable/icon ” . . .>
  6. 字串值:類似於其他語言,如果字元中包含有字元“\”,則必須使用轉義字元“\\”;

下面結合cookie例項中的AndroidManifest.xml檔案來說明一下,原XML檔案如下:

  1. <?xml version=”1.0″ encoding=”utf-8″?> 
  2. <manifest xmlns:android=”http://schemas.android.com/apk/res/android” 
  3. package=”moandroid.cookie” 
  4. android:versionCode=”1″ 
  5. android:versionName=”1.0″> 
  6. <application android:icon=”@drawable/icon” android:label=”@string/app_name”> 
  7. <activity android:name=”.cookie” android:label=”@string/app_name”> 
  8. <intent-filter> 
  9. <action android:name=”android.intent.action.MAIN” /> 
  10. <category android:name=”android.intent.category.LAUNCHER” /> 
  11. </intent-filter> 
  12. </activity> 
  13. </application> 
  14. <uses-sdk android:minSdkVersion=”3″ /> 
  15. </manifest> 

除了頭部的XML資訊說明外,首先是manifest項(也就是根節點),其屬性包括:schemas URL地址、包名(moandroid.cookie),以及程式的版本說明。其次是manifest的子節點application,其屬性包括:程式圖示、程式名稱。前面帶有@表示引用資源,例如:@drawable/icon表示引用的是drawable資源中的icon,可以在其源工程的res/drawable中找到。然後就是application的子節點activity,其屬性包括:activity的名稱、activity的標籤名,其子節點intent-filter則是對activity的說明。

而在intent-filter中,actionandroid:name=”android.intent.action.MAIN”和categoryandroid:name=”android.intent.category.LAUNCHER”用以說明程式啟動時的入口activity是哪個。如果這兩個屬性值中分別含有MAIN和LAUNCHER,則說明它就是啟動程式時的入口活動。uses-sdkandroid:minSdkVersion=”3″說明程式使用的Android SDK的最低版本,其中1表示Android1.0,2表示Android 1.1,而3則表示Android1.5。

如何進行應用程式許可權申請

如下所示,文中黑體標記的部分為應用程式許可權申請內容:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.      package="cn.com.fetion.android" 
  4.      android:versionCode="1" 
  5.      android:versionName="1.0.0"> 
  6.    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  7.        <activity android:name=".welcomActivity" 
  8.                   android:label="@string/app_name"> 
  9.             <intent-filter> 
  10.                 <action android:name="android.intent.action.MAIN" /> 
  11.                 <category android:name="android.intent.category.LAUNCHER" /> 
  12.             </intent-filter> 
  13.         </activity> 
  14.    </application> 
  15.   <uses-permission android:name="android.permission.SEND_SMS"></uses-permission> 
  16. </manifest> 

如上述檔案描述中加下劃線的斜體部分,該檔案的作用是說明該軟體需要傳送簡訊的功能。

Android定義了百餘種permission,可供開發人員使用,具體詳見網址

自定義許可權

在檔案中,使用者還可以自定義許可權。permission就是自定義許可權的宣告,可以用來限制app中特殊元件,特性與app內部或者和其他app之間訪問。寫了一個引用自定義許可權的例子,在安裝app的時候,提示許可權:

定義許可權如下:

  1. <permission android:label="”自定義許可權”"  
  2.     android:description=”@string/test”  
  3.     android:name=”com.example.project.TEST”  
  4.     android:protectionLevel=”normal”  
  5.     android:icon=”@drawable/ic_launcher”> 

宣告的含義如下;

  • android:label:許可權名字,顯示給使用者的,值可是一個string資料,例如這裡的“自定義許可權”。
  • android:description:比label更長的對許可權的描述。值是通過resource檔案中獲取的,不能直接寫string值,例如這裡的”@string/test”。
  • android:name:許可權名字,如果其他app引用該許可權需要填寫這個名字。
  • android:protectionLevel:許可權級別,分為4個級別:
    • normal:低風險許可權,在安裝的時候,系統會自動授予許可權給application。
    • dangerous:高風險許可權,系統不會自動授予許可權給app,在用到的時候,會給使用者提示。
    • signature:簽名許可權,在其他app引用宣告的許可權的時候,需要保證兩個app的簽名一致。這樣系統就會自動授予許可權給第三方app,而不提示給使用者。
    • signatureOrSystem:這個許可權是引用該許可權的app需要有和系統同樣的簽名才能授予的許可權,一般不推薦使用。

相關文章