美文网首页Android OtherAndroid开发Android知识
Android知识点回顾之Manifest文件-上篇

Android知识点回顾之Manifest文件-上篇

作者: 星泉毅 | 来源:发表于2017-11-02 22:26 被阅读35次

    定义:AndrodiManifest.xml文件为Android程序的入口文件,并且是必须的,位于整个项目的根目录下。拿到一个Android项目,可以先从AndroidManifest.xml文件入手,进行分析。它提供了一些必要的信息,比如程序的入口Activity,其他组件的声明,权限的声明,包名,版本信息等。

    Manifest可以做以下事情:

    • 定义包名,包名为APP的唯一标识,每个不同APP的包名必然不同。
    • 组件声明。Activity,Service,BroadcastReceiver,ContentProvider
    • 确定应用程序组件的进程
    • 权限声明
    • 列出Instrumentation类的信息,提供性能分析和APP在执行的其他信息
    • 声明应用支持最低Android API的版本
    • 声明必须链接的共享类库

    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

    清单文件的根元素,必须包含<application>标签,指定命名空间xmlns:android和package属性

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

    xmlns:android,定义android命名空间,通常设置为“http://schemas.android.com/apk/res/android”。关于xml的命名空间,可以看这里

    package:不同的APP具有不同的包名。以Java包名风格进行命名,必须唯一。

    sharedUserId:具有相同的uderId并且具有相同签名的APP可以共享和访问彼此的数据,甚至可以在同一个进程里面运行,此时必须设置<android:process>相同。

    sharedUserLabel:给共享userId定义了用户可读标签,只有设置了sharedUserId,此属性才有意义。

    versionCode:内部版本号。必须是整数,Integer类型。用来判断版本的升级,每一次发布都必须必之前的要大。如果versionName没有设置,则设置成此值。

    versionName:展示给用户看的版本号。为String类型。

    installLocation:设置apk文件的默认安装路径。

    • internalOnly,只能安装在设备ROM上(内部存储),如果设备ROM空间满了,则会安装失败。如果没定义androdi:installLocation,则默认设置的是此项。
    • auto,系统优先安装apk包到内部存储,如果内部存储满了,则会安装到SD卡。用户也可以把外部存储安装好的应用移到内部存储上
    • preferExternal,会优先安装在外部存储上(SD卡),当无SD卡或SD卡满了的话,则会安装到内部存储上。当然,用户可以把外部存储安装好的应用移到内部存储上
      关于外部存储的几个注意点:
      • .apk文件是安装在SD卡上,但是数据还是保持在内部存储上
      • SD卡上安装的apk文件和设备关联,把SD卡放到另外一台设备进行访问是不行的。
      • 用户可以把已安装好的应用移入内部存储

    权限

    user-permission

    声明APP需要使用到的权限,Android5.1或以下在安装的时候声请,Android6.0或以上的需要运行时权限申请

    <uses-permission android:name="string"
            android:maxSdkVersion="integer" />
    

    name:权限的名称。可以是系统定义的权限,也可以是其他应用的权限,或者是使用<permission>自定义的权限

    maxSdkVersion:此申请的权限最高的作用Android版本。当一些权限在高版本无需申请的时候可以设置此值,比如 WRITE_EXTERNAL_STORAGE,在API 19就不需要进行申请了,可以进行如下操作

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

    permission

    自定义权限,以限制访问指定的组件或APP——本APP或其他APP,起到保护的作用。

    <permission android:description="string resource"
                android:icon="drawable resource"
                android:label="string resource"
                android:name="string"
                android:permissionGroup="string"
                android:protectionLevel=["normal" | "dangerous" |
                                         "signature" | "signatureOrSystem"] />
    

    description:自定义的用户可读的权限描述,

    icon:权限的icon图标

    label:展示给用户的权限名字

    name:权限的命名,为一串唯一的英文字符,如:com.example.READ_ACTIVITY。需要注意的是Android系统不允许不同的包名定义相同的权限名(permission name),除非不同的包名具有相同的签名证书。如果一个APP1声明了权限名A,则系统不允许另外一个声明了权限名A的不同签名证书的APP2进行安装。为了避免这种情况发生,可以以自己APP的包名为前缀进行权限声明

    permissionGroup:权限所属的权限组,此项的值必须为<permission-group>中声明的name或者是其他APP声明的。如果此项不设置,则此权限不属于权限组。

    protectionLevel:权限的级别。

    • normal:默认值。低风险的。系统会自动分配此类权限,而不需要通过用户来点击确认
    • dangerous:危险的权限。需要经用户允许才能够获取此类权限
    • signature:申请权限的APP必须也声明此权限的APP具有相同的签名才允许获得。
    • signatureOrSystem:申请权限的APP必须为系统签名或是和声明此权限的APP具有相同的签名才允许获得权限

    要访问受权限保护的组件,必须在<uses-permission>进行声明,不论是官方定义的还是自定义的,如:

    <manifest . . . >
        <permission android:name="com.example.READ_ACTIVITY" . . . />
        <uses-permission android:name="com.example.READ_ACTIVITY" />
        . . .
        <application . . .>
            <activity android:name="com.example.TestActivity"
                      android:permission="com.example.READ_ACTIVITY"
                      . . . >
                . . .
            </activity>
        </application>
    </manifest>
    

    TestActivity声明了READ_ACTIVITY权限保护,如果要启动TestActivity,必须要申请READ_ACTIVITY权限

    permission-tree

    声明一个权限树,可以在此节点上动态添加权限,PackageManager.addPermission()。如声明了权限树com.example.project.taxes,在此节点上可以动态添加权限:
    com.example.project.taxes.CALCULATE
    com.example.project.taxes.deductions.MAKE_SOME_UP
    com.example.project.taxes.deductions.EXAGGERATE

    需要注意的是此项声明的不是权限,是权限的命名空间。

    <permission-tree android:icon="drawable resource"
                     android:label="string resource" ]
                     android:name="string" />
    

    icon和label与permission的类似。
    name为权限的命名,如:com.example.project.taxes

    permission-group

    声明一个逻辑上的权限分组

    <permission-group android:description="string resource"
                      android:icon="drawable resource"
                      android:label="string resource"
                      android:name="string" />
    

    instrumentation

    声明一个Instrumentation类,用来监控APP和系统的交互。Instrumentation对象会在APP的所有组件之前进行实例化。

    <instrumentation android:functionalTest=["true" | "false"]
                     android:handleProfiling=["true" | "false"]
                     android:icon="drawable resource"
                     android:label="string resource"
                     android:name="string"
                     android:targetPackage="string" />
    

    functionalTest:是否进行功能性的测试。true:是。false:否。默认值为false

    handleProfiling:true:自定义性能分析的开始和结束时间。false:性能分析整个运行过程。默认值为false

    name:Instrumentation子类的全名。比如:com.example.project.StringInstrumentation

    targetPackage:Instrumentation对象所依赖的目标包名

    Instrumentation具体的可参考这里

    uses-sdk

    <uses-sdk android:minSdkVersion="integer"
              android:targetSdkVersion="integer"
              android:maxSdkVersion="integer" />
    

    minSdkVersion:指定APP运行的所需最低API级别的整数,如果系统API级别低于此值,则会阻止用户安装。如果不声明该属性,则默认为1。

    targetSdkVersion:指定APP目标API级别的整数,不过不声明该属性,则默认和minSdkVersion一样

    maxSdkVersion:APP能够运行在系统的最大API级别。在Android2.0.1以下,如果APP指定的此项低于系统的API级别,则会安装不了,已安装的会被隐藏掉。Android2.0.1(不包含)以上的系统不会检查安装的APP的此项属性,所以不会出现2.0.1以下的情况。此值一般不进行设置。

    uses-configuration

    用来设置APP需要的相关硬件和软件的配置。大部分APP都不需要此属性。

    <uses-configuration
      android:reqFiveWayNav=["true" | "false"]
      android:reqHardKeyboard=["true" | "false"]
      android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"]
      android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"]
      android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />
    

    reqFiveWayNav:是否需要五维导航控制,如方向版(D-pad),轨迹球等。

    reqHardKeyboard:是否需要物理键盘

    reqKeyboardType:设置所需键盘的类型

    reqNavigation:指定方向控制的确切类型或不指定(undefined,为默认值)

    reqTouchScreen:触摸屏的类型。

    uses-feature

    用来声明APP所要使用和依赖的单一的软硬件功能。该项所提供的require属性如果是需要的功能,那么如果缺少的话就会无法使用。比如声明了<uses-feature android:name="android.hardware.camera" require="true"/>,如果缺少摄像头,那么就会无法使用。并且必须单独地为每个功能进行声明。很重要的一点是GooglePlay会根据此项所声明的功能进行过滤提供给兼容设备的用户,用户只能下载和其设备相容的APP。

    <uses-feature
      android:name="string"
      android:required=["true" | "false"]
      android:glEsVersion="integer" />
    

    name:硬件或软件功能的字符串描述。

    required:true,当设备没有改指定的功能(name)时,APP无法正常工作或设计为无法正常工作;false,有该功能优先使用该功能,无也可正常工作。默认值为true

    glEsVersion:所需要的OpenGL ES版本。高16位表示主版本号,底16位表示次版本号。例如,要指定 OpenGL ES 2.0 版,您需要将其值设置为“0x00020000”;要指定 OpenGL ES 3.2,则需将其值设置为“0x00030002”。如果声明多个,则选择最高版本的那个,其它的忽略。如果不声明,则默认为1.0版本,所有Android设备都支持。

    相关文章

      网友评论

        本文标题:Android知识点回顾之Manifest文件-上篇

        本文链接:https://www.haomeiwen.com/subject/aqgupxtx.html