在Android平台的应用程序开发过程中,Manifest文件举足轻重。每一个应用程序都要有一个Manifest文件,他配置了应用程序在Android系统上的基本信息。

下面对AOSP中的一个manifest文件做个简单解析,以期了解manifest文件的大概结构。

例子取自AOSP4.4 源码中的 frameworks/base/packages/SystemUI/AndroidManifest.xml (有删减)

<manifestxmlns:android="http://schemas.android.com/apk/res/android"

xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"

package="com.android.systemui"

android:sharedUserId="android.uid.systemui"

coreApp="true">

<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE" />

<!--ActivityManager -->

<uses-permissionandroid:name="android.permission.GET_TASKS" />

<uses-permissionandroid:name="android.permission.GET_DETAILED_TASKS" />

<uses-permissionandroid:name="android.permission.REORDER_TASKS" />

<uses-permissionandroid:name="android.permission.REMOVE_TASKS" />

<uses-permissionandroid:name="android.permission.STOP_APP_SWITCHES" />

<uses-permissionandroid:name="android.permission.SET_SCREEN_COMPATIBILITY" />

<uses-permissionandroid:name="android.permission.START_ANY_ACTIVITY" />

<uses-permissionandroid:name="android.permission.INTERACT_ACROSS_USERS_FULL" />

<uses-permissionandroid:name="android.permission.GET_TOP_ACTIVITY_INFO" />

<application

android:persistent="true"

android:allowClearUserData="false"

android:allowBackup="false"

android:hardwareAccelerated="false"

android:label="@string/app_label"

android:icon="@*android:drawable/platlogo"

android:process="com.android.systemui"

android:supportsRtl="true">

<!--Broadcast receiver that gets the broadcast at boot time and starts

up everythingelse.

-->

<serviceandroid:name="SystemUIService"

android:exported="true"

/>

<serviceandroid:name=".ImageWallpaper"

android:permission="android.permission.BIND_WALLPAPER"

android:exported="true"/>

<receiverandroid:name=".BootReceiver"androidprv:primaryUserOnly="true">

<intent-filter>

<actionandroid:name="android.intent.action.BOOT_COMPLETED" />

</intent-filter>

</receiver>

<activityandroid:name=".recent.RecentsActivity"

android:label="@string/accessibility_desc_recent_apps"

android:theme="@style/RecentsStyle"

android:excludeFromRecents="true"

android:launchMode="singleInstance"

android:screenOrientation="portrait"

android:exported="true">

<intent-filter>

<actionandroid:name="com.android.systemui.TOGGLE_RECENTS" />

</intent-filter>

</activity>

</application>

</manifest>

1,先看manifest标签和其自身的属性

<manifest> </manifest>

Manifest文件是标准xml文件,<manifest>是其根标签,所有文件内容都要包含在这个标签中。

xmlns:android

这个表示xml中要用到的名空间,这个名空间定义了所有android相关的关键字,例如android:name,android:process。

名空间定义了xml中的合法标签,是XML语言的范畴,此处就不细说了。

xmlns:androidprv

与xmlns:android一样,说明androidprv相关的名字会被用到。这里之所以引用这个,是因为这个android应用程序的配置中用到了以androidprv:primaryUserOnly命名的属性。

package="com.android.systemui"

由于android的应用程序是Java书写,manifest通过这个属性直接指明此应用程序对应的Java package包。

android:sharedUserId="android.uid.systemui"

Android为每个应用程序分配一个用户ID,通过这个标识应用程序。如果两个应用拥有相同的UserID,它们就能够互相访问对方的数据,如果需要,还可以运行在同样的进程中。SytemUI声明自己的ID就是“android.uid.systemui”。也就是说,如果要编写一个应用程序,需要访问systemui这个应用程序的数据,那么在他的manifest标签中,配置同样的属性就可以了。当然,还有另外的方法,就是使用uses-permission标签,会在下面介绍。

coreApp="true"

标识systemui是coreApp中的一个,coreApp是android在bootmode下系统启动的最小子集。在这个模式下,有一组最少的,必须的app需要启动,systemui就是其中之一。

2, 下面分别看<manifest>标签中包含的两个tag,一个是<uses-permission>,另外一个是<application>

<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED" />

上面描述android:sharedUserId提到,每个android应用程序都有一个唯一的ID来标识自己。这个ID也是一个安全壁垒,可以让每个应用的数据只能被自己所访问。

除了android:sharedUserId之外,还有一个机制就是permission。如果应用程序想对自己的数据加以保护,则可以用android:permission这个配置项来声明,而使用者,则需要用uses-permission来声明。

在这里,SystemUI应用程序说明它要用使用android.permission.RECEIVE_BOOT_COMPLETED,也就是SystemUI会在系统启动完成的时候收到通知,如果没有这个声明,就收不到通知。

同样<uses-permissionandroid:name="android.permission.BLUETOOTH" />,表明SystemUI可以访问蓝牙。

<application

       android:persistent="true"

       android:allowClearUserData="false"

       android:allowBackup="false"

       android:hardwareAccelerated="false"

       android:label="@string/app_label"

       android:icon="@*android:drawable/platlogo"

       android:process="com.android.systemui"

       android:supportsRtl="true">

<application>

application模块定义一个应用程序的基本配置。应用程序是Android上的基本运行单位,每个程序都拥有一个独立的Linux ID。

android:persistent="true"

这个属性指定systemUI会在启动后一直运行下去。如果这个标记为false,则这个应用程序会被系统在资源匮乏的时候回收。大部分应用程序都是不会被设置为true的,而systemUI是一个系统程序,所以被设置为true。

android:allowClearUserData和android:allowBackup

标记应用程序的data是否允许被用户清除,这个会在BackupManagerService.java中用到。

android:allowBackup标记是否允许一个应用使用backup机制。

Androidbackup机制允许用户通过backup manager将应用程序的相关数据存储到云端,当手机被重置或者程序重新安装之后,原来backup的数据可以从云端取回,不会丢失。

android:hardwareAccelerated="false"

不使用硬件加速

Android的每个版本都会增加一些功能,而为了使得新功能不引入意想不到的麻烦,就需要将这个功能能够开关,就要加入相应的标记。android:hardwareAccelerated就是之一,Android3.0引入了这个功能。

android:supportsRtl

这是Android4.1引入的一个功能,能够让排版支持从右到左。

3,在<application>内部,是Android应用程序的主要部分,可以包含四大组件,每个组件都包含很多配置属性,这里不再详述,仅仅列举其中的一个来看

<Activity>

<activityandroid:name=".recent.RecentsActivity"

               android:label="@string/accessibility_desc_recent_apps"

               android:theme="@style/RecentsStyle"

               android:excludeFromRecents="true"

               android:launchMode="singleInstance"

                android:exported="true"></activity>

android:name

是AndroidManifest与Java程序的一个桥梁,通过它,指定Java程序的执行类。

android:theme

theme就是能够应用于所有Activity或者application的显示风格。这是Android显示机制中的一个概念。

android:excludeFromRecents

如果这个Activity是一个新进程的根Activity,设置此标记为'true'则表示通过这个Activity启动的任务是否会排除在”recent apps” 之外。所谓recent apps,就是长按Home键,会通过一个list显示最近访问的app。

同样,如果你不想让你的进程显示在其中,则可以置这个属性为true.

android:launchMode="singleInstance"

说明这个Activity是独占一个任务的,而且这个任务不能有其他的Activity存在。也可以看到,SystemUI中所有的Activity都是独占模式打开的。

android:exported="true"

这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。现在设置为true,说明它能够被其他应用程序调用。

4,小结

通过这个manifest文件,可以初步了解systemUI是android平台的一个核心应用程序,它一旦启动,就会长久运行下去。它的所有component都拥有独占的任务。这个应用程序的所有数据不会被备份到云端。另外UI缺省也不使用硬件加速。支持从右到左排版。

在systemui的进程中,会运行多个components。其中有一个recentActivity,也是运行在他的进程中,这个Activity不会出现在rencent list中。

Android Manifest文件的详细描述:http://developer.android.com/guide/topics/manifest/manifest-intro.html




浅析一个Manifest文件相关推荐

  1. 在Vista操作系统中通过manifest文件使VC应用程序获得管理员权限

    原文 VC编译出来的应用程序在vista下运行,有可能因为权限问题,不能成功运行. 用以下办法,给应用程序添加一个manifest文件,程序运行时系统就会跳出UAC对话框,获得管理权限. 1.打开应用 ...

  2. Android应用程序的组成部分和Manifest文件(转)

    Android应用程序由松散耦合的组件组成,并使用应用程序Manifest绑定到一起:应用程序Manifest描述了每一组件和它们之间的交互方式,还用于指定应用程序元数据.其硬件和平台要求.外部库以及 ...

  3. manifestdependency,manifest文件

    利用manifest文件对程序目录下的dll进行分类 1 背景 对于大部分的券商和机构投资者,只能通过有交易所交易系统接入资质的券商提供的柜台系统来进行现货交易.相对于期货市场,现货市场的柜台系统千差 ...

  4. Android之Manifest文件

    在Android APP开发过程中,Manifest文件举足轻重.每一个apk都要有一个Manifest文件,它配置了apk在Android系统上的基本信息. 如下 frameworks/base/p ...

  5. Android manifest文件中的标签详细介绍

    Android manifest文件中的标签详细介绍 概要 每一个Android应用都应该包含一个manifest文件,即AndroidManifest.xml.它包含了程序运行的一些必备信息,比如: ...

  6. repo manifest文件

    一.前言: repo用于管理多个git项目,同一产品可能包含多个git项目,不同的git项目集合,可能形成不同产品,通过repo可以实现方便的管理. 那么repo如何管理多个git项目的呢?管理的gi ...

  7. Rocksdb 数据库--MANIFEST文件

    官方文档-https://github.com/facebook/rocksdb/wiki/MANIFEST 如有错误或翻译不当,请指正.其他rocksdb 文档请关注后续文章. MANIFEST r ...

  8. 什么是 .manifest 文件

    转之:http://hi.baidu.com/y97523/blog/item/ef5a73f0339050a5a40f5281.html 为了大家都能很方便的理解,我将尽量简单通俗地进行描述. [现 ...

  9. manifest 文件作用

    信息: 未找到 WinSxS 中的程序集.                 信息: 尝试在 C:\Windows\assembly\GAC_32\Microsoft.VC80.CRT\8.0.5072 ...

最新文章

  1. 在cell中取得UITableView所在的ViewController对象
  2. 在UWP中自定义半边框样式的输入框
  3. jna 不是有效的 win32 应用程序_教你打开程序提示不是有效的win32程序怎么办
  4. linux git文件图标,分享|三款 Linux 下的 Git 图形客户端
  5. oracle 分段函数,清华大学出版社-图书详情-《新高考数学题型全归纳(基础版)》...
  6. win10子系统 php,启用 Win10 的 Linux 子系统
  7. kitti数据集简介、百度网盘分享 kitti-object、kitti-tracking 全套数据集 自动驾驶
  8. JavaScript Math.random()随机数函数
  9. datatable删除行、列
  10. 数字信号处理--FFT与蝶形算法--学习笔记
  11. 交换机基本原理与配置
  12. sqlserver 时间计算函数
  13. 7.ratings评价列表页的实现
  14. python 3d绘图模块_在Python 3中绘制3D多边形
  15. 大疆机甲大师教育机器人Python开发:中文命名变量初尝试
  16. android自定义秒表,Android实现的秒表计时器示例
  17. Verilog always和assign知识点
  18. 如何查看网页上已经保存的密码
  19. 隐秘而伟大,探访鹏博士大数据双十一背后那些真英雄
  20. AS升级4.1后插件报错的问题

热门文章

  1. Chatgpt报错:The site owner may have set restrictions
  2. 一家小珠宝店老板的豪赌
  3. oracle rman本地备份,【学习笔记】Oracle RMAN 备份集存储到远程其它服务器实现方法...
  4. Hadoop-基础配置
  5. WIA-PA标准:中国工业无线技术新突破
  6. 【原创精品】程序员最强大的利器——电子笔记本的思考(1)(ver0.3)
  7. 任意方位矩形相交面积计算
  8. Poj 1050 c++:To the Max
  9. 学习和了解甲骨文造字方法 2021-07-19
  10. java二嗨租车项目_Java入门第二季6-1项目问题 —嗒嗒租车系统(参考各位大神的思路写出来的)...