一、application 語法(SYNATX):
<application
android:allowTaskReparenting=["true" | "false"]
android:allowBackup=["true" | "false"]
android:backupAgent="*string*"
android:banner="*drawable resource*"
android:extractNativeLibs=["true" | "false"]
android:fullBackupContent="string"
android:fullBackupOnly=["true" | "false"]
android:debuggable=["true" | "false"]
android:description="*string resource*"
android:enabled=["true" | "false"]
android:hasCode=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="*drawable resource*"
android:isGame=["true" | "false"]
android:killAfterRestore=["true" | "false"]
android:largeHeap=["true" | "false"]
android:label="*string resource*"
android:logo="*drawable resource*"
android:manageSpaceActivity="*string*"
android:name="*string*"
android:permission="*string*"
android:persistent=["true" | "false"]
android:process="*string*"
android:restoreAnyVersion=["true" | "false"]
android:requiredAccountType="*string*"
android:restrictedAccountType="*string*"
android:supportsRtl=["true" | "false"]
android:taskAffinity="*string*"
android:testOnly=["true" | "false"]
android:theme="*resource or theme*"
android:uiOptions=["none" | "splitActionBarWhenNarrow"]
android:usesCleartextTraffic=["true" | "false"]
android:vmSafeMode=["true" | "false"] >
. . .
</application>
被包含于(CONTAINED IN):
<manifest>
能夠包含的元素(CAN CONTAIN):
<activity>
<activity-alias>
<service>
<receiver>
<provider>
<uses-library>
說明(DESCRIPTION):
這個(gè)元素用于應(yīng)用程序的聲明。它包含了每個(gè)應(yīng)用程序組件所聲明的子元素,并且還有能夠影響所有組件的屬性。其中的很多屬性(如icon、label、permission、process、taskAffinity和allowTaskReparenting)會(huì)給組件元素中對應(yīng)的屬性設(shè)置默認(rèn)值。其他的給是應(yīng)用程序整體設(shè)置的值(如debuggable、enabled、description、allowClearUserData),并且這些屬性值不能被組件的屬性所覆蓋。
屬性(ATTRIBUTES):
Android:allowTaskReparenting
當(dāng)一個(gè)與當(dāng)前任務(wù)有親緣關(guān)系的任務(wù)被帶到前臺(tái)時(shí),用這個(gè)屬性來指定應(yīng)用程序中定義的Activity能否從他們當(dāng)前的任務(wù)中轉(zhuǎn)移到這個(gè)有親緣關(guān)系的任務(wù)中。如果設(shè)置為true,則能夠轉(zhuǎn)移,如果設(shè)置為false,則應(yīng)用程序中的Activity必須保留在它們所在的任務(wù)中。默認(rèn)值是false。
<activity>元素有它們自己的allowTaskReparenting屬性,它能夠覆蓋<application>元素中的設(shè)置。
android:allowBackup
這個(gè)標(biāo)識(shí)用來表示是否允許應(yīng)用備份相關(guān)的數(shù)據(jù)并且在必要時(shí)候恢復(fù)還原這些數(shù)據(jù),如果該標(biāo)識(shí)設(shè)為false,則代表不備份和恢復(fù)任何的應(yīng)用數(shù)據(jù),默認(rèn)的該標(biāo)識(shí)屬性為true。當(dāng) allowBackup 標(biāo)識(shí)設(shè)置為 true 時(shí),用戶即可以通過 adb backup和 adb restore來進(jìn)行對應(yīng)數(shù)據(jù)的備份和恢復(fù),這個(gè)在很多時(shí)候會(huì)帶來一定的安全風(fēng)險(xiǎn)?! ?br>
adb backup 命令容許任何一個(gè)打開 USB 調(diào)試開關(guān)的人從 Android 手機(jī)中復(fù)制應(yīng)用數(shù)據(jù)到外設(shè),一旦應(yīng)用數(shù)據(jù)被備份之后,所有應(yīng)用數(shù)據(jù)都可被用戶讀??;adb restore命令允許用戶指定一個(gè)恢復(fù)的數(shù)據(jù)來源(即備份的應(yīng)用數(shù)據(jù))來恢復(fù)應(yīng)用程序數(shù)據(jù)的創(chuàng)建。因此,當(dāng)一個(gè)應(yīng)用數(shù)據(jù)被備份之后,用戶即可在其他Android手機(jī)或模擬器上安裝同一個(gè)應(yīng)用,以及通過恢復(fù)該備份的應(yīng)用數(shù)據(jù)到該設(shè)備上,在該設(shè)備上打開該應(yīng)用即可恢復(fù)到被備份的應(yīng)用程序的狀態(tài)。尤其是通訊錄應(yīng)用,一旦應(yīng)用程序支持備份和恢復(fù)功能,攻擊者即可通過adb backup和adb restore進(jìn)行恢復(fù)新安裝的同一個(gè)應(yīng)用來查看聊天記錄等信息;對于支付金融類應(yīng)用,攻擊者可通過此來進(jìn)行惡意支付、盜取存款等;因此為了安全起見,開發(fā)者務(wù)必將allowBackup標(biāo)志值設(shè)置為false來關(guān)閉應(yīng)用程序的備份和恢復(fù)功能,以免造成信息泄露和財(cái)產(chǎn)損失?! ?br>
網(wǎng)上也可以看到很多將 allowBackup 設(shè)置為true帶來的許多風(fēng)險(xiǎn)。
可以看看這篇博客:詳解Android App AllowBackup配置帶來的風(fēng)險(xiǎn)。
android:backupAgent
這個(gè)屬性用于定義應(yīng)用程序備份代理的實(shí)現(xiàn)類的名稱,這個(gè)類是BackupAgent類的一個(gè)子類。它的屬性值應(yīng)該是完整的Java類的名稱(如,com.example.project.MyBackupAgent)。但是,也可以使用用”.”符號(hào)開頭的簡稱(如,.MyBackupAgent),系統(tǒng)會(huì)把<manifest>元素中指定的包名追加到”.”符號(hào)的前面。
android:banner
這個(gè)標(biāo)識(shí)是用在 Android TV 電視上用輪播圖來代表一個(gè)應(yīng)用,由于輪播圖只是在 HOME 界面上顯示的,所以它僅僅只能被一個(gè)帶有能夠處理 CATEGORY_LEANBACK_LAUNCHER intent Activity 的應(yīng)用聲明。由于這個(gè)標(biāo)識(shí)是 Android TV 開發(fā)使用到的,在這里就不詳細(xì)介紹了,具體的可以看 Google 的 API 文檔。
android:extractNativeLibs
這個(gè)標(biāo)識(shí)為android 6.0引入,該屬性如果設(shè)置為false,則系統(tǒng)在安裝應(yīng)用的時(shí)候不會(huì)把 so 文件從 apk 中解壓出來了,同時(shí)修改 System.loadLibrary直接打開調(diào)用 apk 中的 so 文件。但是,目前要讓該技巧生效還需要額外2個(gè)條件:一個(gè)是apk 中的 .so 文件不能被壓縮;二個(gè)是 .so 必須用zipalign -p 4來對齊。該標(biāo)識(shí)的默認(rèn)值為true。
android:fullBackupContent
這個(gè)標(biāo)識(shí)用來指明備份的數(shù)據(jù)的規(guī)則,該標(biāo)識(shí)當(dāng)然是配合Auto Backup for Apps來使用的,它也是在 Android 6.0 中引入的,使用的方式如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.my.appexample">
...
<app ...
android:fullBackupContent="@xml/mybackupscheme">
</app>
...
</manifest>
在此示例代碼中,android:fullBackupContent 屬性指定了一個(gè) XML 文件。該文件名為mybackupscheme.xml,位于應(yīng)用開發(fā)項(xiàng)目的 res/xml/ 目錄中。 此配置文件包括關(guān)于要備份哪些文件的規(guī)則。 下列示例代碼顯示了將某一特定文件排除在備份之外的配置文件:
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="database" path="device_info.db"/>
<full-backup-content>
此示例備份配置僅將一個(gè)特定數(shù)據(jù)庫文件排除在備份之外,所有其他文件均予以備份。
android:fullBackupOnly
這個(gè)標(biāo)識(shí)用來指明當(dāng)Auto Backup for Apps功能可以使用的時(shí)候是否開啟它。如果該標(biāo)識(shí)設(shè)置為 true,在 Android 6.0 以及之上的手機(jī)上,應(yīng)用將會(huì)執(zhí)行Auto Backup for Apps功能,在之前的 Android 版本中,你的應(yīng)用將會(huì)自動(dòng)忽略該標(biāo)識(shí),并且切換成 Key/Value Backups。
android:debuggable
這個(gè)屬性用于指定應(yīng)用程序是否能夠被調(diào)試,即使是以用戶模式運(yùn)行在設(shè)備上的時(shí)候。如果設(shè)置為true,則能夠被調(diào)試,否則不能調(diào)試,默認(rèn)值是false。
android:description
這個(gè)屬性用于定義應(yīng)用程序相關(guān)的用戶可讀文本,它要比應(yīng)用程序標(biāo)簽更長、更詳細(xì)。它的的值必須被設(shè)置成一個(gè)字符串資源的引用。跟label屬性不一樣,label屬性可以使用原生的字符串。這個(gè)屬性沒有默認(rèn)值。
android:enabled
這個(gè)屬性用于指定Android系統(tǒng)能否實(shí)例化應(yīng)用程序組件。如果設(shè)置為true,這個(gè)可以實(shí)例化其組件,否則不能夠?qū)嵗?。如果這個(gè)屬性被設(shè)置為true,那么就會(huì)使用每個(gè)組件自己enabled屬性的設(shè)置來判斷其是否能夠被實(shí)例化。如果這個(gè)屬性被設(shè)置為false,它會(huì)覆蓋其所有組件自己指定的值,應(yīng)用程序中的所有組件都會(huì)被禁用。
默認(rèn)值是true。
android:hasCode
這個(gè)屬性用于設(shè)置應(yīng)用程序是否包含了代碼,如果設(shè)置為true,則包含代碼,否則不包含任何代碼。在這個(gè)屬性被設(shè)置為false的時(shí)候,系統(tǒng)在加載組件的時(shí)候不會(huì)試圖加載任何應(yīng)用程序的代碼。默認(rèn)值是true。
如果應(yīng)用程序沒有使用任何應(yīng)用內(nèi)置組件類以外的組件,那么這個(gè)應(yīng)用程序就不會(huì)有任何自己的代碼,像使用AliasActivity類的Activity,是很少發(fā)生的。
android:hardwareAccelerated
是否為應(yīng)用程序中所有的 Activity 和 View 啟用硬件加速渲染功能true表示開啟,“false”表示關(guān)閉。 如果 minSdkVersion 或 targetSdkVersion 的值大于等于14,則本屬性默認(rèn)值是true,否則,默認(rèn)值為false。
自 Android 3.0 (API 級(jí)別 11)開始,應(yīng)用程序可以使用硬件加速的 OpenGL 渲染功能來提高很多常用 2D 圖形操作的性能。 當(dāng)開啟硬件加速渲染功能時(shí),大部分 Canvas、Paint、Xfermode、ColorFilter、Shader 和 Camera 中的操作都會(huì)被加速。 即便應(yīng)用程序沒有顯式地調(diào)用系統(tǒng)的 OpenGL 庫,這仍能使動(dòng)畫更加平滑、屏幕滾動(dòng)也更加流暢、整體響應(yīng)速度獲得改善。
請注意,并非所有的 OpenGL 2D 操作都會(huì)被加速。 如果開啟了硬件加速渲染功能,請對應(yīng)用程序進(jìn)行測試以確保使用渲染時(shí)不會(huì)出錯(cuò)。更多詳細(xì)的操作可以去查看 google 文檔硬件加速指南。
android:isGame
這個(gè)標(biāo)識(shí)用來指明該應(yīng)用是否是游戲,這樣就能夠?qū)⒃搼?yīng)用和其他應(yīng)用分離開來,默認(rèn)的改值為 false。
android:icon
這個(gè)屬性用于設(shè)置應(yīng)用程序的整個(gè)圖標(biāo),以及每個(gè)應(yīng)用組件的默認(rèn)圖標(biāo)。對于<activity>、<activity-alias>、<service>、<service>、<receiver>和<provider>元素,請看它們各自的icon屬性。
設(shè)置這個(gè)屬性時(shí),必須要引用一個(gè)包含圖片的可繪制資源(例如,“@drawable/icon”)。沒有默認(rèn)的圖標(biāo)。
android:killAfterRestore
這個(gè)屬性用于指定在全系統(tǒng)的恢復(fù)操作期間,應(yīng)用的設(shè)置被恢復(fù)以后,對應(yīng)的問題程序是否應(yīng)該被終止。單包恢復(fù)操作不會(huì)導(dǎo)致應(yīng)用程序被關(guān)掉。全系統(tǒng)的復(fù)原操作通常只會(huì)發(fā)生一次,就是在電話被首次建立的時(shí)候。第三方應(yīng)用程序通常不需要使用這個(gè)屬性。
默認(rèn)值是true,這意味著在全系統(tǒng)復(fù)原期間,應(yīng)用程序完成數(shù)據(jù)處理之后,會(huì)被終止。
android:largeHeap
這個(gè)標(biāo)識(shí)用來表明這個(gè)應(yīng)用的進(jìn)程是否需要更大的運(yùn)行內(nèi)存空間,這個(gè)標(biāo)識(shí)對該應(yīng)用的所有進(jìn)程都有效,但是需要注意的一點(diǎn)是,這僅僅對第一個(gè)加載進(jìn)這個(gè)進(jìn)程的應(yīng)用起作用,如果用戶通過 sharedUserId 將多個(gè)應(yīng)用置于同一個(gè)進(jìn)程(SharedUserId 的具體用法可以參考:android IPC通信(上)-sharedUserId&&Messenger),那么兩個(gè)應(yīng)用都必須要指定該標(biāo)識(shí)并且設(shè)置為同一個(gè)值,要不然就會(huì)產(chǎn)生意想不到的結(jié)果?! ?br>
大部分應(yīng)用程序不需要用到本屬性,而是應(yīng)該關(guān)注如何減少內(nèi)存消耗以提高性能。 使用本屬性并不能確保一定會(huì)增加可用的內(nèi)存,因?yàn)槟承┰O(shè)備可用的內(nèi)存本來就很有限。要在運(yùn)行時(shí)查詢可用的內(nèi)存大小,請使用 getMemoryClass() 或getLargeMemoryClass() 方法,后者的方法可以獲取到應(yīng)用開啟 largeHeap 之后可以獲得的內(nèi)存大小。
這里說到一點(diǎn)是,一個(gè)應(yīng)用不應(yīng)該通過這個(gè)屬性來解決 OOM 問題,而是應(yīng)該通過檢測內(nèi)存泄漏來徹底根治 OOM,而且當(dāng)內(nèi)存很大的時(shí)候,每次gc的時(shí)間也會(huì)長一些,性能也會(huì)隨之下降。
android:label
這個(gè)屬性用于設(shè)置應(yīng)用程序整體的用戶可讀的標(biāo)簽,并也是每個(gè)應(yīng)用程序組件的默認(rèn)標(biāo)簽。對于<activity>、<activity-alias>、<service>、<receiver>和<provider>元素,請看它們各自的label屬性。
設(shè)置這個(gè)屬性值時(shí),應(yīng)該引用一個(gè)字符串資源。以便它能夠跟用戶界面中的其他字符串一樣能夠被本地化。但是為了應(yīng)用程序開發(fā)的便利,也能夠用原生的字符串來設(shè)置。
android:logo
這個(gè)屬性用于給整個(gè)應(yīng)用程序設(shè)置一個(gè)Logo,而且它也是所有Activity的默認(rèn)Logo。
設(shè)置這個(gè)屬性時(shí),必須要引用一個(gè)包含圖片的可繪制資源(如:“@drawable/logo”)。沒有默認(rèn)的Logo。
android:manageSpaceActivity
這個(gè)標(biāo)識(shí)用來指定一個(gè) Activity 的名字,當(dāng)用戶在設(shè)置頁面中手動(dòng)點(diǎn)擊清除數(shù)據(jù)按鈕時(shí),不會(huì)像以前一樣把應(yīng)用的私有目錄/data/data/包名下的數(shù)據(jù)完全清除,而是跳轉(zhuǎn)到那個(gè)聲明的 activity 中,讓用戶遵照 activity 中提供的功能清除指定的數(shù)據(jù)?! ?br> 感興趣的可以看看該鏈接:android:manageSpaceActivity讓應(yīng)用手動(dòng)管理應(yīng)用的數(shù)據(jù)目錄
android:name
這整個(gè)屬性用完整的Java類名,給應(yīng)用程序定義了一個(gè)Application子類的實(shí)現(xiàn)。當(dāng)應(yīng)用程序進(jìn)程被啟動(dòng)時(shí),這個(gè)類在其他任何應(yīng)用程序組件被實(shí)例化之前實(shí)例化。
這個(gè)子類實(shí)現(xiàn)是可選的,大多數(shù)應(yīng)用程序不需要一個(gè)子類的實(shí)現(xiàn)。如果沒有實(shí)現(xiàn)自己的子類,Android系統(tǒng)會(huì)使用基本的Application類的一個(gè)實(shí)例。
android:permission
這個(gè)屬性定義了一個(gè)權(quán)限,為了跟應(yīng)用程序進(jìn)行交互,客戶端必須要有這個(gè)權(quán)限。這個(gè)屬性是為給所有的應(yīng)用程序組件設(shè)置權(quán)限提供了便利的方法。它能夠被獨(dú)立組件所設(shè)置的permission屬性所覆蓋。
android:persistent
這個(gè)屬性用戶設(shè)置應(yīng)用程序是否應(yīng)該時(shí)刻保持運(yùn)行狀態(tài),如果設(shè)置為true,那么就保持,否則不保持。默認(rèn)值是false。普通的應(yīng)用程序不應(yīng)該設(shè)置這個(gè)屬性,持久運(yùn)行模式僅用于某些系統(tǒng)級(jí)的應(yīng)用程序。
android:process
這個(gè)屬性用于定義一個(gè)進(jìn)程名稱,應(yīng)用程序的所有組件都應(yīng)該運(yùn)行在這個(gè)進(jìn)程中。每個(gè)組件都能夠用它自己process屬性的設(shè)置來覆蓋這個(gè)<application>元素中的設(shè)置。
默認(rèn)情況下,當(dāng)應(yīng)用程序的第一個(gè)組件需要運(yùn)行時(shí),Android系統(tǒng)就會(huì)給這個(gè)應(yīng)用程序創(chuàng)建一個(gè)進(jìn)程。然后,應(yīng)用中的所有組件都運(yùn)行在這個(gè)進(jìn)程中。默認(rèn)的進(jìn)程名是跟<manifest>元素中設(shè)置的包名進(jìn)行匹配的。
通過設(shè)置這個(gè)屬性,能夠跟另外一個(gè)應(yīng)用程序共享一個(gè)進(jìn)程名,能夠把這兩個(gè)應(yīng)用程序中的組件都安排到同一個(gè)進(jìn)程中運(yùn)行---但是僅限于這兩個(gè)應(yīng)用程序共享一個(gè)用戶ID,并且?guī)в邢嗤臄?shù)字證書。
如果這個(gè)進(jìn)程名稱用“:”開頭,那么在需要的時(shí)候,就會(huì)給應(yīng)用程序創(chuàng)建一個(gè)新的、私有的進(jìn)程。如果進(jìn)程名用小寫字符開頭,就會(huì)用這個(gè)名字創(chuàng)建一個(gè)全局的進(jìn)程,這個(gè)全局的進(jìn)程能夠被其他應(yīng)用程序共享,從而減少資源的使用。
android:restoreAnyVersion
設(shè)置這個(gè)屬性表示應(yīng)用程序準(zhǔn)備嘗試恢復(fù)任何備份的數(shù)據(jù)集,即使備份比設(shè)備上當(dāng)前安裝的應(yīng)用程序的版本要新。這個(gè)屬性設(shè)置為true,即使是在版本不匹配而產(chǎn)生數(shù)據(jù)兼容性提示的時(shí)候,也會(huì)允許備份管理來恢復(fù)備份的數(shù)據(jù),所以要謹(jǐn)慎使用。
這個(gè)屬性的默認(rèn)值是false。
android:taskAffinity
這個(gè)屬性給應(yīng)用的所有的Activity設(shè)置了一個(gè)親緣關(guān)系名,除了那些用它們自己的taskAffinity屬性設(shè)置不同親緣關(guān)系的組件。
默認(rèn)情況下,應(yīng)用程序中的所有Activity都會(huì)共享相同的親緣關(guān)系,親緣關(guān)系的名稱跟由<manifest>元素設(shè)置的包名相同。
android:theme
這個(gè)屬性給應(yīng)用程序中所有的Activity設(shè)置默認(rèn)的主題,屬性值要引用一個(gè)樣式資源。每個(gè)獨(dú)立的Activity的主題會(huì)被它們自己的theme屬性所覆蓋。
android:uiOptions
這個(gè)屬性設(shè)置了Activity的UI的額外選項(xiàng)。它必須是下表中的一個(gè)值:
none
默認(rèn)設(shè)置,沒有額外的UI選項(xiàng)。splitActionBarWhenNarrow
在水平空間受到限制的時(shí)候,會(huì)在屏幕的底部添加一個(gè)用于顯示ActionBar中操作項(xiàng)的欄,例如:在縱向的手持設(shè)備上。而不是在屏幕頂部的操作欄中顯示少量的操作項(xiàng)。它會(huì)把操作欄分成上下兩部分,頂部用于導(dǎo)航選擇,底部用于操作項(xiàng)目。這樣就會(huì)確??捎玫暮侠砜臻g不僅只是針對操作項(xiàng)目,而且還會(huì)在頂部給導(dǎo)航和標(biāo)題留有空間。菜單項(xiàng)目不能被分開到兩個(gè)欄中,它們要顯示在一起。
二、Android uses-feature 和 uses-permission的作用 關(guān)系和區(qū)別
關(guān)于手機(jī)權(quán)限的獲取我們在mainfest中有兩個(gè)常用的標(biāo)簽,users-feature 和 uses-permission。
1、uses-feature
定義一個(gè)該app會(huì)用到的硬件或者軟件功能。(android 系統(tǒng)提供的可以選擇的功能列表參考:Features Reference)。標(biāo)簽的目的是用來描述該app所依賴的硬件和軟件的功能有哪些,并不負(fù)責(zé)向系統(tǒng)去請求權(quán)限。
<uses-feature
android:name="string"
android:required=["true" | "false"]
android:glEsVersion="integer" />
//屬性含義
android:name | app需要定義的功能的名稱
android:required | 為ture時(shí)表示該功能對于app來說是必須有的,如果某一設(shè)備不具備該功能,google play 商店將會(huì)對該設(shè)備隱藏該app;為false時(shí)表示該功能對于 app來說時(shí)非必需的,即使某一設(shè)備不具備該功能,google play商店仍然會(huì)對該設(shè)備顯示該app
android:glEsVersion | 指定openGL ES的版本號(hào),只針對open GL功能
例子如下:
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />
uses-feature的作用更像是一個(gè)過濾器,google play 商店會(huì)根據(jù)該標(biāo)簽來過濾設(shè)備,比如用戶在uses-feature中聲明了要使用相機(jī),這時(shí)候在google play商店中該app就不再對沒有照相機(jī)的設(shè)備顯示。但是,如果用戶同時(shí)也設(shè)置了uses-feature的屬性android:required 為false的話,google play商店仍然會(huì)對沒有照相機(jī)的設(shè)備顯示該app。
主題 android:theme="@android:style/Theme.NoDisplay"
我們在做微信開發(fā)的時(shí)候,回調(diào)頁面會(huì)出現(xiàn)上述屏幕閃爍一下的現(xiàn)象,這時(shí)候可以使用這個(gè)主題