Android基礎知識之Manifest文件的組織結構

原文:http://android.eoe.cn/topic/android_sdkandroid

是AndroidManifest.xml文件中的根標籤,她必須包含一個標籤和指定的xmlns:android、 package兩個屬性。數據庫

屬性:app

xmlns:android
定義了Android的命名空間。這個屬性通常能夠設置爲:
"http://schemas.android.com/apk/res/android".ide

packagegoogle

一個Java語言風格的應用程序包名,這個包名必須惟一。這個包名能夠包含大寫或小寫字母('A'到'Z'、'a'到'z')、數字和下劃線('_')。固然個別 包名最好仍是以字母開頭比較好。加密

爲了不和其餘開發人員衝突,你應該使用互聯網域名做爲你的基礎包名(域名的反寫)。例如,Google發佈的應用程序包名是以com.google開頭的,因此你毫不要使用usr.example來發布你的應用程序。spa

包名做爲應用程序的惟一標示,同時它也是應用進程(application process)屬性的默認名稱(詳情參考標籤的android:process屬性),也是activity的任務關聯(task affinity)屬性的默認值(詳情參考標籤的taskAffinity屬性)。xml

* 注意* :你一旦發佈了應用程序,包名就不能修改了。這個包名定義了你的應用程序的身份,因此若是你修改包名,它會被認爲是一個徹底不一樣的應用程序,從而之前版本的用戶沒法更新到新的版本。

android:sharedUserId
指定一個Linux用戶的ID,這個ID會被其餘應用程序所共享。一般狀況下,Android會給每一個應用程序分配一個惟一標示他們的ID。然而,若是多個應用程序的android:sharedUserId屬性值相同且簽署了相同的證書,它們將共享相同的ID。共享相同ID的應用程序能夠訪問彼此的數據,若是須要的話,還會運行同一個進程中。進程

android:sharedUserLabel
爲android:sharedUserId而生的一個用戶只讀標籤,這個標籤設值的時候必須引用string資源文件,而不能直接使用string。  內存

這個屬性在API Level3裏將介紹到。只有android:sharedUserId屬性設置的時候android:sharedUserLabel屬性纔有意義。

android:versionCode
內部版本號。這個數字用來肯定當前版本是否比另外一個版本更新,數字越大版本越新。這個版本號並不會展示給用戶,真正展示給用戶的版本號是versionName這個屬性的值。  

這個值必須是整數,好比「100」。你能夠任意定義它的值,只要後續版本是更高的數字。例如,它能夠是一個編號:x.y這種格式的,你只須要把x和y單獨的轉化成數字就能夠了(能夠經過lower and upper 16 bits),或者你你能夠在發佈新版本的時候簡單加1。

android:versionName
這個版本號就是展示給用戶的。這個屬性能夠直接設值或引用string資源文件。這個版本號展示給用戶並無別的目的,這個versionCode屬性意味着有重大的版本變化。

android:installLocation
應用程序的默認的安裝位置。  
如下關鍵字字符串:
<!-- 表格開始 -->
{|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid #ccc;border-top:1px solid #ccc; "

<!-- 這段是表頭 -->
|-style="background:#DEE8F1; "
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;" | 關鍵字
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px;" | 描述

<!-- 這段是表格 -->
|- style=" vertical-align:top;"
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | "internalOnly"
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 應用程序會只在內部存儲設備上安裝。若是設了這個值,這個應用程序就不會在外部存儲設備上安裝,若是這時候內部存儲設備空間滿了,系統就不會安裝這個應用程序了。若是你不定義android:installLocation屬性的話,它的默認值就是internalOnly。
|- style=" vertical-align:top;"
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | "auto"
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 應用程序能夠安裝在外部存儲設備上,可是系統默認安裝在內部存儲設備上。不過儘管已經安裝完成,用戶仍是能夠經過系統設置來把應用程序移動到內部存儲設備上或者外部存儲設備上(移動到SD卡 or 移動到手機內存)。
|- style=" vertical-align:top;"
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | "preferExternal"
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 應用程序大多會安裝到外部存儲設備上(SD卡),可是系統並不會保證這個請求會被優先處理。好比說當外部存儲設備不可用或者滿了或者應用程序使用了forward-locking(不支持外部存車設備的機制)機制,這個時候應用程序就會被安裝到內部存儲設備上,不過儘管已經安裝完成,用戶仍是能夠經過系統設置來把應用程序移動到內部存儲設備上或者外部存儲設備上(移動到SD卡 or 移動到手機內存)。

|}
<!-- 表格結束 -->

* 注意:* 若是你使用了Google Play的Copy Protection組件,你的應用程序將不會安裝到SD卡上,不過你能夠用同是Google Play的Application Licensing來代替,這樣你的應用程序就又能夠安裝無論是內部仍是外部存儲設備上,固然包括SD。


* 提示:* 默認狀況下,你的應用程序只能安裝到內部存儲設備上,而不能安裝到外部存儲設備上,除非你定義了android:installLocation的屬性值爲auto" or "preferExternal"。

當應用程序安裝到外部存儲設備上的時候:
* apk安裝文件會保存在外部存儲設備上,可是與應用程序相關的任何數據(好比數據庫)仍然會保存在內部存儲設備上。
* 保存apk安裝文件的容器(SD卡)會對其進行加密,只容許在當前設備上運行(用戶是沒有辦法直接把SD卡移動到另外一臺設備上並進行安裝的)。儘管如此,同一個設備仍是可使用多個SD卡。
* 當用戶有需求的時候,應用程序仍是能夠移動到內部存儲設備(手機內存)上的。

固然用戶也會有這樣的需求:把應用程序從內部存儲設備移動到外部存儲設備。可是若是應用程序使用了默認的android:installLocation屬性即internalOnly屬性,系統是不可以把應用程序從內部存儲設備移動到外部存儲設備上的。

關於android:installLocation這個屬性,詳情請參考App Install Location (包括如何處理向後兼容的問題)

參考:API Level 8。

參考:API Level1下的全部屬性,在屬性描述中單獨註明的除外

相關文章
相關標籤/搜索