声明受限屏幕支持

尽管我们强烈建议您在设计应用时使其适合所有屏幕尺寸和密度,但您可能仍不希望该应用支持某些屏幕配置。如果是这样,您可以限制 Android 可在多大程度上调整应用的大小,甚至限制哪些设备可以安装该应用(如本文所述)。

在限制应用仅支持特定屏幕之前,您应该了解可支持多种屏幕的所有技术,并尽最大努力实现这些技术。

针对不同的屏幕发布单独的工件

如果您无法构建支持所有屏幕配置的单个应用,Google Play 允许您针对同一应用详情发布多个版本。您可以使用此功能提供单独的工件,这些工件支持一组不同的屏幕配置(如清单文件中所声明),而无需在 Google Play 商店中创建单独的商品详情。

例如,如果您想同时发布手机版和平板电脑版应用,但无法让一个 APK 适用于这两种屏幕尺寸,则可以针对同一应用详情发布两个 APK。Google Play 会根据每种设备的屏幕配置下载与其屏幕尺寸相匹配的 APK。请注意,使用 Android App Bundle 发布应用时,所提供的 APK 会根据屏幕密度自动进行优化,但如果要定位屏幕尺寸,则必须使用相同的方法。

有关详情,请参阅针对不同的屏幕尺寸创建多个 APK

声明最大宽高比

为了支持尽可能多的设备,应用应动态调整其布局,以确保其内容和控件可见且结构清晰。

大多数应用还应该可调整大小,以便用户可以在多窗口模式下运行它们。用户可以在分屏模式和自由窗口模式下启动可调整大小的 activity,并通过拖动其边或角来更改该 activity 的大小。

多窗口模式适用于在 Android 7.0(API 级别 24)或更高版本中运行的所有应用,并且应用默认可调整大小。您还可以为整个应用或特定 activity 明确设置属性 android:resizeableActivity=true

Android 12(API 级别 31)默认采用多窗口模式。在大屏 (sw >= 600dp) 设备上,不论应用配置为何,所有应用都会在多窗口模式下运行。如果 resizeableActivity="false",应用会在必要时进入兼容模式,以与显示屏尺寸相符。在小屏 (sw < 600dp) 设备上,系统会检查 activity 的 minWidthminHeightresizeableActivity 设置,以确定 activity 是否可以在多窗口模式下运行。如果 resizeableActivity="false",则无论 activity 的最小宽度和高度是多少,activity 都不支持多窗口模式。

在 API 级别 30 及更低版本中,如果您不希望应用或 activity 在多窗口模式下运行,请设置 resizeableActivity=false。在这种情况下,应用始终以全屏模式显示。系统会根据 Android 操作系统级别控制完成此操作的方式:

  • 如果应用以 Android 8.0(API 级别 26)到 Android 11(API 级别 30)为目标平台,应用会根据其布局填充整个屏幕。
  • 如果您的应用定位到 Android 7.1(API 级别 25)或更低版本,则系统会将应用界面的大小限制为宽高比为 16:9(约为 1.86)的窗口。如果应用在具有较大屏幕宽高比的设备上运行,则该应用会在带黑边的 16:9 窗口中显示,从而使部分屏幕处于未占用状态。

如果您的应用布局无法适应宽高比过大的屏幕,则您可以通过设置最大宽高比在所有 Android 操作系统级别上固定采用黑边设置。我们建议使用 2.4 (12:5) 的比例。当您的应用在宽高比大于您指定的比例的设备上运行时,应用将进入信箱模式。对于 Wear OS 设备,您选择的值必须至少为 1.0;对于其他设备,该值必须至少为 1.33。如果您指定的比例小于这些限制,则系统会如上所述,根据操作系统级别限制应用的宽高比。

如需为 Android 8.0(API 级别 26)及更高版本设置最大宽高比,请在 <activity> 标记中使用 android:maxAspectRatio 声明最大宽高比。以下示例演示了如何声明 2.4 的最大宽高比:

<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<activity android:maxAspectRatio="2.4">
 ...
</activity>

对于 Android 7.1 及更低版本,在 <application> 元素中添加一个名为 android.max_aspect <meta-data> 元素,如下所示:

<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<meta-data android:name="android.max_aspect" android:value="2.4" />

如果您设置了最大宽高比,请勿忘记同时设置 android:resizeableActivity false。否则,最大宽高比没有任何作用。

声明最大屏幕尺寸

即使并未完全优化应用以支持不同的屏幕尺寸,Android 仍然可以拉伸大部分应用以适应较大的屏幕。因此,几乎从不需要声明最大屏幕尺寸。

如果您决定针对不同的屏幕尺寸创建多个 APK,则无需将 APK 限制为仅适用于小屏幕,因为针对大屏幕优化的 APK 应该具有较大的 versionCode,因此 Google Play 始终会将该 APK 提供给大屏幕。

不过,如果您对 Android 针对大屏设备调整应用大小的方式仍不满意,则可以通过在 <supports-screens> 清单标记中指定 largestWidthLimitDp 属性来禁止将大小调整到超过特定宽度。然后,Android 会启用屏幕兼容模式(该模式会按照在您的应用支持的最大尺寸屏幕上的绘制方式来绘制布局,然后放大所有像素以填充屏幕),而不是调整布局的大小。

限制应用仅支持平板电脑或电视

您可以使用 <supports-screens> 清单元素阻止手机设备下载您的应用。

例如,以下代码声明只有大屏幕和特大屏幕才能安装您的应用:

<manifest ... >
    <supports-screens android:smallScreens="false"
                      android:normalScreens="false"
                      android:largeScreens="true"
                      android:xlargeScreens="true"/>
    ...
</manifest>

限制应用仅支持特定尺寸和密度

您可以使用 <compatible-screens> 清单元素定义应用支持的确切屏幕尺寸和密度。但是,我们强烈建议您不要使用此功能,因为您未指定的任何尺寸和密度组合都会被视为您的应用与之不兼容的屏幕配置。因此,使用此元素很容易为应用屏蔽掉很多实际支持安装此应用的设备。

<compatible-screens> 元素必须包含一个或多个 <screen> 元素。每个 <screen> 元素都使用 android:screenSizeandroid:screenDensity 属性指定应用与之兼容的屏幕配置。每个 <screen> 元素都必须同时包含这两个属性才能指定一个屏幕配置 - 如果缺少任一属性,则元素无效(Google Play 等外部服务会将其忽略)。

如果您的应用仅与少量标准屏幕尺寸(以及一部分屏幕密度)兼容,则清单项将如下所示:

<manifest ... >
    <compatible-screens>
        <!-- all small size screens -->
        <screen android:screenSize="small" android:screenDensity="ldpi" />
        <screen android:screenSize="small" android:screenDensity="mdpi" />
        <screen android:screenSize="small" android:screenDensity="hdpi" />
        <screen android:screenSize="small" android:screenDensity="xhdpi" />
        <!-- all normal size screens -->
        <screen android:screenSize="normal" android:screenDensity="ldpi" />
        <screen android:screenSize="normal" android:screenDensity="mdpi" />
        <screen android:screenSize="normal" android:screenDensity="hdpi" />
        <screen android:screenSize="normal" android:screenDensity="xhdpi" />
    </compatible-screens>
    ...
    <application ... >
        ...
    <application>
</manifest>

未在此处明确声明的任意尺寸和密度组合都将受到限制,无法安装该应用。