Android 应用清单简介1

Android的应用清单实则指的是AndroidManifest.xml文件。里面有许多标签元素见过,但是没有彻底的了解到底是用来干嘛的,很多事情往往因为不知道的太多而采取南辕北辙的方法。以前做过这样的“傻事”。慢慢来弥补吧。

清单文件的标签们一览

<?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标签是必须要的。
以上语法,可以为app完成以下功能

  • 为应用的java软件包命名,软件包名称充当应用的唯一标识符
  • 描述应用的各个组件,包括构成应用的Activity,服务,广播接收器和内容提供程序。他还为实现每个组件的类命名并发布其功能,例如他们可以处理的Intent消息,这些声明向android系统告知有关组件,以及可以开启这些组件的条件及信息。
  • 确定托管应用组建的进程。
  • 声明应用必须具有哪些权限才能访问API中受保护的部分并与其他应用交互。还声明其他应用与该应用组件交互所需具备的权限。
  • 列出Instrumentation类,这些类可在应用进行时提供分析和其他信息。这些声明只会在应用处于开发阶段时出现在清单中,在应用发布之前将移除。
  • 声明应用所需的最低Android API级别。
  • 列出应用必须链接到的库。

标签解析

<manifest>标签

简介,manifest标签是AndroidManifest.xml文件的根标签,必须声明xmln:android属性和package属性。
manifest标签只能是根标签,
内部必须包含的标签是<application>
内部可选包含的标签是:
<compatible-screens>
<instrumentation>
<permission>
<permission-grounp>
<permission-tree>
<supports-gl-texture>
<supports-screens>
<uses-configutation>
<uses-eature>
<uses-permission>
<uses-permission-sdk-23>
<uses-sdk>
语法:

<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>

解析
xmln:android,它的值必须是http://schemas.android.com/apk/res/android ,写死就行

package,一个java代码风格的包名,这个名字是由大小写字母,数字,下划线,但是每一部分的开头必须由字母作为开头。例如com.example.yayali ,在build的时候,系统会利用package属性指向的字符串,做下面两件事情。

  • 为app 的 R.java class 申请命名空间, R.java是用来与app resources 连接的通道。例如你的package就是被命名为com.example.yayali了,那么R class就被创建为com.example.yayali.R

  • 是AndroidManifest文件中相对命名中“.”所映射的名称,例如以下熟悉的AndroidManifest.xml文件中的代码:
    在这里插入图片描述

    里面activity的名称是.MainActivity,实则是 com.example.yayali.MainAcrivity
    这个名字,它会是<application>标签中process属性的默认值。并且是Activity的默认关联,详见<activity> taskAffinity属性。
    这个名字同时也相当于当前的应用ID,为了你可以在Google play上发布,必须给它起一个独一无二的名字。在APK build程序中,build工具,会利用build.gradle文件中的applicationId属性重写package name。所以尽量保证AndroidManifest.xml文件中的package,与build.gradle文件中的applicationId的名字相同。值相同归相同,但是pakege name,与 applicationId的含义是不同的。有机会翻译这块。

android:sharedUserId,是Linux user ID。可以被多个app共享。Android会给每一个app分配一个独一无二的user id,不管怎样,这个属性会给两个或者多个app的这个值设置同样的字符串。这两个或者多个app共享这个同样的ID, 如果想的话,具有相同shareUserId的app,可以在运行过程中获得彼此的数据。

android:sharedUserLabel共享用户ID的用户可读标签,必须是一个字符串资源的引用。只有在shareUserId这个属性被设置的时候有意义!

android:targetSandboxVersion, 指明当前app用的目标沙盒。这个值越高,安全级别就越高。默认值为1,如果你强制设置为2的话,将发生以下变化:

  • 网络配置文件中的usesCleartextTraffic的默认属性值会被设置为false。
  • Uid 共享不被允许。
    注意的是,Android 8.0 (API level 26)及以上版本,targetSandboxVersion的值会被设置为2!当然你也可以改成1,但是一旦你这样做,应用程序不会将应用程序数据从即时应用程序保存到已安装的应用程序版本。一旦一个应用被安装,你只能把它的target sandbox value 设置的更高。如果这个值设置比当前还低的话,你必须卸载当前的app。才能安装一个更低的。实地运行会出现以下现象:
    将值由1调至2,会发现原来为1的安装基础上,再点击android studio 安装,可以正常安装。
    但是将值由2调整至1,再在android studio 点击真机调试,必现安装失败!!但是如果在真机调试之前先把低版本的那个app卸载掉,就会正常安装。至于数据方面由于我写的demo并没有做什么数据上的存储,所以这点没有亲自证实,但是应该是会有影响的!

android:versionCode, 这个属性最为熟悉,指的是版本号,用来判断app上的版本,新版本还是老版本。一般版本号越高说明版本越新。版本号对于普通用户是不需要知道的号,也不必感知。它必须是一个整数,比如100,你可以设置成任意整数,只要是每个版本的versionCode具备递增的规律即可。

android:versionName,设置为一个字符串,也可以是一个字符串资源的引用。这个字符串只是展示给用户看的。真正有用的是versionCode字串。

android:installLocation, 用来描述安装位置的。其值只可能是internalOnly, auto, preferExternal三个里面的其中一个。下面重点讲讲这三个值的含义!

  • internalOnly: 该应用只能被安装在设备的内部存储中。永远不可以被安装在外置存储中。如果内部存储已经满了,该app就不会被安装。这个也是android:installLocation属性的缺省值!
  • auto: 设备的内部存储有空间的情况下就安装到内部存储中,但是如果没有空间了,也会安装到外置存储中。同时用户还可以通过系统设置修改位置。
  • preferExternal: 应用优先安装到外置存储,当外置存储坏了或者是满了,就会安装到内部存储中。同时用户可以通过系统设置修改安装的位置。
    当一个应用被安装到外部存储时,有以下几个值得注意的点。
    1 apk包会被存到外部存储中,同时其app产生的数据,比如数据库,也会被存储到内部存储中。
    2 存储apk文件的容器会被加密,秘钥是设备中的一个秘钥。用户不能将sd卡安装到其他的设备,然后再安装已经被上个设备安装过的app。
    3 应用可以被挪到手机内存。

<uses-permission>标签

作用:当前应用访问其他的东西(外部,比如摄像头硬件)所需要的权限。
详情请见链接

语法:
只能被manifest标签包含。

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

解析
android:name: 权限的名称。
android:maxSdkVersion:此权限应授予应用的最高SDK版本。如果某个权限在某个API版本及以上版本不再需要了,这个属性就派上用场了。例如:

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

来来看看项目中司空见惯的代码片段demo,就是这个标签的教科书级使用方式。

<uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.VIBRATE"/>

<permisson>标签

作用: 自定义某些功能所需要的权限。
语法
只能被manifest标签包含。

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

解析
android:name, 权限的名称,但是有一个注意的点是,拥有不同签名的不同package是不能申请名字相同的权限的。除非他们签名相同。解决方案不写了。
android:label, 一个permission的解释标签,用户可见。为一个字符串或者字符串资源的引用。尽量设置为引用,有利于国际化。
android:description, 必须是一个字符串资源引用,用于对你所要权限做出一些解释例如为什么要获取这个权限,为用户可见的。
android:icon, 一个用于表现权限的图片资源引用
android:permissionGroup, 这个没有太懂,应该是将当前的权限绑定到一个组。它的值是一个字符串,但是这个字符串的名称必须是一个被<permission-group>标签定义好的权限组的名字。如果这个值没有设定的话,那么当前的权限不属于任何一个组!!
android:protectionLevel,当应用程序向用户请求权限的时候,用于特征化一些潜在的风险。其值有几个type外加flag组合构成。例如:
android:protectionLevel=“signature|privileged”。 singnature是type, privileged 是 flag。

  • type类型解释:
    • normal:这个type是一个缺省值。默认就这个。这是一个低风险的权限类型,会给请求权限的应用一个应用级别功能访问的入口。系统通常会在安装应用的时候自动准许这种权限。不用经过单独的权限提示。当然用户也可以跑到系统设置中一览。或者在应用安装的时候,总会出现一列权限,比如访问通讯录,短信等等,然后下面就是安装按钮。
    • dangerous: 一个高风险的类型。通常会给请求权限的应用一个私人数据或者控制设备硬件的入口,可能对用户不利。因为这种权限引出一些潜在的风险,设备不会自动就默认同意的!所以任何这种级别的权限在相关代码运行前需要列出信息并征得用户的同意!!
    • signature: 只有当请求权限的应用于允许权限的应用的证书相同的时候系统才会同意。如果二者证书相同的情况下,系统会自动同意。
    • signatureOrSystem: 这个type 与 API 23版本之前的 signature|privileged相同。 23版本之后被废弃。系统只授予在Android系统映像中的专用文件夹中的应用程序或使用与声明该权限的应用程序相同的证书签名的应用程序的权限。避免使用此选项,因为签名保护级别应该足以满足大多数需求,并且无论在哪里安装应用程序都可以工作。在某些特殊情况下,多个供应商将应用程序内置到系统映像中,并且需要显式地共享特定特性,因为它们是一起构建的。

<permission-group>标签

作用:
声明一个具有逻辑组织的权限组。单独的<permission>标签权限可以通过其android:permissionGroup属性来加入一个组。这个标签本身不是指定一个权限,而是把某些权限归到组里面。其父标签只能是<manifest>标签
语法

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

属性解析
感觉这几个属性基本一看词汇就知道啥意思。
android:description:必须是一个字符串资源引用!用来对权限进行一个较为详细的描述
android:icon:是一个图片资源引用。
android:label:可以是一个字符串,也可以是字符串资源的引用。建议用引用的方式。对当前的权限组进行一个简短的描述。
android:name:起一个名字

<permission-tree>标签

作用
声明一个权限树。可以通过PackageManager.addPermission()代码动态添加。并且添加的权限名称的名字有讲究,包名加上".自定义的名称",例如包名是com.example.project.taxes, 那么权限的名称可以是com.example.project.taxes.CALCULATE,这类的。
语法

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

小结,自定义权限

AndroidManifest.xml文件中自定义一个权限并且声明这个权限会被用到
1 声明一个权限

<permission android:name="com.example.forev.mycodelibrary.YAYALI"
        android:icon="@drawable/demo1"
        android:description="@string/permission_des"
        android:label="label"
        android:protectionLevel="dangerous"
        />

2 并且app需要用到这个权限

<uses-permission android:name="com.example.forev.mycodelibrary.YAYALI"/>

然后在代码中写下:

private void requestPermission() {
        boolean isGranted = (ActivityCompat.checkSelfPermission(
                this, "com.example.forev.mycodelibrary.YAYALI")
                == PackageManager.PERMISSION_GRANTED);
        if (isGranted){
            return;
        } else {
            ActivityCompat.requestPermissions(this, new String[]{"com.example.forev.mycodelibrary.YAYALI"}, 1);
        }
    }

即可!!
运行如下:
在这里插入图片描述


<instrumentation>标签

作用:这是一个关于测试用的标签。平常不是特别用的到。这个涉及很多的测试知识学习。暂时不做过多解释。有机会专门调研一下测试相关的技术。
语法

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

属性解释
android:name: 字符串,是Instrumentation子类的名字,并且是包名.子类名称。这个属性必须要被定义。
android:icon:是一个图片引用!
android:label:是一个字符串资源引用或者字符串。对所对应的类进行简短的描述。
android:functionTest:决定当前标签所代表的类是否可以进行方法测试。true为可以,false为不可以。默认false
android:targetPackage:对象将对其运行的应用程序,就是manifest中定义的包名。
target:targetProcesses:运行的进程, * 代表所有进程,不设置的话代表 targetPackage所代表的进程。
android:handleProfiling:是否会返回分析。


<uses-sdk>标签

作用:定义一个API级别,这个可能会对google play上你的应用的分发有些关系。例如当前设备低于你给定的API标准,可能这个设备得不到分发,或者能搜索到你的app,但是不能安装。
语法:

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

属性解释:
android:minSdkVersion:一个用于指定应用运行所需最低 API 级别的整数。 如果系统的 API 级别低于该属性中指定的值,Android 系统将阻止用户安装应用。 您应该始终声明该属性。缺省值为1,但是如果你把级别定的太低的时候,可能会在运行的时候,运行中设备的sdk库可能会缺少某些你程序里面写的代码而发生崩溃偶。所以尽量定一个合适的值比较靠谱。
android:targetSdkVersion:一个用于指定应用的目标 API 级别的整数。如果未设置,其默认值与为 minSdkVersion 指定的值相等。该属性用于通知系统,您已针对目标版本进行测试,并且系统不应启用任何兼容性行为来保持您的应用与目标版本的向前兼容性。 应用仍可在较低版本上运行(最低版本为 minSdkVersion)
android:maxSdkVersion:一个指定作为应用设计运行目标的最高 API 级别的整数。例如:Google Play 上发布了一个在其清单中声明了 maxSdkVersion=“5” 的应用。 一位设备运行 Android 1.6(API 级别 4)的用户下载并安装了该应用。 几周后,该用户收到了 Android 2.0(API 级别 5)OTA 系统更新。 更新安装后,系统检查该应用的 maxSdkVersion 并顺利完成了对其的重新验证。 应用仍可照常工作。 不过,一段时间后,设备又收到了一个系统更新,这次是更新到 Android 2.0.1(API 级别 6)。 更新完成后,系统无法再重新验证应用,因为此时系统本身的 API 级别 (6) 已超过该应用支持的最高级别 (5)。 系统会使该应用对用户不可见,这实际上相当于将它从设备上删除。不建议声明该属性。 首先,没有必要设置该属性,将其作为阻止您的应用部署到 Android 平台新发布版本上的一种手段。 从设计上讲,新版本平台完全向后兼容。 只要您的应用只使用标准 API 并遵循部署最佳实践,应该能够在新版本平台上正常工作。 其次,请注意在某些情况下,声明该属性可能导致您的应用在系统更新至更高 API 级别后被从用户设备中移除。 大多数可能安装您的应用的设备都会定期收到 OTA 系统更新,因此您应该在设置该属性前考虑这些更新对您的应用的影响

您可以通过在编译应用时依次降低其所针对的目标编译版本来确定可能的最低平台版本。 确定最低版本后,您应该使用相应平台版本(和 API 级别)创建一个 AVD,然后对您的应用进行全面测试。 请务必在应用的清单中声明 android:minSdkVersion 属性,并将其值设置为平台版本的 API 级别。
Android Developers 网站在每个参考文档页面的右上角提供了一个“Filter by API Level”控件。 您可以利用该控件,根据应用在其清单文件的 android:minSdkVersion 属性中指定的 API 级别,只显示您的应用实际可以访问的 API 部分的对应文档。


<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"] />

属性解释:
android:reqFiveWayNav:是否需要一个可以控制上下左右方向移动的设备。当把它设置为true的时候,忽略android:reqNavigation属性。
android:reqHardKeyboard:是否需要有个物理键盘
android:reqKeyboardType首先,这个属性是不区分是物理键盘还是软键盘的!!必须是以下四个值之一:

  • undefined: 当前的应用不需要键盘,是缺省值。
  • nokeys:当前应用不需要键盘。
  • qwerty:标准键盘
  • twelvekey:12key键盘

android:reqNavigation: 导航硬件。有以下四个可选

  • undefined:缺省值,不需要请求
  • nonav:不需要导航
  • dpad:需要一个手柄万向控制。
  • trackball:需要轨迹球,不动轨迹球的自行百度
  • wheel: 导航轮

android:reqTouchScreen:触摸屏类型。有四种类型

  • undefined 默认值,不去请求触摸屏。
  • notouch 不请求触摸屏
  • stylus 触摸笔
  • finger 手指

<uses-feature>

作用
告知这个app需要的软件功能或者硬件功能。如果当前设备不符合app所需要的功能,google play就不会在相应设备上分发该app。
语法

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

属性解释
android:name:所需要的硬件或者软件支持条件。不能瞎起名,必须得是一定的值。具体详见.
android:required: 是否当前app非得要这个硬件或者软件支持,true,代表没有这种条件的话,我宁愿不执行。 false的话,假使没有这个条件的话,我勉强还可以执行。。但是值得注意的一点是,有时候我们的应用清单中,根本就没有 uses-feauture这个标签的描述,但是索要了某些权限,例如摄像机权限。那么google play过滤的时候会认为你是需要这个功能或者软件配置的,并且是没有的话app不可运行这种级别的!!!
android:glEsVersion: 应用需要的 OpenGL ES 版本。高 16 位表示主版本号,低 16 位表示次版本号。 例如,要指定 OpenGL ES 2.0 版,您需要将其值设置为“0x00020000”;要指定 OpenGL ES 3.2,则需将其值设置为“0x00030002”。
应用应在其清单中至多指定一个 android:glEsVersion。 如果指定不止一个,将使用数值最高的 android:glEsVersion,任何其他值都会被忽略。

如果应用不指定 android:glEsVersion 属性,则系统假定应用只需要 OpenGL ES 1.0,即所有 Android 设备都支持的版本。

应用可以假定,如果平台支持给定 OpenGL ES 版本,也同样支持所有数值更低的 OpenGL ES 版本。 因此,同时需要 OpenGL ES 1.0 和 OpenGL ES 2.0 的应用必须指定它需要 OpenGL ES 2.0。

能够使用几种 OpenGL ES 版本中任一版本的应用只应指定它需要的数值最低的 OpenGL ES 版本。 (它可以在运行时检查是否有更高版本的 OpenGL ES 可用)。


<supports-screens>标签

语法
父标签只能是manifest标签

<supports-screens android:resizeable=["true"| "false"]
                  android:smallScreens=["true" | "false"]
                  android:normalScreens=["true" | "false"]
                  android:largeScreens=["true" | "false"]
                  android:xlargeScreens=["true" | "false"]
                  android:anyDensity=["true" | "false"]
                  android:requiresSmallestWidthDp="integer"
                  android:compatibleWidthLimitDp="integer"
                  android:largestWidthLimitDp="integer"/>

作用
定义一个你的应用支持的屏幕尺寸。可以尽量兼容一些你不支持的那些尺寸。
属性解释
android:resizeable:默认为true。当屏幕过大的时候会执行。现在尽量别用这个属性了,API 1.5之后过时。
android:smallScreens:默认为true。是否支持小屏幕,这种屏幕比HVGA的还要小
android:normalScreens: 默认为true。HVGA, WQVGA,WVGA 都属于 normalScreens。
android:largeScreens: 默认值根据各个版本而定。没有确定的值。指的是大屏。
android:xlargeScreens:比上一个还要大的屏幕。默认值和上一个默认值一样,依据各个版本而定。
android:anyDensity:API 1.6以上默认为true。 指明应用是否有支持各种屏幕密度的资源文件。尽量不要动这个值。
android:requiresSmallestWidthDp: 声明最小的密度。如果实际屏幕比这个还小,就按照这个密度。
android:largestWidthLimitDp: 声明最大的密度,如果设备实际的密度比这个还要大的话,按照这个来。
android:compatibleWidthLimitDp:声明一个密度,这个属性允许在设计应用程序时,通过指定最大的“smallest screen width”来启用屏幕兼容模式,作为一个用户可选的功能。如果设备的有效屏幕的最小边比这个属性值大,那么用户依然能够安装该应用程序,但是在运行时要使用屏幕兼容模式。默认情况下,屏幕兼容模式似乎被禁止的,并且通过会调整布局的尺寸来填充屏幕,但是在系统栏中会有一个按钮,让用户选择屏幕兼容模式的打开和关闭。如果应用程序跟所有的屏幕尺寸都兼容,并且它的布局能够被正确的调整尺寸,就不需要使用这个属性。注意:当前,屏幕兼容模式只能模拟320dp宽度的手持设备屏幕,因此如果android:compatibleWidthLimitDp的值比320大,那么屏幕兼容模式就不被适用。这个在API Level 13中被引入


<compatible-screens>标签

语法
父标签只能是manifest,且只能声明一个compatible-screens标签,但是它的里面可以声明若干个screen标签。用于声明应用可兼容的屏幕条件。

<compatible-screens>
    <screen android:screenSize=["small" | "normal" | "large" | "xlarge"]
            android:screenDensity=["ldpi" | "mdpi" | "hdpi" | "xhdpi"
                                   | "280" | "360" | "420" | "480" | "560" ] />
    ...
</compatible-screens>

作用
这个标签声明的内容实际上代码中无论是安装的时候,还是运行的时候,系统都不会使用的。实际上是给google play用的。没有声明的屏幕配置,google paly商店可能不给这样的设备分发该应用。如果你要设置最小宽度最大宽度的话,请使用 supports-screens标签。
标签解释

  • 子标签–<screen>:
    用于描述一个单一的可兼容屏幕配置,必须包含在<compatible-screens>标签中!并且必须给 android:screenSize 与 android:screenDensity赋值!!
    • android:screenSize: 屏幕尺寸,可能以下四个值
      • small:
      • normal:
      • large:
      • xlarge:
    • android:screenDensity:屏幕密度有以下
      • ldpi: 约为120dpi
      • mdpi:约为 160dpi
      • hdpi:约为 240dpi
      • xhdpi:约为320dpi
      • 280:
      • 360:
      • 420:
      • 480:
      • 560

demo

    <compatible-screens>
        <!--小屏幕各种分辨率-->
        <screen
            android:screenDensity="ldpi"
            android:screenSize="small"/>
        <screen
            android:screenDensity="mdpi"
            android:screenSize="small"/>
        <screen
            android:screenDensity="hdpi"
            android:screenSize="small"/>
        <screen
            android:screenDensity="xhdpi"
            android:screenSize="small"/>
        <screen
            android:screenDensity="xxhdpi"
            android:screenSize="small"/>
        <screen
            android:screenDensity="xxxhdpi"
            android:screenSize="small"/>
        
        <!--普通大小各种分辨率-->
        <screen
            android:screenDensity="ldpi"
            android:screenSize="normal"/>
        <screen
            android:screenDensity="mdpi"
            android:screenSize="normal"/>
        <screen
            android:screenDensity="hdpi"
            android:screenSize="normal"/>
        <screen
            android:screenDensity="xhdpi"
            android:screenSize="normal"/>
        <screen
            android:screenDensity="xxhdpi"
            android:screenSize="normal"/>
        <screen
            android:screenDensity="xxxhdpi"
            android:screenSize="normal"/>
        
    </compatible-screens>


<supports-gl-texture>标签

语法

<supports-gl-texture
  android:name="string" />

作用:声明应用程序支持的GL一种文理压缩格式。压缩的知识目前不太了解,以下摘抄自链接所示文章
声明本应用程序支持的一种 GL 纹理压缩格式。
所谓应用程序“支持”的 GL 纹理压缩格式,是指该应用程序安装到某设备之后就能够提供以这种格式压缩的纹理数据。 应用程序可以由 .apk 文件提供本地的压缩数据,也可以在运行时从服务器下载数据。

每个 元素只能声明一种所支持的纹理压缩格式, 这通过 android:name 属性值进行指定。 如果应用程序支持多种纹理压缩格式,可以声明多个 元素。例如:
<supports-gl-texture android:name=“GL_OES_compressed_ETC1_RGB8_texture” />
<supports-gl-texture android:name=“GL_OES_compressed_paletted_texture” />
<supports-gl-texture> 元素的声明仅仅是一种声明而已, 这意味着 Android 系统本身在安装程序时不会检查这些元素来确保设备是否符合要求。 不过某些其他的服务(比如 Google Play )或应用程序可以在处理本程序或与本程序交互时检查 声明。 因此,对本程序能够支持的所有纹理压缩格式(列表见下文)进行声明是十分重要的。

通常,应用程序和设备通过一组公认的字符串(如下所列)来声明所支持的 GL 纹理压缩格式。 根据需要,这种格式字符串可能会不断地增加。 因为是采用字符串的形式,应用程序也可以根据需要自由声明其它格式。

请确保应用程序是用 r3 以上版本的 SDK 工具进行编译的,基于 <supports-gl-texture> 元素的过滤机制适用于所有 API 级别 的版本。

属性解释
android:name
纹理压缩格式描述符 说明

  • GL_OES_compressed_ETC1_RGB8_texture Ericsson 纹理压缩。在 OpenGL ES 2.0 中定义,适用于所有支持 OpenGL ES 2.0 的 Android 平台设备。
  • GL_OES_compressed_paletted_texture 通用的带调色板的纹理压缩。
  • GL_AMD_compressed_3DC_texture ATI 3Dc 纹理压缩。
  • GL_AMD_compressed_ATC_texture ATI 纹理压缩。适用于运行 Adreno GPU 的设备,包括 HTC Nexus One、Droid Incredible、EVO 等等。 为了保证最大的兼容性,设备还可以用
  • GL_ATI_texture_compression_atitc 描述符来声明 <supports-gl-texture> 元素。
  • GL_EXT_texture_compression_latc Luminance alpha 纹理压缩。
  • GL_EXT_texture_compression_dxt1 S3 DXT1 纹理压缩。适用于 Nvidia Tegra2 平台的设备,包括 Motorala Xoom、Motorola Atrix、Droid Bionic 等等。
  • GL_EXT_texture_compression_s3tc S3 纹理压缩,但不支持 DXT 变体。 适用于 Nvidia Tegra2 平台的设备,包括Motorala Xoom、Motorola Atrix、Droid Bionic 等等。 如果应用程序需要 DXT 变体,请换用上一条描述符进行声明。
  • GL_IMG_texture_compression_pvrtc PowerVR 纹理压缩。 适用于带有 PowerVR SGX530/540 GPU 的设备,比如 Motorola DROID 系列;Samsung Galaxy S、Nexus S 和 Galaxy Tab 等等。

Google Play 和 纹理压缩过滤机制
Google Play 会对用户所能看见的应用程序进行过滤,这样用户只能看见并下载那些与自己设备兼容的应用程序。 其中一种方式是根据纹理压缩能力进行过滤,以便根据 GPU 的处理能力来控制应用程序对设备的适用范围。

为了确定应用程序的纹理压缩方式是否与给定的用户设备相兼容,Google Play 将对比以下两项内容:

应用程序支持的纹理压缩格式 — 应用程序在 Manifest 文件的 <supports-gl-texture> 元素里声明的其支持的纹理压缩格式。

设备的 GPU 所支持的纹理压缩格式 — 设备以系统只读属性的方式给出的格式。
每次向 Google Play Developer Console 上传应用程序时, Google Play 都会扫描程序的 Manifest 文件并查找 <supports-gl-texture> 元素。 从该元素中解析出格式描述符,并作为与程序 .apk 及版本相关联的基础元数据保存起来。

当用户在 Google Play 上搜索或浏览应用程序时,后台服务会把应用程序支持的纹理压缩格式与用户设备所支持的格式进行比较。 比较是根据格式描述符进行的,对字符串进行精确匹配。

只要应用程序支持的纹理压缩格式中有一种是设备支持的, Google Play 就允许用户看见该应用程序并提供下载。 反之,如果设备对应用程序列出的格式都不支持, Google Play 就会滤除这个应用,也不会提供下载。

如果应用程序没有声明任何 <supports-gl-texture> 元素, Google Play 将不会根据 GL 纹理压缩格式进行过滤。

猜你喜欢

转载自blog.csdn.net/weixin_28774815/article/details/88118587