AndroidManifest.xml文件详解

Author Avatar
罗炜光 7月 16, 2016
  • 在其它设备中阅读本文章

AndroidManifest.xml结构

<?xmlversion="1.0"encoding="utf-8"?>

<manifest>

    <application>

        <activity>
            <intent-filter>
               <action/>
               <category/>
               <data/>
            </intent-filter>
            <meta-data/>
        </activity>

        <activity-alias>
           <intent-filter>
               <action/>
               <category/>
               <data/>
            </intent-filter>
           <meta-data/>
        </activity-alias>

        <service>
           <intent-filter>
               <action/>
               <category/>
               <data/>
            </intent-filter>
           <meta-data/>
        </service>

        <receiver>
           <intent-filter>
               <action/>
               <category/>
               <data/>
            </intent-filter>
           <meta-data/>
        </receiver>

        <provider>
           <grant-uri-permission/>
           <path-permission/>
           <meta-data/>
        </provider>

        <meta-data/>
        <uses-library/>
    </application>


    <compatible-screens/>
    <instrumentation/>
    <library/>
    <original-package/>
    <package-verifier/>
    <permission/>
    <permission-tree/>
    <permission-group/>
    <protected-broadcast/>
    <resource-overlay/>
    <supports-screens/>
    <supports-gl-texture/>
    <uses-sdk/>
    <uses-configuration/> 
    <uses-feature/>
    <uses-permission/>
    <uses-permission-sdk-23/>
    <upgrade-key-set/>

</manifest>

manifest

<manifest  
        xmlns:android="http://schemas.android.com/apk/res/android"
        package=""
        android:sharedUserId="string"
        android:sharedUserLabel="string resource"
        android:versionCode="integer"
        android:versionName="string"
        android:installLocation=["auto" | "internalOnly" | "preferExternal"] 
        android:revisionCode="integer">
</manifest>

这个元素是AndroidManifest.xml文件的根元素。它必须包含一个元素,并且必须要指定xmlns:android和package属性

xmlns:android

定义android命名空间,一般为http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。

package

这个属性给应用程序定义了一个完整的Java样式的包名。这个名称应该是唯一的。名称中可以包含大写或小写字母、数字以及下划线(‘_’)。但是包名的每段都只能用字母开始。

应该使用所拥有的互联网域名作为基本的包名,以避免与其他开发者的冲突。例如,由Google发布的应用程序的包名都用com.google开始。在发布应用程序时永远不要使用com.example命名空间。

包名用于唯一的标识应用程序。它还是应用程序进程的默认名称(看元素的process属性)和Activity的默认亲缘任务(请看<activity>元素的taskAffinity属性)。

警告:应用程序一旦发布,就不能够改变它的包名称了。包名定义了应用程序的标识,因此如果改变它,那么它就会被认为是不同的应用程序,并且之前版本的用户就不能够把应用升级到新版本。

sharedUserId

这个属性定义了一个Linux用户ID的名称,这个名称能够跟其他应用程序共享。默认情况下,Android会给它的每个应用程序都分配一个唯一的用户ID。但是,如果有两个或更多的应用程序把这个属性都设置了相同的值,那么它们将共享这个相同的ID—具有相同的数字签名。拥有相同用户ID的应用程序能够访问彼此的数据,并且如果期望,它们也可运行在相同的进程中。

详见:【AndroidManifest.xml详解】Manifest属性之sharedUserId、sharedUserLabel

sharedUserLabel

这个属性给共享的用户ID定义了一个用户可读的标签。这个标签必须用字符串资源来设置,不能使用原生的字符串。

只有在sharedUserId属性被设置,这个属性才有意义。

versionCode

这个属性定义一个内部版本号,它仅用于判断一个版本是否比另一个版本新,数字越大表明版本越新。这个版本号不显示给用户,显示给用户的版本号要用versionName属性设置。

它的属性值必须是一个整数,如100。你可以按照自己的想法来定义它,只要保持后续版本号的数字更大。例如,它可以是一个版本号;也可以把x.y格式中的版本数字转换成一个由x和y分别编码的16位整数,x在低8位,y在高8位;也可以在每次发布版本时简单的增加数字的大小。

versionName

这个属性用于设置一个显示给永的版本号。属性值可以是原生的字符串,也可以引用一个字符串资源。这个字符串除了显示给用户之外,没有其他用途。而versionCode属性却拥有内部使用的版本号。

installLocation

这个属性用于设置应用程序默认的安装位置。

用下表中的关键词来设置属性值。

说明
internalOnly 应用程序必须只被安装在内部设备存储器上。如果设置这个值,应用程序永远不会被安装在外部存储器上。如果内部存储空间不足,那么系统不会安装这个应用程序。如果没有定义android:installLocation属性,就会使用这个值作为默认值。
auto 应用程序可以安装在外部存储器上,但是,默认情况下,系统会把应用程序安装在内部存储器上。如果内部存储空间不足,那么系统会把应用程序安装在外部存储器上。一旦安装,用户能够通过系统设置在内外存储器之间来移动应用程序。
preferExternal 应用程序偏好安装在外部存储器上(SD卡)。系统并不保证恪守这一个规则。如果外部存储器不可用或空间不足,或者应用程序使用了forward-locking机制(这种机制不支持外部存储),那么应用程序就可以安装在内部存储器上。一旦安装,用户能够通过系统设置在内外存储器之间移动应用程序。

警告:如果应用程序使用的Google Play的复制保护功能,那么它就不能被安装在设备的SD卡上。但是,如果使用Google Play的应用程序许可,那么它就能够被安装在内部或外部存储器上,包括SD卡。

注意:默认情况下,应用程序会被安装在内部存储器上,除非把这个属性值定义为auto或preferExternal,应用程序才能够被安装在外部存储器上。
当应用程序被安装在外部存储器上的时候:

  1. .apk文件被保存在外部存储器上,但是任何应用程序数据(如数据库)依然被保存在内部设备存储器上;

  2. 用一个key把存储器中保存的.apk文件加密,只允许应用程序在安装它的设备上运行。用户不能把安装在SD卡上应用程序转移到另一个设备的SD卡上,虽然在一个设备上能够使用多个SD卡。

  3. 在用户要求的时候,应用程序能够被转移到内部存储器上。

用户也可以要求把应用程序从内部存储器移动到外部存储器上。但是,如果这个属性被设置为internalOnly,那么系统不允许用户把应用程序转移到外部存储器上。

这个属性在API Level 8中被引入。

revisionCode

android:revisionCode表示该软件的修改版本号,对用户是可见的,它必须是一个int型的整数,它的大小代表该软件版本升级过多少次,因此每次发布新版本该值都会+1,如Android:versionCode = ”5″ ,代表此软件已经发布过5次了。

Application

<application  
    android:allowClearUserData=["true" | "false"]
    android:allowTaskReparenting=["true" | "false"]
    android:banner="drawable resource"
    android:backupAgent="string"
    android:debuggable=["true" | "false"]
    android:description="string resource"
    android:enabled=["true" | "false"]
    android:hasCode=["true" | "false"]
    android:hardwareAccelerated=["true" | "false"]
    android:icon="drawable resource"
    android:isGame=["true" | "false"]
    android:killAfterRestore=["true" | "false"]
    android:largeHeap=["true" | "false"]
    android:label="string resource"
    android:logo="drawable resource"
    android:manageSpaceActivity="string"
    android:name="string"
    android:permission="string"
    android:persistent=["true" | "false"]
    android:process="string"
    android:restoreAnyVersion=["true" | "false"]
    android:requiredAccountType="string"
    android:restrictedAccountType="string"
    android:supportsRtl=["true" | "false"]
    android:taskAffinity="string"
    android:testOnly=["true" | "false"]
    android:theme="resource or theme"
    android:uiOptions=["none" | "splitActionBarWhenNarrow"]
    android:usesCleartextTraffic=["true" | "false"]
    android:vmSafeMode=["true" | "false"]>
</application>

这个元素用于应用程序的声明。它包含了每个应用程序组件所声明的子元素,并且还有能够影响所有组件的属性。其中的很多属性(如icon、label、permission、process、taskAffinity和allowTaskReparenting)会给组件元素中对应的属性设置默认值。其他的给是应用程序整体设置的值(如debuggable、enabled、description、allowClearUserData),并且这些属性值不能被组件的属性所覆盖。

android:allowTaskReparenting

当一个与当前任务有亲缘关系的任务被带到前台时,用这个属性来指定应用程序中定义的Activity能否从他们当前的任务中转移到这个有亲缘关系的任务中。如果设置为true,则能够转移,如果设置为false,则应用程序中的Activity必须保留在它们所在的任务中。默认值是false。
<activity>元素有它们自己的allowTaskReparenting属性,它能够覆盖<application>元素中的设置。

android:allowBackup

当 allowBackup 标志为 true 时,用户即可通过 adb backup 和 adb restore 来进行对应用数据的备份和恢复,此属性的默认值是true。

android:backupAgent

这个属性用于定义应用程序备份代理的实现类的名称,这个类是BackupAgent类的一个子类。它的属性值应该是完整的Java类的名称(如,com.example.project.MyBackupAgent)。但是,也可以使用用”.”符号开头的简称(如,.MyBackupAgent),系统会把<manifest>元素中指定的包名追加到”.”符号的前面。

android:debuggable

这个属性用于指定应用程序是否能够被调试,即使是以用户模式运行在设备上的时候。如果设置为true,则能够被调试,否则不能调试,默认值是false。

android:description

这个属性用于定义应用程序相关的用户可读文本,它要比应用程序标签更长、更详细。它的的值必须被设置成一个字符串资源的引用。跟label属性不一样,label属性可以使用原生的字符串。这个属性没有默认值。

android:enabled

这个属性用于指定Android系统能否实例化应用程序组件。如果设置为true,这个可以实例化其组件,否则不能够实例化。如果这个属性被设置为true,那么就会使用每个组件自己enabled属性的设置来判断其是否能够被实例化。如果这个属性被设置为false,它会覆盖其所有组件自己指定的值,应用程序中的所有组件都会被禁用。

默认值是true。

android:hasCode

这个属性用于设置应用程序是否包含了代码,如果设置为true,则包含代码,否则不包含任何代码。在这个属性被设置为false的时候,系统在加载组件的时候不会试图加载任何应用程序的代码。默认值是true。

如果应用程序没有使用任何应用内置组件类以外的组件,那么这个应用程序就不会有任何自己的代码,像使用AliasActivity类的Activity,是很少发生的。

android:hardwareAccelerated

这个属性用于设置能够给应用程序中的所有Activity和View对象启用硬件加速渲染。如果设置为true,则应该启用,如果设置为false,则不会启用。默认值是false。

从Android3.0开始,应用程序可以使用硬件加速的OpenGL渲染器,来改善很多共同的2D图形操作的性能。当硬件加速渲染被启动的时候,在Canvas、Paint、Xfermode、ColorFilter、Shader和Camera中的大多数操作都会被加速。这样会使动画、滚动更加平滑,并且会改善整体的响应效果,即使应用程序没有明确的使用框架的OpenGL类库。

要注意的是,不是所有的OpenGL 2D操作都会被加速。如果启用了硬件加速渲染器,就要对应用程序进行测试,以确保使用渲染器时不发生错误。

android:icon

这个属性用于设置应用程序的整个图标,以及每个应用组件的默认图标。对于<activity><activity-alias><service><service><receiver><provider>元素,请看它们各自的icon属性。

设置这个属性时,必须要引用一个包含图片的可绘制资源(例如,“@drawable/icon”)。没有默认的图标。

android:isGame

该应用程序是否是一个游戏,默认为false

android:killAfterRestore

这个属性用于指定在全系统的恢复操作期间,应用的设置被恢复以后,对应的问题程序是否应该被终止。单包恢复操作不会导致应用程序被关掉。全系统的复原操作通常只会发生一次,就是在电话被首次建立的时候。第三方应用程序通常不需要使用这个属性。

默认值是true,这意味着在全系统复原期间,应用程序完成数据处理之后,会被终止。

android:label

这个属性用于设置应用程序整体的用户可读的标签,并也是每个应用程序组件的默认标签。对于<activity><activity-alias><service><receiver>元素,请看它们各自的label属性。

设置这个属性值时,应该引用一个字符串资源。以便它能够跟用户界面中的其他字符串一样能够被本地化。但是为了应用程序开发的便利,也能够用原生的字符串来设置。

这个属性用于给整个应用程序设置一个Logo,而且它也是所有Activity的默认Logo。

设置这个属性时,必须要引用一个包含图片的可绘制资源(如:“@drawable/logo”)。没有默认的Logo。

android:manageSpaceActivity

这个属性定义了一个完整的Activity子类的名字,系统能够把这个名字加载到由用户管理被应用程序所占用的设备上的内存。这个Activity也应该用<activity>元素来声明。

android:name

这整个属性用完整的Java类名,给应用程序定义了一个Application子类的实现。当应用程序进程被启动时,这个类在其他任何应用程序组件被实例化之前实例化。

这个子类实现是可选的,大多数应用程序不需要一个子类的实现。如果没有实现自己的子类,Android系统会使用基本的Application类的一个实例。

android:permission

这个属性定义了一个权限,为了跟应用程序进行交互,客户端必须要有这个权限。这个属性是为给所有的应用程序组件设置权限提供了便利的方法。它能够被独立组件所设置的permission属性所覆盖。

android:persistent

这个属性用户设置应用程序是否应该时刻保持运行状态,如果设置为true,那么就保持,否则不保持。默认值是false。普通的应用程序不应该设置这个属性,持久运行模式仅用于某些系统级的应用程序。

android:process

这个属性用于定义一个进程名称,应用程序的所有组件都应该运行在这个进程中。每个组件都能够用它自己process属性的设置来覆盖这个元素中的设置。

默认情况下,当应用程序的第一个组件需要运行时,Android系统就会给这个应用程序创建一个进程。然后,应用中的所有组件都运行在这个进程中。默认的进程名是跟元素中设置的包名进行匹配的。

通过设置这个属性,能够跟另外一个应用程序共享一个进程名,能够把这两个应用程序中的组件都安排到同一个进程中运行—但是仅限于这两个应用程序共享一个用户ID,并且带有相同的数字证书。

如果这个进程名称用“:”开头,那么在需要的时候,就会给应用程序创建一个新的、私有的进程。如果进程名用小写字符开头,就会用这个名字创建一个全局的进程,这个全局的进程能够被其他应用程序共享,从而减少资源的使用。

android:restoreAnyVersion

设置这个属性表示应用程序准备尝试恢复任何备份的数据集,即使备份比设备上当前安装的应用程序的版本要新。这个属性设置为true,即使是在版本不匹配而产生数据兼容性提示的时候,也会允许备份管理来恢复备份的数据,所以要谨慎使用。

这个属性的默认值是false。

android:taskAffinity

这个属性给应用的所有的Activity设置了一个亲缘关系名,除了那些用它们自己的taskAffinity属性设置不同亲缘关系的组件。

默认情况下,应用程序中的所有Activity都会共享相同的亲缘关系,亲缘关系的名称跟由<manifest>元素设置的包名相同。

android:theme

这个属性给应用程序中所有的Activity设置默认的主题,属性值要引用一个样式资源。每个独立的Activity的主题会被它们自己的theme属性所覆盖。

android:uiOptions

这个属性设置了Activity的UI的额外选项。它必须是下表中的一个值:

说明
none 默认设置,没有额外的UI选项。
splitActionBarWhenNarrow 在水平空间受到限制的时候,会在屏幕的底部添加一个用于显示ActionBar中操作项的栏,例如:在纵向的手持设备上。而不是在屏幕顶部的操作栏中显示少量的操作项。它会把操作栏分成上下两部分,顶部用于导航选择,底部用于操作项目。这样就会确保可用的合理空间不仅只是针对操作项目,而且还会在顶部给导航和标题留有空间。菜单项目不能被分开到两个栏中,它们要显示在一起。

intent-filter

<intent-filter
    android:icon="drawable resource"
    android:label="string resource"
    android:priority="integer">
    . . .
</intent-filter>

这个元素用于指定Activity、Service或Broadcast Receiver能够响应的Intent对象的类型。Intent过滤器声明了它的父组件的能力—Activity或Service所能做的事情和Broadcast Receiver所能够处理的广播类型。它会打开组件来接收它所声明类型的Intent对象,过滤掉那些对组件没有意义的Intent对象请求。

过滤器的大多数内容是通过<action><category><data>子元素来描述的。

android:icon

当组件要把过滤器所具有的能力展示给用户时,会使用这个属性所设置的图标来表示它的父组件(Activity、Service或Broadcast Receiver)。

这个属性必须要引用一个包含图片定义的可绘制资源。默认值是由父组件的icon属性设置的。如果父组件没有指定一个图标,那么默认值就会使用<application>元素所设置的icon。

android:label

这个属性用于给其父组件设置一个用户可读的标签。这个标签不是有其父组件设置的那个,在组件要把过滤器所具有的能力展示给用户的时候,要使用这个属性值。

这个属性值应该引用一个字符串资源,以便它能够像用户界面中的其他字符串一样,能够被本地化。但是,为了开发应用程序的便利,也可以使用原生的字符串。

这个属性的默认值是有它的父组件提供的。如果父组件没有指定一个标签,那么默认值就会使用由元素的所设置的标签。

android:priority

这个属性用于给过滤器设置一个优先级。其父组件能够通过优先级来依次处理过滤器所描述类型的Intent对象。这个属性对Activity和Broadcast Receiver对象有意义:

  1. 它提供了Activity能够如何响应跟过滤器匹配的Intent对象请求的信息(相对与其他的也能响应这个Intent请求的Activity)。当一个Intent对象请求能够被多个带有不同优先级的Activity处理时,Android系统只考虑把高优先级的Intent过滤器作为潜在的Intent对象请求目标。

  2. 它控制了Broadcast Receiver执行接收广播消息的顺序。高优先级的过滤器会优先调用。(这个顺序只应用与同步消息,对于异步消息会忽略优先级的设置。)

只有真正想要给接收广播消息的过滤器施加一个特定顺序,或者要强制Android来应用另外一个Activity,才会使用这个属性。

这个属性值必须是一个整数,如:100,数字越大,优先级越高。

meta-data

<meta-data
    android:name="string"
    android:resource="resource specification"
    android:value="string"/>

这个元素用name-value对的格式给其父组件提供任意可选的数据。一个组件元素能够包含任意多个<meta-data>子元素,所有这些元素中定义的值会被收集到一个Bundle对象中,并且提供给组件的PackageItemInfo.metaData属性字段。

通常值是通过其value属性来指定的。但是,也可以使用resource属性来代替,把一个资源ID跟值进行关联。

例如,下面的代码就是把存储在@string/kangaroo资源中的值跟”zoo”名称进行关联:

android:name="zoo" android:value="@string/kangaroo" />