AndroidManifest.xml
AndroidManifest.xml是Android應用的描述檔案,它描述了該應用的相關資訊,主要包括以下各個元素。
包名(package)
指定本應用內java主程式包的包名。當沒有指定apk的檔案名稱時,編譯後產生程式包將以此命名。本包名應當在Android系統運行時唯一。
認證(certificate)
指定本應用程式所授予的信任層級,目前有的認證層級有platform(system)、shared、media以及應用自訂的認證。不同的認證可以享受不同的許可權。
許可權組(permission-group)
許可權組的定義是為了描述一組具有共同特性的許可權。Android系統中預訂了一些組,它們是:
- android.permission-group.COST_MONEY
- android.permission-group.MESSAGES
- android.permission-group.MESSAGES
- android.permission-group.PERSONAL_INFO
- android.permission-group.LOCATION
- android.permission-group.NETWORK
- android.permission-group.ACCOUNTS
- android.permission-group.HARDWARE_CONTROLS
- android.permission-group.PHONE_CALLS
- android.permission-group.SYSTEM_TOOLS
- android.permission-group.DEVELOPMENT_TOOLS
從字面意思我們就可以理解每個組的特性。具體含義可以參考SDK文檔。
許可權(permission)
許可權用來描述是否擁有做某件事的權力。Android系統中許可權是分級的,前分為普通層級(Normal),危險層級(dangerous),簽名層級(signature)和系統/簽名層級(signature or system)。
系統中所有預定義的許可權根據作用的不同,分別屬於不同的層級。
對於普通和危險層級的許可權,我們稱之為低級許可權,應用申請即授予。其他兩級許可權,我們稱之為進階許可權或系統許可權,應用擁有platform層級的認證才能申請。
當應用試圖在沒有許可權的情況下做受限操作,應用將被系統殺掉以警示。
系統應用可以使用任何許可權。許可權的聲明者可無條件使用該許可權。
目前Android系統定義了許多許可權,通過SDK文檔使用者可以查詢到哪些操作需要哪些許可權,然後按需申請。
許可權樹(permission-tree)
許可權樹的設定是為了統一管理一組許可權,聲明於該樹下的許可權所有者歸屬該應用。系統提供了API,應用可以在運行時動態添加。
Ø PackageManager.addPermission()
應用安裝
Android系統中,安裝應用時不能指定安裝目錄,所有的應用都只能裝在預置檔案夾下。
Android系統支援數種安裝方式,而播思通訊的Ophone平台在此基礎上支援更多方式。
<使用預置安裝工具
Android系統中,應用安裝包.apk檔案屬於預設支援的檔案類型,它的的mime type被定義為"application/vnd.android.package-archive"。
系統內建了安裝工具來解析並安裝.apk檔案。你可以從OPhone平台的檔案管理工具中找到對應安裝包,點擊即可啟動安裝步驟。這裡給出了相應的代碼,有興趣的開發人員可以嘗試使用。
Intent apkintent = new Intent(Intent.ACTION_VIEW); final Uri puri = Uri.fromFile(new File(path)); //path is the path of source apk apkintent.setDataAndType(puri, "application/vnd.android.package-archive"); startActivity(apkintent);
使用API安裝
Android系統提供了安裝應用的API:PackageManager.installPackage(final Uri packageURI,
final IPackageInstallObserver observer, final int flags);
- uri給出了原檔案的地址
- observer實現了回呼函數packageInstalled(final String packageArchiveName, final int returnCode) 以檢查安裝是否成功
- flags提供安裝標識。Android平台提供的標識有:
1.PackageManager.FORWARD_LOCK_PACKAGE = 0x00000001
標識本應用屬於受限應用,應用將會被安裝到保護目錄,只有該應用可以存取碼段和不屬於resource的asset資源。
2.PackageManager.REPLACE_EXISTING_PACKAGE = 0x00000002;
應用如已存在,則先刪除再安裝。
3.PackageManager.SDCARD_PACKAGE = 0x00000004;
由OPhone平台擴充,標識該應用安裝目錄為儲存卡,預設為data分區。
因為手機中data分區大小有限,因此OPhone平台預設將應用裝到儲存卡上。
本API需要"android.permission.INSTALL_PACKAGES"許可權,該許可權屬於簽名層級,因此只有系統層級的應用程式才能使用。
拷貝即安裝
Android支援拷貝即安裝的方式,即將安裝包拷貝到預置安裝目錄即可自動安裝,但所有的預置目錄對於使用者不可見。
OPhone平台擴充後,使用者可將安裝包拷入儲存卡的app目錄下,系統將監控該檔案夾,檢測到新的安裝檔案後自動安裝。
這種方式適合一次安裝大量應用,但是也有壞處。一是無法知道哪些應用安裝成功,哪些安裝失敗, 二是安裝失敗的應用將會作為垃圾存放在預置目錄中,在系統啟動時延長啟動時間,三是過多的應用可能將data分區的空間佔用過多,影響系統的正常使用。
安裝步驟
- 解析安裝包是否合法,如果合法即載入應用,如果非法即放棄安裝
- 取出程式碼片段,放入/data/dalvik-cache目錄
- 建立/data/data/包名的檔案夾,以存放使用者資料
- 將安裝包攜帶的lib放入/data/data/包名/lib中
- 以上步驟完成後將安裝包拷到安裝目錄
- 載入該應用資訊
應用卸載
Android系統同樣支援多種卸載方式。
使用預置卸載工具
系統內建了卸載工具。這裡給出了啟動代碼,執行後即可看到卸載步驟:
Uri packageURI = Uri.parse("package:"+packageName); Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); startActivity(uninstallIntent);
使用API卸載
Android提供了卸載應用的標準API:PackageManager().deletePackage(String packageName, IPackageDeleteObserver observer, int flags);
1. observer實現了回呼函數packageDeleted(boolean succeeded)以檢查卸載是否成功
2. flags提供卸載標識。Android平台提供的標識有
PackageManager.DONT_DELETE_DATA = 0x00000001;
標識卸載時是否同時刪除使用者資料。
本API需要"android.permission.DELETE_PACKAGES"許可權,該許可權屬於簽名層級,因此只有系統層級的應用程式才能使用。
刪除即卸載
對應於拷貝即安裝,系統同樣支援刪除即卸載功能。當使用者刪除/sdcard/app目錄下安裝包時,系統將自動檢測到刪除事件並卸載對應應用。
本方法適合一次刪除大量應用。
卸載步驟
- 刪除程式碼片段
- 如果需要刪除使用者資料,則刪除
- 建立/data/data/包名的檔案夾,以存放使用者資料
- 刪除應用資訊
- 刪除安裝包
應用使用
應用安裝後即處於可用狀態。對於系統中所有應用,從管理層面分為資訊管理和應用調度兩部分;從應用自身角度分為去啟用與啟用兩種狀態。