清单文件详解

一、文件结构

  1. 以下这些是仅有的合法元素,您无法添加自己的元素或属性。
  2. 同一级别的元素通常不分先后顺序。
  3. 从某种意义上说,所有属性都是可选的。但是,必须指定某些属性,元素才可实现其目的。
<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"<!--清单文件根节点-->
	package="com.hdib"> <!--这里是默认是包名,但现在都是用gradle配置了,这个就只代表路径名了,包名有由build.gradle中的 applicationId 决定。-->

	<!--如果应用需要访问受权限保护的功能,则必须在清单中使用 <uses-permission> 元素声明应用需要该权限。将应用安装到设备上之后,安装程序会通过检查签署应用证书的颁发机构并(在某些情况下)询问用户,确定是否授予请求的权限。如果授予权限,则应用能够使用受保护的功能。否则,其访问这些功能的尝试将会失败,并且不会向用户发送任何通知。-->
    <uses-permission />

	<!--如果不是系统提供的权限,在使用前需要先声明该权限
	normal: 风险较低的权限,系统会在安装时自动向请求的应用程序授予此类权限,而不会要求用户明确批准(尽管用户始终可以选择在安装之前查看这些权限)。
	dangerous: 较高风险的权限,在请求该类权限之前可以显示给用户并且在继续之前需要确认,或者可以采取一些其他方法来避免用户自动允许使用这些设施。
	signature: 仅当请求的应用程序使用与声明该权限的应用程序相同的证书进行签名时,系统才授予的权限。如果证书匹配,系统将自动授予权限,而不通知用户或要求用户明确批准。
	signatureOrSystem: 该权限用于某些特殊情况,其中多个供应商将应用程序内置到系统映像中,并且需要明确共享特定功能,因为它们是一起构建的。
	-->
    <permission 
        android:permissionFlags=["removed"|"costsMoney"] <!---->
        android:permissionGroup="" <!--指定所属权限组,可以是系统权限组,也可以是<permission-group />标签定义的权限组-->
        android:protectionLevel=["normal"|"dangerous"|"signature"|"signatureOrSystem"]/>
    
    <!--该元素为代码中定义的一组权限声明命名空间-->
    <permission-tree />
    
    <!--为一组权限定义标签,包括在清单中使用 <permission> 元素声明的权限以及在其他位置声明的权限。这只影响如何对提供给用户的权限进行分组。<permission-group> 元素并不指定属于该组的权限,而只是为组提供名称。-->
    <permission-group />
   
   <!--声明一个Instrumentation类,使您可以监视应用程序与系统的交互。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" <!--一个整数,指定运行应用程序所需的最低API级别。如果系统的API级别低于此属性中指定的值,则Android系统将阻止用户安装应用程序。您应该始终声明此属性。默认值“1”-->
			android:targetSdkVersion="integer" <!--随着Android每个新版本的发展,一些行为甚至外观可能会改变。但是,如果平台的API级别高于应用程序声明的版本targetSdkVersion,系统可能会启用兼容性行为,以确保您的应用程序继续以您期望的方式工作。-->
			android:maxSdkVersion="integer" /> <!--如果应用程序的 maxSdkVersion属性低于系统本身使用的API级别,则系统将不允许安装应用程序。系统更新时会重新验证该值,不匹配时会删除该应用,不建议设置该值。-->
      
    <!--指示应用程序所需的硬件和软件功能。例如,应用程序可能会指定它需要物理键盘或特定的导航设备,如轨迹球。该规范用于避免将应用程序安装在无法运行的设备上。-->
    <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”:如果没有此功能,应用程序将无法运行。“false”:可以在没有它的情况下运行。-->
		android:glEsVersion="integer"/> <!--对于某些功能,有可能存在一个特定的属性,以便定义功能的版本,如被使用的Open GL的版本。-->

	<!--指定应用程序支持的屏幕大小,并为大于应用程序支持的屏幕启用屏幕兼容模式。在应用程序中始终使用此元素来指定应用程序支持的屏幕大小非常重要。-->			
    <supports-screens 
		android:requiresSmallestWidthDp="integer"
		android:compatibleWidthLimitDp="integer"
		android:largestWidthLimitDp="integer" <!--如果您正在为Android 3.2及更高版本开发应用程序,则应使用以上三个属性来声明屏幕大小支持,而不是基于通用屏幕大小的属性。-->  
		android:resizeable=["true"| "false"] <!--是否可针对不同的屏幕大小调整大小。-->
		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系统不会读取<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 <!--应用程序根节点,只能有一个,对于一个可运行的应用程序,必须有一个这样的节点。对应Application类,节点内包含四大组件的配置-->
    	android:name="string" <!--类名,组件标签节点都有该属性,可以省略外层包名-->
		android:icon="drawable reource" <!--整个应用程序的图标,以及每个应用程序组件的默认图标,仅用于展示的-->
		android:logo="drawable resource" <!--整个应用程序的徽标,以及活动的默认徽标。标志性的,和icon不同-->
		android:label="string resource" <!--整个应用程序的标签,以及每个应用程序组件的默认标签-->
		android:allowTaskReparenting=["true"|"false"]<!--是否允许组件在不同的TaskStack中动态转移,转移到调用它的那个TaskStack中。-->
		android:backupAgent="string" <!--指定一个用于备份的 BackupAgentHelper 类-->
		android:debuggable=["true"|"false"] <!--是否可以调试应用程序-->
		android:description="string resource" <!--关于应用程序的用户可读文本,比应用程序标签更长,更具描述性-->
		android:enabled=["true"|"false"] <!--Android系统是否可以实例化应用程序的组件-->
		android:hasCode=["true"|"false"] <!--应用程序是否包含程序代码,只有当应用程序只使用内置组件类时才不会有自己的任何代码,这种情况很少发生-->
		android:hardwareAccelerated=["true"|"false"] <!--是否应为此应用程序中的所有活动和视图启用硬件加速渲染-->
		android:killAfterRestore=["true"|"false"] <!--是否应在完整系统还原操作期间恢复其设置后终止相关应用程序,第三方应用程序通常不需要使用此属性-->
		android:largeHeap=["true"|"false"] <!--是否应使用大型Dalvik堆创建应用程序的进程。这适用于为应用程序创建的所有进程。它仅适用于加载到进程中的第一个应用程序; 如果您使用共享用户ID以允许多个应用程序使用进程,则它们都必须一致地使用此选项,否则它们将具有不可预测的结果。大多数应用程序不应该需要这个,而应该专注于减少其整体内存使用量以提高性能。启用此功能也不能保证可用内存的固定增加,因为某些设备受其总可用内存的限制。-->
		android:manageSpaceActivity="string" <!--用于指定自定义的存储空间管理Activity页面,如果设置了该项,当用户想清除数据时,应用信息页面就会多一个管理空间的按钮,点击时就会跳转到这个页面-->
		android:permission="string" <!--需要与该应用进行交互的其他应用应该具有此权限-->
		android:persistent=["true"|"false"] <!--是否设置为常驻进程,应用程序通常不应设置此标志,持久性模式仅适用于某些系统应用程序-->
		android:process="string" <!--全局默认进程-->
		android:restoreAnyVersion=["true"|"false"] <!--指示应用程序已准备好尝试还原任何备份数据集,即使备份是由比应用程序当前安装的应用程序更新版本存储的-->
		android:taskAffinity="string"  <!--全局TaskStack名,默认为应用包名-->
		android:uiOptions=["none"|"splitActionBarWhenNarrow"] <!--选择后者,在屏幕底部添加一个条,以便ActionBar在受到水平空间约束时(例如在手机上以纵向模式进行操作时)显示操作项。操作栏分为顶部导航部分和操作项底部栏,而不是屏幕顶部操作栏中显示的少量操作项。这确保了合理的空间不仅可用于操作项,还可用于顶部的导航和标题元素。菜单项不会分成两个栏; 他们总是一起出现。-->
		android:theme="resource or theme">  <!--全局默认主题-->

        <activity <!--Activity组件声明,每个可以调起的Activity必须声明该标签节点。-->
        		android:allowTaskReparenting=["true" | "false"] <!--是否可以自动转移到启动它的TaskStack中去-->
				android:alwaysRetainTaskState=["true" | "false"] <!--是否需要维护在Task中的状态-->
				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"] <!--是否应从最近使用的应用程序列表(“最近的应用程序”)中排除此活动启动的任务。也就是说,当此活动是新任务的根活动时,此属性确定该任务是否不应出现在最近的应用列表中。-->
				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中声明的相应活动的格式相同。当用户按下操作栏中的“向上”按钮时,系统将读取此属性以确定应启动哪个活动。-->
				android:permission="string"
				android:process="string"
				android:screenOrientation=["unspecified" | "user" | "behind" |
				                         "landscape" | "portrait" |
				                         "reverseLandscape" | "reversePortrait" |
				                         "sensorLandscape" | "sensorPortrait" |
				                         "sensor" | "fullSensor" | "nosensor"]
				android:stateNotNeeded=["true" | "false"] <!--是否可以在未保存其状态的情况下终止并成功重新启动活动-->
				android:taskAffinity="string" <!--一个task的`taskAffinity`值取决于它的根Activity。新建Task时,该Activity设置的`taskAffinity`属性才能决定它所在task的`taskAffinity`属性。清单文件中可配置Application或Activity的属性`taskAffinity`,取值规则符合包名规则(至少包含一个点),默认值就是包名。-->
				android:theme="resource or theme"
				android:uiOptions=["none" | "splitActionBarWhenNarrow"]
				android:windowSoftInputMode=["stateUnspecified",
				                           "stateUnchanged", "stateHidden",
				                           "stateAlwaysHidden", "stateVisible",
				                           "stateAlwaysVisible", "adjustUnspecified",
				                           "adjustResize", "adjustPan"] >  
            <intent-filter> <!--一个组件可有任意数量的过滤器,其中每个过滤器描述一种不同的功能。-->
                <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" /> <!--协议--> 
            </intent-filter>
            <meta-data android:name="string" <!--用于指定父标签组件可以获取到的数据,name也就是数据的key--> 
					android:resource="resource specification" <!--如果数据本身是资源类型,value就用该属性指定--> 
					android:value="string" /> <!--如果数据本身是非资源类型,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"] <!--临时权限是一种为应用程序组件一次性访问受权限保护的数据的方法。例如,当电子邮件消息包含附件时,即使查看者没有查看所有内容提供者的数据的一般许可,邮件应用程序也可以呼叫适当的查看者打开它。-->
				android:icon="drawable resource"
				android:initOrder="integer" <!--相对于由同一进程托管的其他内容提供程序,应实例化内容提供程序的顺序。当内容提供者之间存在依赖关系时,为每个提供者设置此属性可确保按照这些依赖关系所需的顺序创建它们。该值是一个简单的整数,首先初始化更高的数字。-->
				android:label="string resource"
				android:multiprocess=["true" | "false"] <!--是否可以在每个客户端进程中创建内容提供程序的实例。通常,内容提供程序在定义它的应用程序的过程中实例化。但是,如果此标志设置为“ true”,则系统可以在每个进程中创建一个实例,其中有一个客户端想要与之交互,从而避免进程间通信的开销。-->
				android:name="string"
				android:permission="string"
				android:process="string" <!--指定所在进程,以冒号开头(实际生成的进程全名是包名加此名)-->
				android:readPermission="string"
				android:syncable=["true" | "false"] <!--内容提供者控制下的数据是否与服务器上的数据同步-->
				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”:如果没有此库,应用程序将无法运行。“false”:可以在没有它的情况下运行。-->

    </application>

</manifest>

附:参考

官方文档
大神整理文档

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值