Android复习(三)清单文件中的元素——>supports-gl-texture、supports-screens
<supports-gl-texture>
注意:Google Play 会根据应用支持的纹理压缩格式对其进行过滤,以确保应用只能安装在可正确处理其纹理的设备上。您可以将纹理压缩过滤用作定位特定设备类型(基于 GPU 平台)的一种方法。
有关 Google Play 如何将 <supports-gl-texture>
元素用作过滤基础的重要信息,请阅读下文的 Google Play 和纹理压缩过滤。
- 语法:
-
<supports-gl-texture android:name="string" />
- 包含于:
<manifest>
- 说明:
- 声明应用支持的一种 GL 纹理压缩格式。
应用安装在设备上后,如果能够提供以某种 GL 纹理压缩格式压缩的纹理资源,就说明应用“支持”这种格式。应用可以在本地提供压缩的资源(从
.apk
内),也可以在运行时从服务器下载压缩的资源。每个
<supports-gl-texture>
元素只声明一种支持的纹理压缩格式,将其指定为android:name
属性的值。如果您的应用支持多种纹理压缩格式,您可以声明多个<supports-gl-texture>
元素。例如:<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)或应用可以在处理您的应用或与您的应用交互过程中检查其<supports-gl-texture>
声明。因此,请务必声明您的应用能够支持的所有纹理压缩格式(在下面的列表中)。应用和设备通常使用下面列出的同一组为人熟知的字符串来声明它们支持的 GL 纹理压缩格式。这一组格式字符串可能会随着时间的推移按需增加,而且由于值是字符串,因此应用可根据需要随意声明其他格式。
假定应用是使用 SDK Platform Tools r3 或更高版本构建的,那么会针对所有 API 级别激活基于
<supports-gl-texture>
元素的过滤。 - 属性:
android:name
- 以描述符字符串的形式指定应用支持的一种 GL 纹理压缩格式。下表列出了常见的描述符值。
纹理压缩格式描述符 注释 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
亮度 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 会将以下两者进行比较:
- 应用支持的纹理压缩格式 - 应用在其清单的
<supports-gl-texture>
元素中声明其支持的纹理压缩格式。 - 设备上的 GPU 支持的纹理压缩格式 - 设备将其支持的格式报告为只读系统属性。
每当您将应用上传到 Google Play 管理中心时,Google Play 都会扫描应用的清单文件并查找有无 <supports-gl-texture>
元素。它会从这些元素中提取格式描述符,并在内部将其存储为与应用 .apk
和应用版本关联的元数据。
当用户在 Google Play 上搜索或浏览应用时,该服务会将应用支持的纹理压缩格式与用户设备支持的纹理压缩格式进行比较。这种比较基于格式描述符字符串,匹配必须是完全匹配。
如果应用支持的任何纹理压缩格式也受设备支持,则 Google Play 将允许用户看到该应用,用户也有可能下载该应用。否则,如果应用支持的任何格式都不受设备支持,则 Google Play 会过滤掉该应用,以使其无法下载。
如果应用未声明任何 <supports-gl-texture>
元素,则 Google Play 不会应用任何基于 GL 纹理压缩格式的过滤。
<supports-screens>
- 语法:
-
<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"/>
- 包含于:
<manifest>
- 说明:
- 使您能够指定应用支持的屏幕尺寸,并为比应用支持的最大屏幕还大的屏幕启用屏幕兼容模式。请务必始终在应用中使用此元素指定应用支持的屏幕尺寸。
注意:建议不要在屏幕兼容模式下运行应用,因为它会因缩放而导致界面中出现像素化和模糊。让应用在大屏幕上正常运行的正确方法是遵循支持多种屏幕指南,并为不同尺寸的屏幕提供备用布局。
如果应用可以适当调整大小以填充整个屏幕,那么它就“支持”指定的屏幕尺寸。由系统应用的标准大小调整方式对于大多数应用来说效果不错,您无需执行任何额外操作即可让应用在比手机更大的屏幕上运行。不过,通常需要通过提供备用布局资源来优化应用的界面,以适应不同的屏幕尺寸。例如,与在手机上运行时相比,您可能需要修改 Activity 在平板电脑上的布局。
不过,如果应用在调整大小以适应不同的屏幕尺寸时效果不佳,您可以使用
<supports-screens>
元素的属性来控制是将应用分发到较小的屏幕,还是使用系统的屏幕兼容模式放大(“缩放”)界面以适应较大的屏幕。如果您未针对较大屏幕尺寸进行设计,并且标准大小调整方式无法达到理想的效果,则屏幕兼容模式会通过模拟标准尺寸屏幕和中密度然后再放大来缩放界面,以使其填充整个屏幕。请注意,这会导致界面像素化和变模糊,因此最好针对大屏幕优化界面。注意:Android 3.2 引入了新属性:
android:requiresSmallestWidthDp
、android:compatibleWidthLimitDp
和android:largestWidthLimitDp
。如果您要针对 Android 3.2 及更高版本开发应用,则应使用这些属性(而不是基于通用屏幕尺寸的属性)声明屏幕尺寸支持。屏幕兼容模式简介
只有在万不得已时,才可以针对无法充分利用较大屏幕尺寸的应用使用屏幕兼容模式。建议不要在此模式下运行应用,因为它会导致用户体验不佳。屏幕兼容模式有两种不同的版本,具体取决于运行应用的设备版本。
在 Android 版本 1.6 至 3.1 中,系统会在“邮票式”窗口中运行您的应用。它会模拟 320dp x 480dp 屏幕,并用黑色边框填充屏幕的剩余区域。
在 Android 3.2 及更高版本上,系统会像在 320dp x 480dp 屏幕上一样绘制布局,然后将其放大以填充屏幕。这通常会导致界面中出现模糊和像素化之类的失真。
如需详细了解如何正确支持不同的屏幕尺寸以免在应用中使用屏幕兼容模式,请参阅支持多种屏幕一文。
- 属性:
android:resizeable
- 指示应用是否可根据不同的屏幕尺寸调整大小。此属性默认为 true。如果设置为 false,则系统在大屏幕上会以屏幕兼容模式运行应用。
此属性已弃用。引入此属性是为了帮助应用从 Android 1.5 过渡到 1.6(首次引入对多屏幕的支持)。请不要使用此属性。
android:smallScreens
- 指示应用是否支持较小屏幕这种设备类型。小屏幕指的是宽高比小于“标准”(传统 HVGA)屏幕的屏幕。不支持小屏幕的应用将不适用于采用外部服务(如 Google Play)的小屏幕设备,因为平台几乎无法让此类应用在较小屏幕上正常运行。此属性默认为
"true"
。 android:normalScreens
- 指示应用是否支持“标准”屏幕这种设备类型。一直以来,标准屏幕是指 HVGA 中密度屏幕,但 WQVGA 低密度和 WVGA 高密度也被视为标准屏幕。此属性默认为“true”。
android:largeScreens
- 指示应用是否支持较大屏幕这种设备类型。大屏幕指的是比“标准”手机屏幕大得多的屏幕,因此应用可能需要特别注意以充分利用此类屏幕,虽然应用可以依赖系统调整大小来填充屏幕。
此属性的默认值实际上在某些版本之间会有所不同,因此最好始终明确声明此属性。请注意,将其设置为“false”一般会启用屏幕兼容模式。
android:xlargeScreens
- 指示应用是否支持超大屏幕这种设备类型。超大屏幕指的是比“大”屏幕大得多的屏幕,例如平板电脑(或更大的设备),应用可能需要特别注意以充分利用此类屏幕,虽然应用可以依赖系统调整大小来填充屏幕。
此属性的默认值实际上在某些版本之间会有所不同,因此最好始终明确声明此属性。请注意,将其设置为“false”一般会启用屏幕兼容模式。
此属性是在 API 级别 9 中引入的。
android:anyDensity
- 指示应用是否包含用于适应任何屏幕密度的资源。
对于支持 Android 1.6(API 级别 4)及更高版本的应用,此属性默认为“true”。不应将其设置为“false”,除非您非常确定有必要这样设置才能让应用正常运行。只有在您的应用直接操控位图时才有必要停用此属性(如需了解详情,请参阅支持多种屏幕文档)。
android:requiresSmallestWidthDp
- 指定所需的最小 smallestWidth。smallestWidth 是必须为应用界面提供的屏幕空间的最短边尺寸(以
dp
为单位),也是可用屏幕的两个尺寸中的最短尺寸。因此,为了使设备与您的应用兼容,设备的 smallestWidth 必须等于或大于此值。(通常,您为此属性提供的值是布局支持的“最小宽度”,无论当前屏幕方向如何。)例如,典型手机屏幕的 smallestWidth 为 320dp,7 英寸平板电脑的 smallestWidth 为 600dp,10 英寸平板电脑的 smallestWidth 为 720dp。这些值通常为 smallestWidth,因为它们是屏幕可用空间的最短边尺寸。
与您的值进行比较的尺寸将屏幕装饰和系统界面都考虑在内。例如,如果设备的屏幕上有一些永久性界面元素,则系统会将设备的 smallestWidth 声明为小于实际屏幕尺寸的尺寸,从而考虑这些界面元素,因为这些界面元素是您的界面无法使用的屏幕像素。因此,您使用的值应该是布局所需的最小宽度,无论当前屏幕方向如何。
如果您的应用针对较小屏幕尺寸(小至“小”尺寸或最小宽度 320dp)适当调整大小,则无需使用此属性。否则,您为此属性使用的值应与应用针对最小屏幕宽度限定符 (
sw<N>dp
) 所使用的最小值一致。注意:Android 系统不会注意此属性,因此它不会影响应用在运行时的行为方式。不过,您可以使用此属性在 Google Play 等服务上为应用启用过滤功能。但是,Google Play 当前不支持使用此属性进行过滤(在 Android 3.2 上)。因此,如果您的应用不支持小屏幕,则应继续使用其他尺寸属性。
此属性是在 API 级别 13 中引入的。
android:compatibleWidthLimitDp
- 通过此属性,您可以指定应用支持的“最小屏幕宽度”最大值,从而启用屏幕兼容模式作为用户可选的功能。如果设备的可用屏幕最小边大于您在此处指定的值,则用户仍可以安装应用,但要在屏幕兼容模式下运行该应用。默认情况下,屏幕兼容模式处于停用状态,系统通常会调整布局大小以适应屏幕大小,但用户可以使用系统栏中出现的按钮启用和停用屏幕兼容模式。
如果您的应用与所有屏幕尺寸兼容,并且其布局可以适当调整大小,则无需使用此属性。
注意:目前,屏幕兼容模式仅模拟宽度为 320dp 的手机屏幕,因此如果
android:compatibleWidthLimitDp
的值大于 320,则不会应用屏幕兼容模式。此属性是在 API 级别 13 中引入的。
android:largestWidthLimitDp
- 通过此属性,您可以指定应用支持的“最小屏幕宽度”最大值,从而强制启用屏幕兼容模式。如果设备的可用屏幕最小边大于您在此处指定的值,那么应用会在屏幕兼容模式下运行,且用户不能停用该模式。
如果您的应用与所有屏幕尺寸兼容,并且其布局可以适当调整大小,则无需使用此属性。否则,您应首先考虑使用
android:compatibleWidthLimitDp
属性。只有在以下情形才应使用android:largestWidthLimitDp
属性:您的应用在针对较大屏幕调整大小时无法正常运行,并且屏幕兼容模式是用户使用您的应用的唯一途径。注意:目前,屏幕兼容模式仅模拟宽度为 320dp 的手机屏幕,因此如果
android:largestWidthLimitDp
的值大于 320,则不会应用屏幕兼容模式。此属性是在 API 级别 13 中引入的。