一、文件結(jié)構(gòu)
- 以下這些是僅有的合法元素,您無法添加自己的元素或?qū)傩浴?/li>
- 同一級別的元素通常不分先后順序。
- 從某種意義上說,所有屬性都是可選的。但是,必須指定某些屬性,元素才可實現(xiàn)其目的。
<manifest>
<uses-permission />
<permission />
<permission-tree />
<permission-group />
<instrumentation />
<uses-sdk />
<uses-configuration />
<uses-feature />
<supports-screens />
<compatible-screens />
<supports-gl-texture />
<application>
<activity>
<intent-filter>
<action />
<category />
<data />
</intent-filter>
<meta-data />
</activity>
<activity-alias>
<intent-filter> . . . </intent-filter>
<meta-data />
</activity-alias>
<service>
<intent-filter> . . . </intent-filter>
<meta-data/>
</service>
<receiver>
<intent-filter> . . . </intent-filter>
<meta-data />
</receiver>
<provider>
<grant-uri-permission />
<meta-data />
<path-permission />
</provider>
<uses-library />
</application>
</manifest>
二、元素詳解
<manifest xmlns:android="http://schemas.android.com/apk/res/android"<!--清單文件根節(jié)點-->
package="com.hdib"> <!--這里是默認是包名,但現(xiàn)在都是用gradle配置了,這個就只代表路徑名了,包名有由build.gradle中的 applicationId 決定。-->
<!--如果應用需要訪問受權(quán)限保護的功能,則必須在清單中使用 <uses-permission> 元素聲明應用需要該權(quán)限。將應用安裝到設備上之后,安裝程序會通過檢查簽署應用證書的頒發(fā)機構(gòu)并(在某些情況下)詢問用戶,確定是否授予請求的權(quán)限。如果授予權(quán)限,則應用能夠使用受保護的功能。否則,其訪問這些功能的嘗試將會失敗,并且不會向用戶發(fā)送任何通知。-->
<uses-permission />
<!--如果不是系統(tǒng)提供的權(quán)限,在使用前需要先聲明該權(quán)限
normal: 風險較低的權(quán)限,系統(tǒng)會在安裝時自動向請求的應用程序授予此類權(quán)限,而不會要求用戶明確批準(盡管用戶始終可以選擇在安裝之前查看這些權(quán)限)。
dangerous: 較高風險的權(quán)限,在請求該類權(quán)限之前可以顯示給用戶并且在繼續(xù)之前需要確認,或者可以采取一些其他方法來避免用戶自動允許使用這些設施。
signature: 僅當請求的應用程序使用與聲明該權(quán)限的應用程序相同的證書進行簽名時,系統(tǒng)才授予的權(quán)限。如果證書匹配,系統(tǒng)將自動授予權(quán)限,而不通知用戶或要求用戶明確批準。
signatureOrSystem: 該權(quán)限用于某些特殊情況,其中多個供應商將應用程序內(nèi)置到系統(tǒng)映像中,并且需要明確共享特定功能,因為它們是一起構(gòu)建的。
-->
<permission
android:permissionFlags=["removed"|"costsMoney"] <!---->
android:permissionGroup="" <!--指定所屬權(quán)限組,可以是系統(tǒng)權(quán)限組,也可以是<permission-group />標簽定義的權(quán)限組-->
android:protectionLevel=["normal"|"dangerous"|"signature"|"signatureOrSystem"]/>
<!--該元素為代碼中定義的一組權(quán)限聲明命名空間-->
<permission-tree />
<!--為一組權(quán)限定義標簽,包括在清單中使用 <permission> 元素聲明的權(quán)限以及在其他位置聲明的權(quán)限。這只影響如何對提供給用戶的權(quán)限進行分組。<permission-group> 元素并不指定屬于該組的權(quán)限,而只是為組提供名稱。-->
<permission-group />
<!--聲明一個Instrumentation類,使您可以監(jiān)視應用程序與系統(tǒng)的交互。Instrumentation對象在任何應用程序的組件之前實例化-->
<instrumentation
android:name="string" <!--Instrumentation 類名-->
android:icon="drawable resource"
android:label="string resource"
android:functionalTest=["true" | "false"] <!--是否應該將Instrumentation類作為功能測試運行-->
android:handleProfiling=["true" | "false"] <!--“true”:確定分析開始和停止的時間;“false”:運行它的整個時間-->
android:targetPackage="string" /> <!--代理的目標應用程序包名,就是manifest標簽指定的包名-->
<!--描述應用程序與Android平臺的版本兼容性。該配置由build.gradle中配置替代-->
<uses-sdk
android:minSdkVersion="integer" <!--一個整數(shù),指定運行應用程序所需的最低API級別。如果系統(tǒng)的API級別低于此屬性中指定的值,則Android系統(tǒng)將阻止用戶安裝應用程序。您應該始終聲明此屬性。默認值“1”-->
android:targetSdkVersion="integer" <!--隨著Android每個新版本的發(fā)展,一些行為甚至外觀可能會改變。但是,如果平臺的API級別高于應用程序聲明的版本targetSdkVersion,系統(tǒng)可能會啟用兼容性行為,以確保您的應用程序繼續(xù)以您期望的方式工作。-->
android:maxSdkVersion="integer" /> <!--如果應用程序的 maxSdkVersion屬性低于系統(tǒng)本身使用的API級別,則系統(tǒng)將不允許安裝應用程序。系統(tǒng)更新時會重新驗證該值,不匹配時會刪除該應用,不建議設置該值。-->
<!--指示應用程序所需的硬件和軟件功能。例如,應用程序可能會指定它需要物理鍵盤或特定的導航設備,如軌跡球。該規(guī)范用于避免將應用程序安裝在無法運行的設備上。-->
<uses-configuration
android:reqFiveWayNav=["true"|"false"]
android:reqHardKeyboard=["true"|"false"]
android:reqKeyboardType=["undefined"|"nokeys"|"qwerty"|"twelvekey"]
android:reqNavigation=["undefined"|"nonav"|"dpad"|"trackball"|"wheel"]
android:reqTouchScreen=["undefined"|"notouch"|"stylus"|"finger"]/>
<!--聲明一個單獨的被應用程序使用的硬件或軟件功能。目的是通知其他外部實體。-->
<uses-feature
android:name="string" <!--功能名,如:android.hardware.bluetooth、android.hardware.camera。-->
android:required=["true" | "false"] <!--“true”:如果沒有此功能,應用程序?qū)o法運行?!癴alse”:可以在沒有它的情況下運行。-->
android:glEsVersion="integer"/> <!--對于某些功能,有可能存在一個特定的屬性,以便定義功能的版本,如被使用的Open GL的版本。-->
<!--指定應用程序支持的屏幕大小,并為大于應用程序支持的屏幕啟用屏幕兼容模式。在應用程序中始終使用此元素來指定應用程序支持的屏幕大小非常重要。-->
<supports-screens
android:requiresSmallestWidthDp="integer"
android:compatibleWidthLimitDp="integer"
android:largestWidthLimitDp="integer" <!--如果您正在為Android 3.2及更高版本開發(fā)應用程序,則應使用以上三個屬性來聲明屏幕大小支持,而不是基于通用屏幕大小的屬性。-->
android:resizeable=["true"| "false"] <!--是否可針對不同的屏幕大小調(diào)整大小。-->
android:smallScreens=["true" | "false"] <!--是否支持較小的屏幕外形。-->
android:normalScreens=["true" | "false"] <!--是否支持“正?!逼聊?->
android:largeScreens=["true" | "false"] <!--是否支持更大的屏幕外形。-->
android:xlargeScreens=["true" | "false"] <!--是否支持超大屏幕外形。-->
android:anyDensity=["true" | "false"]/> <!--是否包含適應任何屏幕密度的資源。默認情況下這是“true”,除非您絕對確定應用程序必須正常工作,否則不應將其設置為“false”。唯一可能需要禁用此功能的是您的應用程序直接操作位圖。-->
<!--指定與應用程序兼容的每個屏幕配置。<compatible-screens>清單中只允許一個元素實例,但它可以包含多個<screen>元素。每個<screen>元素指定應用程序兼容的特定屏幕大小 - 密度組合。Android系統(tǒng)不會讀取<compatible-screens>清單元素(既不在安裝時也不在運行時)。此元素僅供參考,可供外部服務(如Google Play)使用,以更好地了解應用程序與特定屏幕配置的兼容性,并為用戶啟用過濾。未在此元素中聲明的任何屏幕配置都是 與應用程序不 兼容的屏幕。因此,外部服務(例如Google Play)不應將應用程序提供給具有此類屏幕的設備。通常,您不應使用此清單元素。-->
<compatible-screens>
<screen android:screenSize=["small" | "normal" | "large" | "xlarge"]
android:screenDensity=["ldpi" | "mdpi" | "hdpi" | "xhdpi"] />
...
</compatible-screens>
<!--聲明應用程序支持的單個GL紋理壓縮格式。如果您的應用程序支持多種紋理壓縮格式,則可以聲明多個 <supports-gl-texture>元素。-->
<supports-gl-texture android:name="string" />
<application <!--應用程序根節(jié)點,只能有一個,對于一個可運行的應用程序,必須有一個這樣的節(jié)點。對應Application類,節(jié)點內(nèi)包含四大組件的配置-->
android:name="string" <!--類名,組件標簽節(jié)點都有該屬性,可以省略外層包名-->
android:icon="drawable reource" <!--整個應用程序的圖標,以及每個應用程序組件的默認圖標,僅用于展示的-->
android:logo="drawable resource" <!--整個應用程序的徽標,以及活動的默認徽標。標志性的,和icon不同-->
android:label="string resource" <!--整個應用程序的標簽,以及每個應用程序組件的默認標簽-->
android:allowTaskReparenting=["true"|"false"]<!--是否允許組件在不同的TaskStack中動態(tài)轉(zhuǎn)移,轉(zhuǎn)移到調(diào)用它的那個TaskStack中。-->
android:backupAgent="string" <!--指定一個用于備份的 BackupAgentHelper 類-->
android:debuggable=["true"|"false"] <!--是否可以調(diào)試應用程序-->
android:description="string resource" <!--關于應用程序的用戶可讀文本,比應用程序標簽更長,更具描述性-->
android:enabled=["true"|"false"] <!--Android系統(tǒng)是否可以實例化應用程序的組件-->
android:hasCode=["true"|"false"] <!--應用程序是否包含程序代碼,只有當應用程序只使用內(nèi)置組件類時才不會有自己的任何代碼,這種情況很少發(fā)生-->
android:hardwareAccelerated=["true"|"false"] <!--是否應為此應用程序中的所有活動和視圖啟用硬件加速渲染-->
android:killAfterRestore=["true"|"false"] <!--是否應在完整系統(tǒng)還原操作期間恢復其設置后終止相關應用程序,第三方應用程序通常不需要使用此屬性-->
android:largeHeap=["true"|"false"] <!--是否應使用大型Dalvik堆創(chuàng)建應用程序的進程。這適用于為應用程序創(chuàng)建的所有進程。它僅適用于加載到進程中的第一個應用程序; 如果您使用共享用戶ID以允許多個應用程序使用進程,則它們都必須一致地使用此選項,否則它們將具有不可預測的結(jié)果。大多數(shù)應用程序不應該需要這個,而應該專注于減少其整體內(nèi)存使用量以提高性能。啟用此功能也不能保證可用內(nèi)存的固定增加,因為某些設備受其總可用內(nèi)存的限制。-->
android:manageSpaceActivity="string" <!--用于指定自定義的存儲空間管理Activity頁面,如果設置了該項,當用戶想清除數(shù)據(jù)時,應用信息頁面就會多一個管理空間的按鈕,點擊時就會跳轉(zhuǎn)到這個頁面-->
android:permission="string" <!--需要與該應用進行交互的其他應用應該具有此權(quán)限-->
android:persistent=["true"|"false"] <!--是否設置為常駐進程,應用程序通常不應設置此標志,持久性模式僅適用于某些系統(tǒng)應用程序-->
android:process="string" <!--全局默認進程-->
android:restoreAnyVersion=["true"|"false"] <!--指示應用程序已準備好嘗試還原任何備份數(shù)據(jù)集,即使備份是由比應用程序當前安裝的應用程序更新版本存儲的-->
android:taskAffinity="string" <!--全局TaskStack名,默認為應用包名-->
android:uiOptions=["none"|"splitActionBarWhenNarrow"] <!--選擇后者,在屏幕底部添加一個條,以便ActionBar在受到水平空間約束時(例如在手機上以縱向模式進行操作時)顯示操作項。操作欄分為頂部導航部分和操作項底部欄,而不是屏幕頂部操作欄中顯示的少量操作項。這確保了合理的空間不僅可用于操作項,還可用于頂部的導航和標題元素。菜單項不會分成兩個欄; 他們總是一起出現(xiàn)。-->
android:theme="resource or theme"> <!--全局默認主題-->
<activity <!--Activity組件聲明,每個可以調(diào)起的Activity必須聲明該標簽節(jié)點。-->
android:allowTaskReparenting=["true" | "false"] <!--是否可以自動轉(zhuǎn)移到啟動它的TaskStack中去-->
android:alwaysRetainTaskState=["true" | "false"] <!--是否需要維護在Task中的狀態(tài)-->
android:clearTaskOnLaunch=["true" | "false"]
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "screenLayout", "fontScale", "uiMode",
"orientation", "screenSize", "smallestScreenSize"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"] <!--是否應從最近使用的應用程序列表(“最近的應用程序”)中排除此活動啟動的任務。也就是說,當此活動是新任務的根活動時,此屬性確定該任務是否不應出現(xiàn)在最近的應用列表中。-->
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"] <!--每當用戶再次啟動其任務(在主屏幕上選擇任務)時,是否應關閉 該Activity 實例-->
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:launchMode=["multiple" | "singleTop" |
"singleTask" | "singleInstance"]
android:multiprocess=["true" | "false"]
android:name="string"
android:noHistory=["true" | "false"] <!--該Activity將不會被保存在`History Stack`中。-->
android:parentActivityName="string" <!--該Activity的 邏輯父級的類名。此處的名稱必須與在其自己的android:name中聲明的相應活動的格式相同。當用戶按下操作欄中的“向上”按鈕時,系統(tǒng)將讀取此屬性以確定應啟動哪個活動。-->
android:permission="string"
android:process="string"
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"reverseLandscape" | "reversePortrait" |
"sensorLandscape" | "sensorPortrait" |
"sensor" | "fullSensor" | "nosensor"]
android:stateNotNeeded=["true" | "false"] <!--是否可以在未保存其狀態(tài)的情況下終止并成功重新啟動活動-->
android:taskAffinity="string" <!--一個task的`taskAffinity`值取決于它的根Activity。新建Task時,該Activity設置的`taskAffinity`屬性才能決定它所在task的`taskAffinity`屬性。清單文件中可配置Application或Activity的屬性`taskAffinity`,取值規(guī)則符合包名規(guī)則(至少包含一個點),默認值就是包名。-->
android:theme="resource or theme"
android:uiOptions=["none" | "splitActionBarWhenNarrow"]
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
<intent-filter> <!--一個組件可有任意數(shù)量的過濾器,其中每個過濾器描述一種不同的功能。-->
<action android:name=“string”/> <!--向Intent過濾器添加操作,用以表示Intent的功能過濾條件-->
<category android:name=“string”/> <!--將類別名稱添加到intent過濾器。-->
<data android:host="string" <!--域名-->
android:mimeType="string" <!--MIME類型-->
android:path="string" <!--路徑-->
android:pathPattern="string" <!--指定路徑的正則匹配模式串-->
android:pathPrefix="string" <!--指定路徑的前綴正則匹配模式串-->
android:port="string" <!--端口號-->
android:scheme="string" /> <!--協(xié)議-->
</intent-filter>
<meta-data android:name="string" <!--用于指定父標簽組件可以獲取到的數(shù)據(jù),name也就是數(shù)據(jù)的key-->
android:resource="resource specification" <!--如果數(shù)據(jù)本身是資源類型,value就用該屬性指定-->
android:value="string" /> <!--如果數(shù)據(jù)本身是非資源類型,value就用該屬性指定-->
</activity>
<activity-alias <!--該元素必須跟在所指的 activity 元素之后。-->
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:targetActivity="string"> <!--目標Activity-->
<intent-filter> . . . </intent-filter>
<meta-data />
</activity-alias>
<service
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:isolatedProcess=["true" | "false"]
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
<intent-filter> . . . </intent-filter>
<meta-data/>
</service>
<receiver
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
<intent-filter> . . . </intent-filter>
<meta-data />
</receiver>
<provider
android:authorities="list" <!--指定Uri訪問域名,多個域名用分號隔開-->
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:grantUriPermissions=["true" | "false"] <!--臨時權(quán)限是一種為應用程序組件一次性訪問受權(quán)限保護的數(shù)據(jù)的方法。例如,當電子郵件消息包含附件時,即使查看者沒有查看所有內(nèi)容提供者的數(shù)據(jù)的一般許可,郵件應用程序也可以呼叫適當?shù)牟榭凑叽蜷_它。-->
android:icon="drawable resource"
android:initOrder="integer" <!--相對于由同一進程托管的其他內(nèi)容提供程序,應實例化內(nèi)容提供程序的順序。當內(nèi)容提供者之間存在依賴關系時,為每個提供者設置此屬性可確保按照這些依賴關系所需的順序創(chuàng)建它們。該值是一個簡單的整數(shù),首先初始化更高的數(shù)字。-->
android:label="string resource"
android:multiprocess=["true" | "false"] <!--是否可以在每個客戶端進程中創(chuàng)建內(nèi)容提供程序的實例。通常,內(nèi)容提供程序在定義它的應用程序的過程中實例化。但是,如果此標志設置為“ true”,則系統(tǒng)可以在每個進程中創(chuàng)建一個實例,其中有一個客戶端想要與之交互,從而避免進程間通信的開銷。-->
android:name="string"
android:permission="string"
android:process="string" <!--指定所在進程,以冒號開頭(實際生成的進程全名是包名加此名)-->
android:readPermission="string"
android:syncable=["true" | "false"] <!--內(nèi)容提供者控制下的數(shù)據(jù)是否與服務器上的數(shù)據(jù)同步-->
android:writePermission="string">
<grant-uri-permission />
<meta-data />
<path-permission />
</provider>
<uses-library
roid:name="string" <!--庫的名稱。該名稱由您正在使用的包的文檔提供。一個例子是“android.test.runner”,一個包含Android測試類的包。-->
android:required=["true" | "false"] /><!--“true”:如果沒有此庫,應用程序?qū)o法運行?!癴alse”:可以在沒有它的情況下運行。-->
</application>
</manifest>
附:參考
官方文檔
大神整理文檔
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。