9 AndroidManifest.xml是Android應用的描述文件,它描述了該應用的相關信息,主要包括以下各個元素。 指定本應用內(nèi)java主程序包的包名。當沒有指定apk的文件名時,編譯后產(chǎn)生程序包將以此命名。本包名應當在Android系統(tǒng)運行時唯一。 指定本應用程序所授予的信任級別,目前有的認證級別有platform(system)、shared、media以及應用自定義的認證。不同的認證可以享受不同的權限。 權限組的定義是為了描述一組具有共同特性的權限。Android系統(tǒng)中預訂了一些組,它們是:android.permission-group.COST_MONEYandroid.permission-group.MESSAGESandroid.permission-group.MESSAGESandroid.permission-group.PERSONAL_INFOandroid.permission-group.LOCATIONandroid.permission-group.NETWORKandroid.permission-group.ACCOUNTSandroid.permission-group.HARDWARE_CONTROLSandroid.permission-group.PHONE_CALLSandroid.permission-group.SYSTEM_TOOLSandroid.permission-group.DEVELOPMENT_TOOLS
從字面意思我們就可以理解每個組的特性。具體含義可以參考SDK文檔。 權限用來描述是否擁有做某件事的權力。Android系統(tǒng)中權限是分級的,前分為普通級別(Normal),危險級別(dangerous),簽名級別(signature)和系統(tǒng)/簽名級別(signature or system)。 系統(tǒng)中所有預定義的權限根據(jù)作用的不同,分別屬于不同的級別。 對于普通和危險級別的權限,我們稱之為低級權限,應用申請即授予。其他兩級權限,我們稱之為高級權限或系統(tǒng)權限,應用擁有platform級別的認證才能申請。 當應用試圖在沒有權限的情況下做受限操作,應用將被系統(tǒng)殺掉以警示。 系統(tǒng)應用可以使用任何權限。權限的聲明者可無條件使用該權限。 目前Android系統(tǒng)定義了許多權限,通過SDK文檔用戶可以查詢到哪些操作需要哪些權限,然后按需申請。 權限樹的設置是為了統(tǒng)一管理一組權限,聲明于該樹下的權限所有者歸屬該應用。系統(tǒng)提供了API,應用可以在運行時動態(tài)添加。
? PackageManager.addPermission() Android系統(tǒng)中,安裝應用時不能指定安裝目錄,所有的應用都只能裝在預置文件夾下。 Android系統(tǒng)支持數(shù)種安裝方式,而播思通訊的Ophone平臺在此基礎上支持更多方式。 Android系統(tǒng)中,應用安裝包.apk文件屬于默認支持的文件類型,它的的mime type被定義為"application/vnd.android.package-archive"。 系統(tǒng)內(nèi)置了安裝工具來解析并安裝.apk文件。你可以從OPhone平臺的文件管理器中找到對應安裝包,點擊即可啟動安裝步驟。這里給出了相應的代碼,有興趣的開發(fā)者可以嘗試使用。Intent apkintent = Intent(Intent.ACTION_VIEW); Uri puri = Uri.fromFile( File(path)); //path is the path of source apk apkintent.setDataAndType(puri, "application/vnd.android.package-archive"); startActivity(apkintent);
Android系統(tǒng)提供了安裝應用的API:PackageManager.installPackage(final Uri packageURI,
final IPackageInstallObserver observer, final int flags); uri給出了原文件的地址observer實現(xiàn)了回調(diào)函數(shù)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分區(qū)。 因為手機中data分區(qū)大小有限,因此OPhone平臺默認將應用裝到存儲卡上。 本API需要"android.permission.INSTALL_PACKAGES"權限,該權限屬于簽名級別,因此只有系統(tǒng)級別的應用程序才能使用。 Android支持拷貝即安裝的方式,即將安裝包拷貝到預置安裝目錄即可自動安裝,但所有的預置目錄對于用戶不可見。 OPhone平臺擴展后,用戶可將安裝包拷入存儲卡的app目錄下,系統(tǒng)將監(jiān)控該文件夾,檢測到新的安裝文件后自動安裝。 這種方式適合一次安裝大量應用,但是也有壞處。一是無法知道哪些應用安裝成功,哪些安裝失敗, 二是安裝失敗的應用將會作為垃圾存放在預置目錄中,在系統(tǒng)啟動時延長啟動時間,三是過多的應用可能將data分區(qū)的空間占用過多,影響系統(tǒng)的正常使用。解析安裝包是否合法,如果合法即加載應用,如果非法即放棄安裝取出代碼段,放入/data/dalvik-cache目錄建立/data/data/包名的文件夾,以存放用戶數(shù)據(jù)將安裝包攜帶的lib放入/data/data/包名/lib中以上步驟完成后將安裝包拷到安裝目錄加載該應用信息
Android系統(tǒng)同樣支持多種卸載方式。 使用預置卸載工具 系統(tǒng)內(nèi)置了卸載工具。這里給出了啟動代碼,執(zhí)行后即可看到卸載步驟:Uri packageURI = Uri.parse("package:"+packageName); Intent uninstallIntent = Intent(Intent.ACTION_DELETE, packageURI); startActivity(uninstallIntent); Android提供了卸載應用的標準API:PackageManager().deletePackage(String packageName, IPackageDeleteObserver observer, int flags);1. observer實現(xiàn)了回調(diào)函數(shù)packageDeleted(boolean succeeded)以檢查卸載是否成功2. flags提供卸載標識。Android平臺提供的標識有 PackageManager.DONT_DELETE_DATA = 0x00000001;
標識卸載時是否同時刪除用戶數(shù)據(jù)。 本API需要"android.permission.DELETE_PACKAGES"權限,該權限屬于簽名級別,因此只有系統(tǒng)級別的應用程序才能使用。 對應于拷貝即安裝,系統(tǒng)同樣支持刪除即卸載功能。當用戶刪除/sdcard/app目錄下安裝包時,系統(tǒng)將自動檢測到刪除事件并卸載對應應用。
本方法適合一次刪除大量應用。刪除代碼段如果需要刪除用戶數(shù)據(jù),則刪除建立/data/data/包名的文件夾,以存放用戶數(shù)據(jù)刪除應用信息刪除安裝包
應用安裝后即處于可用狀態(tài)。對于系統(tǒng)中所有應用,從管理層面分為信息管理和應用調(diào)度兩部分;從應用自身角度分為去激活與激活兩種狀態(tài)。
|