AndroidManifest配置文件解析之一——介绍
自己学习笔记,英语水平不好,翻译能力有限,不喜勿喷,谢谢
每个Application在根目录下必须有一个AndroidManifest.xml文件。
一、这个文件包含了app的Android 系统信息。
1.它表明了App的唯一标示。Application以AndroidManifest中manifest中的包名区分
2.它描述了Application的组件-----activity、service、broadcast receiver和content provice。这些描述是Android系统知道这些组件,并且指导在什么情况下启动这些组件。
3.它表明了哪个process host 这些组件。
4.它表明了 App为了获取API保护的内容或者是其他程序的内容所需要的permission。
5.它表明了其他App想要获取本App的组件所需要的权限。
6.它罗列了Instrumentation类,这些类提供了一些App运行时候的信息。这些声明存在与App开发或者测试阶段,App发布的时候,应该移除。
7.它表明了App所要求的Android API的最小版本。
8.它罗列了App所必须关联的一些library。
二、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的标签和属性中
Element
只有<manifest>和<application>元素只能出现一次,其他Element可以出现一次或多次,或者不出现。
如果一些Element包含其他的element,所有的值必须通过attribute设置。
所有的同级的element是平等的,不分顺序。例如<activity>,<service>和<provider>能够以任意顺序出现。(<activity-alias>是个特例,它需要在设置别名的<activity>之后)。
Attribute
从正式意义上来说,所有的attribute都是可选的。但是有一些特殊的element的attribute为了达到某一目的,必须设置值。其他的不是必须设值得attribute也都有其默认值。
除了根节点<manifest>的一些attribute外,所有的attribute名 都必须以 android:为前缀。例如:android:alwaysRetainTaskState
Declaring class names
很多element都和Java的类相对应,包括application这个element(<application)。
Application---<application>
Activity---<activity>
Service---<service>
BroadcastReceiver---<receiver>
ContentProvicer---<provider>
当你定义一个Android组件 (Activity,Service,BroadcastReceiver, and ContentProvicer)的子类的时候,以name这个attribute来声明。这个属性值要包含完整的包名。例如,一个Service子类的声明:
<manifest . . . >
<application . . . >
<service android:name="com.example.project.SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
然而,如果要声明的组件是在Application的标记包(暂且叫标记包,即<manifest>的package属性)下,或者是标记包的子包,组件的name可以省略标记包名。例如:
<manifest package="com.example.project" . . . > <application . . . > <service android:name=".SecretService" . . . > . . . </service> . . . </application> </manifest>
Multiple values
如果不止一个value被设定,则element通常也是有多个,而不是在一个element中罗列多个value。例如:一个Intent可以设置多个action值:
<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>
Resource values
一些attribute的值是可以展示给用户的,例如一个activity的label或者icon。这些attribute的值是通过一个resource或者theme来在局部设定的。
resource的值以以下格式标示
@[package:]type:name
如果资源是和Application的标记包同包,则package可以省略,type是资源的类型,例如“string”或者“drawable”等。name是标记资源的唯一名称。例如:
<activity android:icon="@drawable/smallPic" . . . >
一个theme的value标示方法与此相似,但是它是以‘?’开头而不是‘@’
?[package:]type:name
String values
当一个attribute的value是一个字符串时,双反斜杠(‘\\’)必须当做转移字符,例如:
'\\n'标示开始新的一行,'\\uxxxx'标示一个统一字符。
四、文件特征
以下来描述怎样通过Manifest文件来映射Android特征的:
Intent Filters
Application的核心组件(Activity,Service,BroadcastReceivers)是通过Intent来启动的。Intent filter来决定启动那个对应的组件。intent filter在manifest文件中是 <intent-filter> element。一个组件可以对应多个filter,来实现不同的功能。
通过Intent明确指定需要开启的组件的名称的时候,filter是不起作用的。但是当Intent没有一个明确的指定需要开启的组件的名称,可以通过filter指定需开启的组件的filter。
想了解更多请查看 Intents and Intent Filters
Icons and Lables
多数的element都会有一个 icon 和 lable attribute 来指定一个小图标和标签来展示给用户。还有一些element可以有 description attribute 来指定一个在屏幕上显示的较长的扩展文本。例如:<premisiion> element就有这3个属性。
通常,图标的标签都是默认的在子element中。默认的 icon 和 lable 是在 <application> element 中设置的。同样, 也可以为组件设置icon 和 lable这些属性---例如:<activity> element,可以为组件不同的<intent-filter>设置不同的 icon 和 lable。如果组件和组件的<intent-filter>都没设置icon 和 lable,就会用默认的。
Permission
permission是访问device的代码或者数据的一个约束。这个约束用来保护数据免受扭曲,或者避免毁坏用户体验。
每个permission通过一个唯一的lable来区分。通常,这些lable表明被限制的action。例如,以下是Android来定义的几个permission:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
如果一个Application需要使用一些被permission保护的特性,需要在manifest的<user-permission>来表明。Application在被安装到device时,会显示Application所需要的被permission保护的特性给用户,用户可以选择是否同意Application使用这些feature。
application也可以通过permission来保护自己的组件。通过Android(罗列在android.Manifest.premission)来自定义permission。新的permission是用<permission> element 来标示的。例如:
<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 不仅仅在<permission> element中声明,为了使app其他的组件能够使用被保护的activity,也用在<user-permission> element。
如果permission属性设置了另外一种权限(如android:permission.CALL_EMERGENCY_NUMBERS),那么就没有必要再用<permission>元素来声明它了。但是依然有必要使用<uses-permission>元素来进行必要的申请。
<permission-tree>元素为一组在代码中定义的权限声明了一个命名空间,并且<permission-group>元素为这个权限组定义了一个标签,这个标签在向用户展示权限时,只会影响到权限的分组。<permission-group>元素没有指定哪个权限属于该组,它只是给出了一个组名。一个权限通过比较<permission>元素的permissionGroup属性值来确定其分组。
Libraries
每个应用程序都会链接默认的Android类库,包括构建程序的基本程序包(如,Activity、Service、Intent、View、Button、Application、ContentProvider等等)。
但是,有些包会驻留在它们自己的类库中,如果应用要使用这些包中的代码,就必须明确的要求链接这些类库。对于每个要链接的类库,清单文件中必须包含单独的<uses-library>元素。
浙公网安备 33010602011771号