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