专栏首页QA一隅AndroidManifest.xml详解

AndroidManifest.xml详解

AndroidManifest官方解释是应用清单(Manifest意思是货单),每个应用的根目录中都必须包含一个,并且文件名必须一模一样。这个文件中包含了APP的配置信息,系统需要根据里面的内容运行APP的代码,显示界面。

AndroidManifest.xml样例

以下 XML 文件为 AndroidManifest.xml 的一个简单示例,该示例为应用声明两个Activity

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0"
    package="com.example.myapp">

    <!-- Beware that these values are overridden by the build.gradle file -->
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- This name is resolved to com.example.myapp.MainActivity
             based upon the package attribute -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".DisplayMessageActivity"
            android:parentActivityName=".MainActivity" />
    </application>
</manifest>

AndroidManifest.xml元素

<manifest>元素

首先,所有的xml都必须包含<manifest>元素。这是文件的根节点。它必须要包含<application>元素,并且指明xmlns:androidpackage属性。

<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0"
    package="com.example.myapp">

xmlns:android

这个属性定义了Android命名空间。必须设置成"http://schemas.android.com/apk/res/android"。不要手动修改。

package

包名也代表着唯一的application ID,用来发布应用。包名由英文字母(大小写均可)、数字和下划线组成。每个独立的名字必须以字母开头。

android:versionCode

内部的版本号。用来表明哪个版本更新。这个数字不会显示给用户。显示给用户的是versionName。这个数字必须是整数。不能用16进制,也就是说不接受0x1这种参数

android:versionName

显示给用户看的版本号。

<application>

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

应用的声明。此元素包含用于声明每个应用组件的子元素,并且具有会影响所有组件的属性。其中许多属性(如 icon、label、permission、process、taskAffinityallowTaskReparenting)会为组件元素的相应属性设置默认值。其他属性(如 debuggable、enabled、descriptionallowClearUserData)则为整个应用设置值,并且不能被组件替换。

android:allowBackup

是否允许应用参与备份和恢复基础架构。如果将此属性设为 false,则永远不会为该应用执行备份或恢复,即使是采用全系统备份方法也不例外(这种备份方法通常会通过 adb 保存所有应用数据)。此属性的默认值为 true

<permission>

声明可用于限制对此应用或其他应用的特定组件或功能的访问权限的安全权限。

android:name

权限的名称

android:protectionLevel

说明权限中隐含的潜在风险,并指示系统在确定是否将权限授予请求授权的应用时应遵循的流程。

每个保护级别都包含基本权限类型以及零个或多个标记。例如,dangerous 保护级别没有标记。相反,保护级别 signature|privilegedsignature 基本权限类型和 privileged 标记的组合。

<uses-permission>

指定用户必须授予的系统权限,以便应用正常运行。当(在运行 Android 5.1 和更低版本的设备上)安装应用或(在运行 Android 6.0 和更高版本的设备上)运行应用时,用户会授予权限。

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

android:name

权限的名称。可以是应用通过<permission>元素定义的权限、另一个应用定义的权限,或者一个标准系统权限(例如 "android.permission.CAMERA""android.permission.READ_CONTACTS")。如这些示例所示,权限名称通常以软件包名称为前缀。

android:maxSdkVersion

此权限应授予应用的最高 API 级别。如果从某个API 级别开始不再需要应用所需的权限,则设置此属性非常有用。

例如,从 Android 4.4(API 级别 19)开始,应用在外部存储空间写入其特定目录(getExternalFilesDir() 提供的目录)时不再需要请求 WRITE_EXTERNAL_STORAGE 权限。但 API 级别 18 和更低版本需要此权限。因此,您可以使用如下声明,声明只有 API 级别 18 及以前版本才需要此权限:

<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="18" />

这样,从 API 级别 19 开始,系统将不再向您的应用授予WRITE_EXTERNAL_STORAGE 权限。

<activity>

声明实现应用部分可视化界面的 Activity(一个 Activity 子类)。必须用清单文件中的 <activity>元素表示所有 Activity。系统不会识别和运行任何未进行声明的 Activity

android:name

实现Activity 的类的名称,是 Activity 的子类。此属性值应为完全限定类名称(例如,“com.example.project.ExtracurricularActivity)。不过,为简便起见,如果名称的第一个字符是句点(例如,.ExtracurricularActivity),则名称将追加至<manifest> 元素中指定的软件包名称。一旦发布应用,即不应更改该名称(除非您设置了 android:exported="false")。该属性没有默认值。必须指定该名称。

android:configChanges

列出Activity 将自行处理的配置变更。在运行时发生配置变更时,默认情况下会关闭 Activity 并将其重启,但使用该属性声明配置将阻止 Activity 重启。相反,Activity会保持运行状态,并且系统会调用其 onConfigurationChanged() 方法。

android:launchMode

有关应如何启动 Activity 的指令。共有四种模式可与 Intent 对象中的Activity 标记(FLAG_ACTIVITY_* 常量)协同工作,以确定在调用 Activity 处理 Intent 时应执行的操作。这些模式是:

  • standard
  • singleTop
  • singleTask
  • singleInstance

默认模式是standard

android:theme

对定义 Activity 总体主题的样式资源的引用。此属性会自动将Activity的场景设置为使用该主题(请参阅 setTheme()),并且还可引发 Activity启动前的“启动”动画(以更加符合 Activity 的实际外观)。

如果未设置该属性,则 Activity会继承通过<application>元素的 theme 属性为应用所整体设置的主题。如果同样未设置该属性,则使用默认系统主题。

android:screenOrientation

Activity 在设备上的显示方向。如果Activity 是在多窗口模式下运行,则系统会忽略该属性。一般为portrait 屏幕方向为纵向(显示的高度大于宽度)。

<intent-filter>

<intent-filter>
     <data android:scheme="tencent101042978"/>
     <action android:name="android.intent.action.VIEW"/>
     <category android:name="android.intent.category.BROWSABLE"/>
     <category android:name="android.intent.category.DEFAULT"/>
 </intent-filter>

指定 Activity、服务或广播接收器可以响应的 Intent 类型。Intent 过滤器声明其父组件的功能 Activity 或服务可执行哪些操作,以及接收器可处理哪些类型的广播。它让组件可以接收所通告类型的 Intent,同时过滤掉对组件没有意义的 Intent

过滤器的大部分内容由它的<action><category><data> 子元素进行描述。

<receiver>

将广播接收器(BroadcastReceiver 子类)声明为应用的组件之一。广播接收器允许应用接收由系统或其他应用广播的 Intent,即使应用的其他组件并没有运行也是如此。让系统知道广播接收器有两种方法:一种方法是使用此元素在清单文件中声明广播接收器。另一种方法是在代码中动态创建接收器,并使用 Context.registerReceiver() 方法注册接收器。

android:exported

广播接收器是否可以接收来自其应用外部来源的消息 。如果可以,则为true,如果不可以,则为false。如果为false,则广播接收器只能接收由同一应用或具有相同用户 ID 的应用的组件发送的消息。

<provider>

声明内容提供程序组件。内容提供程序是 ContentProvider 的子类,可提供对由应用管理的数据的结构化访问机制。应用中的所有内容提供程序都必须在清单文件的 <provider> 元素中定义;否则,系统将不知道它们,也不会运行它们。

android:enabled

系统是否可以实例化内容提供程序。如果可以,则设为true;如果不能,则设为false。默认值为true<application>元素具有自己的 enabled 属性,该属性适用于所有应用组件,包括内容提供程序。<application><provider> 属性必须都为true(这正是它们两者的默认设置),才会启用内容提供程序。如果其中任一属性为false,就会停用提供程序;无法将其实例化。

<service>

将服务(Service 子类)声明为应用的一个组件。与 Activity 不同,服务缺少可视化界面。服务用于实现长时间运行的后台操作,或可由其他应用调用的富通信 API。必须用清单文件中的 <service>元素表示所有服务。系统不会识别和运行任何未进行声明的服务。

android:enabled

系统是否可实例化服务 true表示可以,false表示不可以。默认值为true<application> 元素拥有自己的 enabled 属性,该属性适用于所有应用组件,包括服务。只有在 <application><service> 属性都为true(因为它们都默认使用该值)时,系统才能启用服务。任何一项为“false”都会造成服务停用,从而使系统无法将其实例化。

android:name

为应用实现的 Application 子类的完全限定名称。应用进程启动后,此类会在应用的所有组件之前进行实例化。该子类是可选的;大多数应用都不需要它。在没有子类的情况下,Android会使用 Application基类的实例。

android:icon

整个应用的图标,以及每个应用组件的默认图标。

android:label

整个应用的用户可读标签,以及每个应用组件的默认标签。

android:supportsRtl

声明您的应用是否愿意支持从右到左 (RTL) 布局。如果设为 true 并且 targetSdkVersion 设为 17 或更高版本,则系统会激活和使用各种 RTL API,以便您的应用可以显示 RTL布局。

如果设为false或者如果 targetSdkVersion设为 16或更低版本,则 RTL API 将被忽略或不起作用,无论与用户所选语言区域关联的布局方向为何(布局始终是从左到右),应用的行为都相同。此属性的默认值为false

android:theme

对样式资源的引用,用于为应用中的所有Activity定义默认主题背景。各个Activity可以通过设置自己的 theme 属性来替换默认值。

本文分享自微信公众号 - QA一隅(sutune2020),作者:Sutune

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-03-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • AndroidManifest.xml详解

    我们在进行APP开发的时候都会遇到一个文件:AndroidManifest.xml。从刚开始进行Android开发,到现在已经过去了几个月,还是对这个文件一知半...

    233333
  • A006-AndroidManifest.xml解析

    https://blog.csdn.net/wwj_748/article/details/47402673

    用户1130025
  • AndroidManifest.xml中含盖的安全问题详解

    AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,Manifest文件提供有关应用程序到Android系统的...

    砸漏
  • Android9.0 使用 AndroidVideoCache 时不能缓存/播放视频的解决

    项目中使用 https://github.com/danikula/AndroidVideoCache 作为视频缓存组件,但是在9.0手机上无法正常缓存,并且报...

    CnPeng
  • 《Android》Lesson09-Acitivity的四种启动模式

    用户1733354
  • Android逆向笔记 —— AndroidManifest.xml 文件格式解析

    做过 Android 开发的同学对 AndroidManifest.xml 文件肯定很熟悉,我们也叫它 清单文件 ,之所以称之为清单文件,因为它的确是应用的 “...

    路遥TM
  • Android 属性 allowBackup

    最近用的一个库有allowBackup=true属性, 我的app里有allowBackup=false属性, IDE报错:

    望天
  • Flutter开发:提示Error parsing..:‘/Users.../AndroidManifest.xml’…解决方法

    在Flutter开发初期的时候,会遇到各种各样的问题,这个时候对于刚接触Flutter开发的开发者来说是有点费事费力的,所以在Flutter开发初期要多积累,多...

    三掌柜
  • Unity与Android调用交互

    AS 和 Unity 之间如何通信。AS 和 Unity 之间通信的方法介绍如下:

    呆呆敲代码的小Y
  • Android隐藏标题栏及解决启动闪过标题的实例详解

    第一种方法在应用启动时会闪过标题栏,然后执行this.requestWindowFeature(Window.FEATURE_NO_TITLE)才隐藏标题栏,而...

    砸漏
  • Android之APP安全测试篇

    反编译 apk 文件,在AndroidManifest.xml 中查找Activity组件

    厦门-安仔
  • Android之APP安全测试篇

    反编译 apk 文件,在AndroidManifest.xml 中查找Activity组件

    洛米唯熊
  • Android从网络中获得一张图片并显示在屏幕上的实例详解

    注意访问网络中的数据需要添加android.permission.INTERNET权限

    砸漏
  • MobSF 框架及源代码分析

    MobSF,全称(Mobile-Security-Framework),是一款优秀的开源移动应用自动测试框架。该平台可对安卓、苹果应用程序进行静态、动态分析,并...

    小老鼠
  • Android:关于 Intent组件的那些小事(介绍、使用方法等)

    a. 8种基本数据类型(boolean byte char short int long float double)、String b. Intent、Bu...

    Carson.Ho
  • Android:Intent介绍 & 使用方法

    Intent在Android开发的应用非常常见,今天我就带给大家简单讲一下Intent的相关知识及其用法。

    Carson.Ho
  • Android N 7.0中报错:android.os.FileUriExposedException的解决方法

    最近在Android N 上 安装Apk时报错:android.os.FileUriExposedException: file:///storage/emul...

    砸漏
  • Android逆向|修改apk资源实现去广告

    本篇是《Android逆向入门教程》的第二章第6节,更多章节详细内容及实验材料可通过加入底部免费的【Android逆向成长计划】星球获得!

    辞令
  • Android Theme以及解决启动黑屏的方法详解

    本文主要介绍了关于Android Theme及解决启动黑屏的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

    砸漏

扫码关注云+社区

领取腾讯云代金券