`
Jacular
  • 浏览: 183109 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

AndroidManifest.xml文件的理解

 
阅读更多
一,重要性

AndroidManifest.xml是Android应用程序中最重要的文件之一。它是Android程序的全局配置文件,是每个 android程序中必须的文件。它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息。
因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所必须拥有的信息。一个典型的Android应用程序的结构如下图所示:



二,主要功能

它指定了该应用程序的Java包:该包名作为应用程序的一个独特标识。

它描述了应用程序组件:该应用程序由哪些activity,service,broadcast receiver和content provider组成。它指定了实现每个组件的类以及公开发布它们的能力(例如,它们能持有哪个Intent信息)。这些声明使Android系统知道这 儿有什么组件以及在什么条件下它们可以被载入。

它决定那些进程将容纳应用程序组件。

它声明了本应用程序必须拥有哪些许可,以便访问API的被保护部分,以及与其他应用程序交互。

它也声明了其他应用程序在和该应用程序交互时需要持有的许可。

它列出了Instrumentation类,可以在应用程序运行时提供简档和其他信息。这些声明仅当应用程序在开发和测试过程中被提供;它们将在应用程序正式发布之前被移除。

它声明了该应用程序所需的Android API的最小化水平。

它列出了该应用程序必须链接的库。

三,主要结构及规则

下面列表显示了manifest文件的通常的结构以及它可以含有的元素。每个元素,连同它的所有属性,会在各个单独的文档里进行充分的描绘。

<?xml version="1.0" encoding="utf-8"?>
<manifest>  //根节点,描述了package中所有的内容
     <uses-permission /> //请求你的package正常运作所需赋予的安全许可。一个manifest能包含零个或更多此元素
     <permission />  //声明了安全许可来限制哪些程序能使用你的package中的组件和功能。一个manifest能包含零个或更多此元素
     <permission-tree /> 
     <permission-group />
     <instrumentation />  //声明了用来测试此package或其他package指令组件的代码。一个manifest能包含零个或更多此元素
     <uses-sdk />  //指定当前应用程序兼容的最低sdk版本号
     <application>  //包含package中application级别组件声明的根节点。此元素也可包含application中全局和默认的属性,如标签,icon,主 题,必要的权限,等等。一个manifest能包含零个或一个此元素(不允许多余一个)
         <activity>  //用来与用户交互的主要工具。当用户打开一个应用程序的初始页面时一个activity,大部分被使用到的其他页面也由不同的activity所实现并声明在另外的activity标记中。
             <intent-filter>  //声明了指定的一组组件支持的Intent值
                 <action />
                 <category />
                 <data />
                     <type/>
                     <schema/>
                     <authority/>
                     <path/>
             </intent-filter>
             <meta-data />
         </activity>
         <activity-alias>
             <intent-filter> . . . </intent-filter>
             <meta-data />
         </activity-alias>
         <service>  //Service是能在后台运行任意时间的组件
             <intent-filter> . . . </intent-filter>
             <meta-data/>
         </service>
         <receiver>   //IntentReceiver能使你的application获得数据的改变或者发生的操作,即使它当前不在运行
             <intent-filter> . . . </intent-filter>
             <meta-data />
         </receiver>
         <provider>  //ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件
             <grant-uri-permission />
             <meta-data />
         </provider>
         <uses-library />
         <uses-configuration />  
     </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>
<uses-configuration>
<uses-library>
<uses-permission>
<uses-sdk>

说明:AndroidManifest.xml文件的结构、元素,以及元素的属性,可以在Android SDK文档中查看详细说明。而在看这些众多的元素以及元素的属性前,需要先了解一下这些元素在命名、结构等方面的规则:
     元素:在所有的元素中只有<manifest>和<application>是必需的,且只能出现一次。如果一个元素包含有其他子元素,必须通过子元素的属性来设置其值。处于同一层次的元素,这些元素的说明是没有顺序的。
     属性:按照常理,所有的属性都是可选的,但是有些属性是必须设置的。那些真正可选的属性,即使不存在,其也有默认的数值项说明。除了根元素<manifest>的属性,所有其他元素属性的名字都是以android:前缀的;
     定义类名:所有的元素名都对应其在SDK中的类名,如果你自己定义类名,必须包含类的数据包名,如果类与application处于同一数据包中,可以直接简写为“.”;
     多数值项:如果某个元素有超过一个数值,这个元素必须通过重复的方式来说明其某个属性具有多个数值项,且不能将多个数值项一次性说明在一个属性中;
     资源项说明:当需要引用某个资源时,其采用如下格式:@[package:]type:name。例如 <activity android:icon=”@drawable/icon ” . . . >
     字符串值:类似于其他语言,如果字符中包含有字符“\”,则必须使用转义字符“\\”;

四,详细说明

值得一提一些常用之处:
1,几乎所有的AndroidManifest.xml(以及许多其他Android的xml的文件)在第一个元 素中包含了命名空间的声明xmlns:android="http://schemas.android.com/apk/res/android"。这 样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。
2,大部分manifests包含了单个<application>的元素,它定义了所有的application级别组件和属性,并能在package中使用。
3, 任何被用户看作顶层应用程序,并能被程序启动器所用的package,需要包含至少一个Activity组件来支持MAIN操作和LAUNCHER种类。 动作android.intent.action.MAIN指示这是应用程序的入口点。类别 android.intent.category.LAUNCHER将此Activity放在启动器窗口中。

在最外层的<manifest>中包含了包名如 package="cn.androidlover.demo" 、软件的版本号 android:versionCode="1" 以及 android:versionName="1.0"的属性,而里面一层的<application>分支中将可能包含Android程序的 四种对象 Activity、Service、Content Provider以及Receiver。我们每添加上面四个类型中的任一种新对象都需要在androidmanifest.xml文件中添加相应节点,否 则运行时将会产生异常。每一个activity必须要一个<activity>标记对应,无论它给外部使用或是只用于自己的package 中。如果一个activity没有对应的标记,你将不能运行它。

此文件一个重要的地方就是它所包含的intent-filters。这些filters描述了activity启动的位置和时间。每当一个 activity(或者操作系统)要执行一个操作,例如:打开网页或联系簿时,它创建出一个intent的对象。它能承载一些信息描述了你想做什么,你想 处理什么数据,数据的类型,和一些其他信息。Android比较了intent对象中和每个application所暴露的intent-filter中 的信息,来找到最合适的activity来处理调用者所指定的数据和操作。关于intent的更多信息请访问Intent参考页面。

application属性介绍:

有关AndroidManifest.xml文件的application分支我们有必要了解一些常见的属性,这里可以看到一些我们实用的选项,比 如允许调试android:debuggable、任务关系android:taskAffinity,比如我们常见的方式创建一个新的任务实用标记 FLAG_ACTIVITY_NEW_TASK,为程序制定一个主题,可以使用android:theme指向一个主题文件。平时我们创建的程序使用一些 安全敏感项,会需要请求系统许可权限,这里可以使用android:permission来制定相关的许可,每个程序的service、 activity、content provider、receiver都需要在application的节点内实现。有关完整的属性可以查看:

1 <application android:allowClearUserData=["true" | "false"]
2              android:allowTaskReparenting=["true" | "false"]
3              android:debuggable=["true" | "false"]
4              android:description="string resource"
5              android:enabled=["true" | "false"]
6              android:hasCode=["true" | "false"]
7              android:icon="drawable resource"
8              android:label="string resource"
9              android:manageSpaceActivity="string"
10              android:name="string"
11              android:permission="string"
12              android:persistent=["true" | "false"]
13              android:process="string"
14              android:taskAffinity="string"
15              android:theme="resource or theme" >
16     . . .
17 </application>

另外:Activity的属性常用的可能为android:name和android:label两个,但我们需要了解所有的属性以帮助解决复杂的问题,完整的如下:
• android:allowTaskReparenting=["true" | "false"]
• android:alwaysRetainTaskState=["true" | "false"]
• android:clearTaskOnLaunch=["true"" | "false"]
• android:configChanges=[one or more of: "mcc" "mnc" "locale" "touchscreen" "keyboard" "keyboardHidden" "navigation" "orientation" "fontScale"]
• android:enabled=["true" | "false"]
• android:excludeFromRecents=["true" | "false"]
• android:exported=["true" | "false"]
• android:finishOnTaskLaunch=["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"]
• android:permission="string"
• android:process="string"
• android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "sensor" | "nonsensor"]
• android:stateNotNeeded=["true" | "false"]
• android:taskAffinity="string"
• android:theme="resource or theme"
• android:windowSoftInputMode=[one or more of: "stateUnspecified" "stateUnchanged" "stateHidden" "stateAlwaysHidden" "stateVisible" "stateAlwaysVisible" "adjustUnspecified" "adjustResize" "adjustPan"]


从Provider节点中用到的定义,可以看到包含了权限控制、排序方式完整的如下:

1 <provider android:authorities="list"
2           android:enabled=["true" | "false"]
3           android:exported=["true" | "false"]
4           android:grantUriPermissions=["true" | "false"]
5           android:icon="drawable resource"
6           android:initOrder="integer"
7           android:label="string resource"
8           android:multiprocess=["true" | "false"]
9           android:name="string"
10           android:permission="string"
11           android:process="string"
12           android:readPermission="string"
13           android:syncable=["true" | "false"]
14           android:writePermission="string" >
15 </provider>

而对于服务相关定义如下:

1 <service android:enabled=["true" | "false"]
2          android:exported[="true" | "false"]
3          android:icon="drawable resource"
4          android:label="string resource"
5          android:name="string"
6          android:permission="string"
7          android:process="string" >
8 </service>

最后是Broadcast使用的Receiver定义,一般配合和隐式处理。

1 <receiver android:enabled=["true" | "false"]
2           android:exported=["true" | "false"]
3           android:icon="drawable resource"
4           android:label="string resource"
5           android:name="string"
6           android:permission="string"
7           android:process="string" >
8 </receiver>

总之,AndroidManifest.xml文件虽然看起来复杂,但是,只要我们理清中里面各元素的作用,那么一切就变得简单了。
分享到:
评论

相关推荐

    AndroidManifest.xml反编译工具

    5. 打开生成的XML文件,你就可以看到易于阅读和理解的`AndroidManifest.xml`内容了。 另外,压缩包中的"AXMLPrinter2使用说明.txt"可能包含了更详细的使用指南,而"西西软件园.txt"和"西西软件园_游戏网下载_最安全...

    二进制AndroidManifest.xml修改神器~

    在Android应用开发中,`AndroidManifest.xml`是一个至关重要的文件,它定义了应用程序的基本属性、权限、组件(如Activity、Service、BroadcastReceiver和ContentProvider)以及它们之间的关系。本资源,"二进制...

    AndroidManifest.xml信息查看工具

    `AXMLPrinter2.jar`是一个XML解析工具,能够将Android的二进制XML(AXML)文件转换成可读的文本格式,这对于查看和理解`AndroidManifest.xml`的原始二进制形式非常有用。开发者可以使用它来查看那些在标准文本编辑器...

    AndroidManifest.xml编译器

    在Android应用开发中,`AndroidManifest.xml`是一个至关...开发者应确保所有必需的组件和服务都在XML文件中声明,并正确配置权限,以避免运行时错误。同时,了解编译原理有助于更好地控制应用的资源管理和版本升级。

    androidmanifest.xml文件详解

    ### AndroidManifest.xml 文件详解 #### 一、概述 `AndroidManifest.xml` 是每个 Android 应用项目中的核心...理解并掌握 `AndroidManifest.xml` 的各个组成部分及其作用,对于开发高质量的 Android 应用至关重要。

    AndroidManifest.xml文件详解

    ### AndroidManifest.xml 文件详解 #### 一、关于 AndroidManifest.xml `AndroidManifest.xml` 是 Android 应用程序中不可或缺的一...正确理解和使用 `AndroidManifest.xml` 对于构建高质量的 Android 应用至关重要。

    反编译 AndroidManifest.xml

    在Android应用开发中,`AndroidManifest.xml`是一个至关重要的文件,它包含了应用程序的基本配置和元数据,如应用名称、所需权限、使用的Activity、Service、BroadcastReceiver等信息。本篇文章将详细探讨如何对`...

    AndroidManifest.xml文件剖析.pdf

    理解AndroidManifest.xml文件是 Android开发者必须掌握的基础知识。 AndroidManifest.xml文件的结构 --------------------------- AndroidManifest.xml文件的结构主要分为两层:最外层和application分支。最外层...

    AXMLPrinter2 AndroidManifest.xml to AndroidManifest.txt

    通常,用户需要将`AndroidManifest.xml`文件和`AXMLPrinter2.jar`放在同一目录下,然后通过命令行运行Java虚拟机,调用jar文件对XML文件进行转换。 例如,命令可能如下: ``` java -jar AXMLPrinter2.jar ...

    AndroidManifest.xml文件剖析.doc

    《AndroidManifest.xml文件详解》 AndroidManifest.xml是每个Android应用的核心配置文件,它定义了应用程序的基本属性、组件及其权限等信息。对这个文件有深入的理解是优化应用性能和提升维护性的关键。 首先,...

    AndroidManifest.xml文件详解.ppt

    AndroidManifest.xml可以理解为android的一个注册表文件,在这个文件中,我们可以声明我们自己定义的权限,这个工程被赋予的权限已经所有应用组件的相关配置工作。Manifest, 描述:根节点,用来描述.apk文件,...

    AndroidManifest.xml文件剖析

    《AndroidManifest.xml文件详解》 AndroidManifest.xml是每个Android应用的核心配置文件,它定义了应用程序的基本属性、组件以及它们如何相互交互。理解并熟练运用这个文件对于任何Android开发者来说都是至关重要的...

    反编译AndroidManifest等xml文件

    了解如何反编译XML文件,有助于开发者更好地理解和调试Android应用,但同时也提醒我们在开发过程中应加强代码保护,避免敏感信息泄露。在实际工作中,我们可以利用混淆工具(如ProGuard)来保护APK,降低被反编译的...

    AndroidManifest.xml解析

    在Android应用开发中,AndroidManifest.xml文件扮演着至关重要的角色。它是每个Android程序的核心配置文件,位于应用程序的根目录下,用于定义应用程序的全局特性,包括应用程序组件、权限控制、测试设置等关键信息...

    AndroidManifest.xml文件综合详解[整理].pdf

    《AndroidManifest.xml文件综合详解》 AndroidManifest.xml文件是Android应用程序的核心组成部分,它包含了应用程序的全局配置信息,是每个Android应用不可或缺的文件。这个文件的作用在于向Android系统提供应用...

    AndroidManifest.xml 最新解析包

    1. **检查XML文件**:确保`AndroidManifest.xml`文件的格式是正确的,没有语法错误或者非法字符。可以使用XML验证工具来验证其结构。 2. **更新工具**:`AXMLPrinter-latest.jar`的"latest"可能已经过时,尝试找到...

Global site tag (gtag.js) - Google Analytics