https://developer.android.com/guide/topics/manifest/manifest-intro.html
https://developer.android.com/samples/BasicContactables/AndroidManifest.html
AndroidManifest简介
每个应用必须有一个AndroidManifest.xml文件(精确的按此名字)在它的根目录.manifest文件向Android系统提供关于app的基本信息,这些是系统必须在运行任何app的代码前需要知道的.
此外,清单文件还可执行以下操作:
1.它命名应用的Java包.包名作为应用的唯一标识.
2.它描述应用的组件,包括组层应用的Activities,Services,BroadcastReceivers,和ContentProviders.它也命名类实现各个组件和公布它们的能力,如它们可以处理的Intent消息.这些声明通知提供,它们可被启动的组件和条件.
3.它决定进程持有的应用组件
4.它声明应用必须拥有来去访问受保护的API部分和与其他应用交互的权限.它也声明权限,其他被要求去拥有为了与应用组件交互.
5.它列出Instrumentation类,提供分析和其他信息随着应用运行.这些声明存在于manifest中,仅当应用在开发时,并将被移除在应用发布前.
6.它声明应用要求的最小Android API等级.
7.它列出应用必须被链接依赖的库
Manifest文件结构
下面的代码片段显示manifest文件通常的结构,和它可以包含的每个元素.每个元素及其所有属性,全部记录在单独的文件中.
提示:要查看此文本中提到的任何元素的详细信息,就点击元素名.
<?xml version="1.0" encoding="utf-8"?>
<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文件中的元素,按字母顺序:
<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-library>
<uses-permission>
<uses-sdk>
注意:这些是仅有的合法元素—-不可以自己添加元素和属性.
文件介绍
此段描述约定和规则,通常应用到manifest文件所有元素和属性上的.
元素:
仅<manifest>
和 <application>
元素是必须的.它们必须存在且仅出现一次.大多出其他元素可以出现多次或完全不出现.然而,至少它们中的一些存在,在manifest文件变为有用之前.
如果一个元素包含所有任何的,它包含其他元素.所有值设置通过属性,不是元素的数据字符.
相同等级的元素通常是无序的.例如:<activity>,<provider>,和<service>
元素可以按任何顺序混合.有两个关键的例外规则:
<activity-alias>
元素必须紧随在它将要别名的<activity>
之后
<application>
元素必须是在<manifest>
元素中的最后一个元素.也就是说,</application>
关闭标签必须立即出现在</manifest>
关闭标签前.
属性:
按正常的意义上,所有属性都是可选的.然而,有一些属性必须被指定,让元素完成它的目标.使用文档作为导引.对于真正的可选属性,它有一个默认值或状态,当不存在于规定中时.
除了根元素的一些属性,所有属性名以android:前缀开始.例如,android:alwaysRetainTaskState.因为前缀是唯一的,文档通常忽略它,当按名称提及到属性时.
声明类名:
很多元素对应Java对象,包括应用它本身的元素(<application>
元素),并且它的主要的组件:activities(<activity>
),services(<service>
),broadcast receivers(<receivers>
),和content proivders(<provider>
).
如果你定义一个子类,如你几乎总是用的组件类(Activity,Service,BroadcastReceiver,和ContentProvider),子类被声明通过一个name属性.名字必须包含全包名称.例如:一个Service子类可能被声明如下:
<manifest ...>
<application>
<service android:name="com.example.project.SecretService"...>
</service>
</application>
</manifest>
然而,如果字符串的第一个字符是一个句号,应用的包名(如由<manifest>
元素指定的包属性)被添加到字符串.如下分配等同于上面的显示.
<manifest package="com.example.project"...>
<application ...>
<service android:name=".SecretService"...>
</service>
</application>
</manifest>
当开始一个组件,Android系统创建一个命名的子类实例.如果一个子类没有指定,它创建一个基类实例.
多值:
如果多于一个值被指定,元素大多总是重复的,而不是多值被列在一个单一的元素中.例如,一个inent filter
可以列出多个actions:
<intent-filter ...>
<action android:name="android.intent.action.EDIT"/>
<action android:name="android.intent.action.INSERT"/>
<action android:name="android.intent.action.DELETE"/>
....
</intent-filter>
资源值
一些属性有值可以显示给用户,如一个activity的一个标签和一个图标.这些属性的值应该被本地化和从一个资源或主题设置.资源值按如下格式表示:
@[package:]type/name
可以忽略package名,如果资源随着应用在相同包. type是资源的类型,如string或drawable,并且name是表示指定资源的名字.此是例子:
<activity android:icon="@drawable/smallPic" ...>
来自于主题的值按相似的表示,但用?替代@初始化:
?[package:]type/name
字符串值:
当一个属性值是一个字符串,必须用双反斜杠(\\
)去转换字符,如\\n
用于一个新行或\\uxxxx
用于一个Unicode字符.
文件特性
接下来的段描述一些反映在manifest文件中的Android特性的方式.
Intent filters
一个应用的核心组件,如它的activities,services,和broadcast receivers由intents激活.一个intent是
一个信息组合(一个Intent对象),描述一个需要的action,包括要执行的数据,应该执行行为的组件的类型,和其他相关的指令.Android系统放置一个可以响应intent的合适组件,启动组件的新实例,如果需要,并且传递它Intent对象.
组件通知intents类型,它们能响应通过intent filters.由于Android系统必须知道一个组件可以处理的intent,在它启动组件前,intent filters被指定在元素中.一个组件可以有任意数量的filters,每一个描述一个不同的能力.
一个intent明确命名要激活的一个目标组件,因此filter不能扮演角色.一个intent没有指定激活组件的一个目标名,仅当它可传递一个组件的过滤器.
对于信息,关于如何Intent对象被测试依赖于intent过滤器,参阅Intents和Intent Filters文档
[https://developer.android.com/guide/components/intents-filters.html]
图标和标签
许多元素有icon和label属性,用于小图标和文本标签显示给用户.一些有描述属性用于长的,解释性的文本,可以显示在屏幕上.例如,<permission>
元素有所有这三种属性,因此当用户被要求是否获取应用要求的权限时,一个图标表示权限,权限名,和它的必要性描述全都呈现给用户.
在任何情况下,图标和标签被设置在包含元素中,变为默认icon和label设置,用于所有包含的子元素.因此,图标和标签被设置在<application>
元素中的,是默认的图标和标签用于应用组件的每个元素.类似,图标和标签被设置用于一个组件,如<activity>
元素,是默认设置用于每个组件<intent-filter>
元素.如果<application>
元素设置一个标签,但一个activity和它的intent filter没有,应用标签同时被作为activity和intent-filter的标签.
图标和标签被设置用于intent-filter表示一个组件,无论组件是否被呈现给用于,并填充功能有filter通知.例如:一个有android.intent.action.MAIN和android.intent.category.LAUNCHER设置的过滤器通知一个activity作为启动应用的.即,应该被显示在应用启动器中.被设置在过滤器中图标和标签被显示在启动器中.
权限
permission是一个限制访问设备部分代码或数据的约束条件.限制被强加到保护的关键数据和代码,可能被滥用去曲解或毁坏用户体验.
每个权限由一个唯一的标签标识.通常标签指示限制的行为.这有一些权限由Android定义:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
一个特性仅由一个权限保护.
如果一个应用需要访问一个由权限保护的特性,它必须声明它要求的权限用<uses-permission>
元素在manifest中.当应用被安装到设备,安装者决定是否获取请求的权限,通过检查作者签名的证书和,在一些情况下,询问用户.如果权限被获取,应用可以使用保护的权限.如果没有,它尝试去访问这些特性是被没有任何提示给用户.
应用可以用权限保护它自己的组件.它可以利用Android定义的任何权限,如在android.Manifest.permission
[https://developer.android.com/reference/android/Manifest.permission.html] 中列出的,或由其他应用声明的.
它也可以定义它自己的.一个新权限被定义用<permission>
元素.例如:一个activity可以按如下保护:
<manifest ...>
<permission android:name="com.example.project.DEBIT_ACCT"... />
<uses-permission android:name="com.example.project.DEBIT_ACCT" />
...
<application ...>
<activity android:name="com.example.project.FreneticActivity"
android:permission="com.example.project.DEBIT_ACCT"
...>
</activity>
</application>
</manifest>
注意,在此例子中,DEBIT_ACCT权限不仅由<permission>
元素声明,它的使用也要求有<uses-permission>
元素.必须要求它使用为了其他应用组件去启动保护的activity,即使保护是应用自己强加的.
如果,在上面显示的相同例子中,permission属性被设置到权限,在其他地方声明,如android.permission.CALL_EMERGENCY_NUMBERS,它不必去再一次声明<permission>
元素.然而,它仍必须要求使用<uses-permission>
.
<permission-tree>
元素声明一组权限的名字空间,由代码定义的,并且<permission-group>
定义一个标签用于权限集合,这些声明都在manifest中用<permission>
元素,并且这些声明在其他地方.这影响仅对权限如何被分组,当呈现给用户时.<permission-group>
元素不能指定属于组的权限,但它给组一个名字.可以放置一个权限在组中,通过分配组名到<permission>
元素permissionGroup属性.
库
每个应用链接依赖Android默认库,这包括用于编译应用的基本包(公共类如Activity,Service,Intent,View,Button,Application,和ContentProvider).
然而,一些包驻留在它们自己的库中.如果应用使用代码从任何这些包,它必须明确要求链接依赖它们.manifest必须包含一个分离的<uses-library>
元素去命名每个库.可以找到库名在包文档中.
[packages/apps/Gallery2/AndroidManifest.xml]