清单文件详解

一、文件结构

  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>

附:参考

官方文档
大神整理文档

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容