开发人员控制台

设备筛选和兼容性


设备筛选和兼容性

当提交APK到亚马逊应用商店时,应用清单build.gradle文件中的属性决定了您的应用可在哪些设备上安装。这些文件与设备功能之间的不兼容,会使得该设备不支持您的APK文件。以下各节介绍一些影响设备支持的筛选条件。您还可以在开发者控制台中手动调整支持设备列表。

背景知识

由于亚马逊的Fire OS基于Android系统,亚马逊将尽可能与Android保持一致。因此,此处的文档不会重复Android文档中的信息,而是会介绍亚马逊和Fire OS的不同之处。为了更好地理解此处的概念,请参考Android文档中的以下基础主题:

与设备筛选相关的关键术语

以下是应用提交中用于设备筛选的常用术语。

有关更全面的词汇表,请参阅应用提交术语表

由APK清单确定的设备兼容性

和标准Android实践一样,APK清单和build.gradle文件中的属性决定了哪些设备与您的应用兼容。例如:

  • 如果您在应用清单中设置minSdkVersion=4smallScreens=false,则亚马逊应用商店会阻止应用安装到任何不支持这些要求的设备上。 
  • 如果您的清单中声明要求相机功能(<uses-feature android:name="android.hardware.camera" />),则不兼容任何没有相机功能的设备。使用不兼容设备的客户将无法安装该应用。

亚马逊应用商店根据APK清单中的筛选条件,检查客户设备的硬件和软件要求,以及运营商、位置和其他特性。亚马逊还会检查应用元数据(在发布应用时选择)中指定的地理位置可用性要求。根据筛选规则,如果您的应用与设备兼容,则会向客户提供该应用。如果应用不兼容,则会在该客户设备的搜索结果和类别浏览中隐藏您的应用。

下表示出了筛选条件示例: 

筛选类型 示例
基于设备兼容性的筛选 如果您在应用清单中声明应用需要GPS,亚马逊应用商店只向支持GPS的设备显示该应用。
基于应用可用性的筛选 如果您在开发者门户中声明您的应用只能在北美地区提供,则亚马逊应用商店不会向非北美地区的设备显示该应用。

有关支持的清单筛选条件的完整列表,请参阅亚马逊应用商店支持的清单筛选条件

支持非亚马逊设备

除了支持亚马逊设备外,亚马逊应用商店还支持非亚马逊设备。您的清单和build.gradle文件也决定了这些设备上的筛选逻辑和设备支持。

要在非亚马逊设备上安装亚马逊应用,客户可通过适用于Android系统的亚马逊应用商店安装。如果客户已经从亚马逊应用商店购买了应用,并且不想再从Google Play购买该应用,或者如果他们拥有从亚马逊购买的硬币或订阅,并希望在其他设备(如Android平板电脑)上的同一应用中使用,则客户可能会在非亚马逊设备上安装您的亚马逊应用。

Fire OS和Android API级别

Fire设备使用Fire OS作为操作系统。由于Fire OS是定制版Android,因此每个Fire OS版本对应一个Android API级别。创建应用清单的第一步,是在android:minSdkVersion属性中为所要定向的Fire设备指定正确的Android API级别。例如,要定向到所有2013年及之后的平板电脑,清单应该包含如下条目:

<uses-sdk android:minSdkVersion="17" />

和Android设备一样,并非所有Fire设备都具有相同的API级别。例如,Fire TV设备有些在Fire OS 7上运行(基于Android API 28级),有些在Fire OS 6上运行(基于Android API 25级),还有一些在Fire OS 5上运行(基于API 22级)。Fire平板电脑的API级别之间差异更大。有关不同Fire设备的具体API级别,请参阅以下内容:

跨API级别的向后和向前兼容性

Android API通常向后兼容,这意味着支持Android 28级的设备将支持1到27级。但是,Android API不能向前兼容,这意味着27级不一定支持28级推出的所有功能。因此,Fire OS 6可能不支持Fire OS 7中的某些功能。Fire OS 5可能不支持Fire OS 6中的某些功能,依此类推。有关如何针对Fire OS 6和Fire OS 7进行开发的特殊注意事项,请参阅以下内容:

不断变化的API级别

设备的一些Android API级别会随着Fire OS更新的部署而发生变化。例如,一些版本的Fire平板电脑最初发布时搭载了Fire OS 6,但后来通过无线(“OTA”)更新过程升级到Fire OS 7。

如果您的APK与多个版本的Fire OS均兼容,请在清单的<uses-sdk>元素中将minSdkVersion设置为设备支持的最低API级别,以确保与设备的最大兼容性。如果将minSdkVersion设置为22,则不兼容仅支持19级及更低级别的设备。

亚马逊应用商店还支持android:maxSdkVersion属性,该属性可指定设备上允许运行的最高API级别。大多数情况下,除非更高的API级别破坏了兼容性,否则无需使用此属性。

常见硬件和软件功能

在您指定minSdkVersion之后,请确保<uses-permission><uses-features>元素适用于您的应用所要兼容的设备。有关特定硬件和软件功能,请参阅Fire平板电脑Fire TV规格。

还要注意隐含(或未说明)的功能要求。根据Android <uses-feature>文档的说明,为特定功能指定<uses-permission>隐含一个或多个<uses-feature>元素(假设android:required="true")。由于隐含功能是必需的,APK无法与任何不提供这些功能的设备兼容,即使该应用被设计成可在功能不存在时正常降级。

为了更好地理解隐含功能,请考虑以下场景。您的应用使用设备的当前位置来查找附近的加油站。该应用可以从设备的GPS获取当前位置,但是如果GPS不可用,用户可以输入地址或位置。要使用GPS,您应该在清单中包含以下元素:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

但是,如果您没有明确定义功能要求,则会隐式地定义以下元素:

<uses-feature android:name="android.hardware.location" android:required="true" />
<uses-feature android:name="android.hardware.location.gps" android:required="true" />

如果您随后向亚马逊应用商店提供此APK,则只有配备内置GPS功能(搭配WAN或无线接入网络)的Fire平板电脑才能兼容。要兼容其他Fire设备,您的清单中应该包含这些元素,但应将它们指定为非必需元素(前提是您的应用在没有GPS时可正常工作):

<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />

有关会导致隐含功能的完整权限列表,请参阅隐含功能请求的权限

Fire TV设备筛选

对于Fire TV设备,以下清单属性将标识对Fire TV的支持:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

此属性表示触摸屏功能为false。Fire TV设备不支持触摸屏和多点触控功能,但手机和平板电脑支持。因此,您必须声明此android.hardware.touchscreen属性为false,亚马逊应用商店才能将您的应用归类为与Fire TV设备兼容。

但是,这种分类不会自动完成。当上传专为Fire TV设备设计的APK时,您仍然必须在开发者控制台中手动选择您的APK与哪些设备兼容。有关详细信息,请参阅调整APK的设备支持

网页应用的设备筛选

虽然基于Android清单的设备筛选不可用于网页应用,但在提交过程中,仍可通过复选框列表来控制支持的设备。对于网页应用,即使您提交网站的URL或上传带有网页文件的zip压缩包,亚马逊应用商店也会将网页应用拿出来,并使用Cordova包装器生成Android应用。此Cordova打包应用就是用户下载并安装在他们设备上的Android应用。

网页应用与所有设备都能兼容,因为就Android API而言,它们是非常基础的——WebView有一个加载网页文件或URL的活动,且API级别设置为10,以获得尽可能广泛的兼容性。

指定应用的安装位置

您的Android清单文件指定了应用在Fire设备上的安装位置。对于大多数应用,将此值设置为“外部存储”(preferExternal)可以为应用用户提供更好的体验,因为这会减少客户由于设备的内部存储已满而无法安装应用的情况。有关更多信息,请参阅指定应用的安装位置

从应用清单中删除uses-amzn-sdk

如果您的应用清单中包含<uses-amzn-sdk>标签,请移除该标签。此标签与旧的Fire OS SDK附加程序相关,不再用于Fire TV上的应用。

尽管您的应用在清单中存在此标签时(通常)仍能工作,但删除它将避免将来出现任何不兼容。为Fire设备开发应用时,无需使用旧的Fire OS SDK附加程序的任何组件。相反,应使用标准Android APIAmazon SDK

同一应用的多个APK

虽然您可以在一个APK中支持不同的设备(例如,通过在运行时检查权限并在该设备不支持该功能时正常降级),但为同一公开应用构建多个APK可能会更容易。每个APK可以适应不同设备的不同软件或硬件功能及组件。

多个APK容纳的设备差异可能包括API级别、OpenGL压缩格式、CPU、屏幕尺寸和屏幕像素密度、设备功能,甚至其他因素,例如地理区域设置。例如,您可能想要一个用于Fire平板电脑的APK,一个用于Fire TV的单独APK,以及一个用于非亚马逊Android设备的APK。因此,亚马逊应用商店允许您为同一个应用上传多个APK。

无论您上传了多少个APK,用户在应用商店中只会看到一个应用。下载的APK取决于用户的设备。例如,假设您有一个名为“Stream Sports Everywhere”的应用。 您希望该应用能够无缝在手机、平板电脑和TV上工作。但是,您发现很难使用单一APK满足所有这些设备。因此,您决定创建两个APK,一个用于手机/平板电脑,另一个用于TV。

在应用商店中,用户只会看到一个“Stream Sports Everywhere”应用。用户从TV设备安装该应用时,将安装为TV创建的APK。用户从手机或平板电脑安装该应用时,将安装为手机和平板电脑创建的APK。

如果该应用收费,客户在其他设备上不会收到重新购买相同应用的提示,因为该客户已购买该应用。客户只需购买一次您的应用,即可在他们使用的每台设备上自动获得经过优化的正确版本。

此外,应用的报告、指标和评论也会合并,以涵盖所有与该应用关联的APK。

针对多个APK的要求

当您为同一个应用提交多个APK时,请务必执行以下操作:

1.为每个APK指定唯一版本代码。

versionCode是一个内部编号方案,不向用户显示。(仅向用户显示versionName。) 版本代码是您选择的单个整数,例如11254versionCode(以及versionName)在应用的build.gradle文件中指定。有关详细信息,请参阅指定应用版本

versionCode用于表示应用的后续版本。如果您有多个APK并发布了更新,versionCode还可确定设备会不会收到更新的APK。versionCode数字越高表示版本越新。只有当更新后APK的versionCode高于现有设备APK的versionCode时,与APK兼容的设备才会收到应用更新。

例如,假设您的一个应用有两个APK:APK“Ham”的versionCode为10,APK “Eggs”的versionCode为20。客户有一个设备安装了"Eggs"。在对APK的更新中,您决定删除Eggs并仅使用Ham,即定向到带有Ham的所有设备。如果您将Ham的versionCode增加到11,已经安装了Eggs的客户不会收到更新,因为Eggs具有更高的versionCode。因此,您需要在提交更新之前将versionCode设置为21或更高。

2.为同一应用列表中的每个APK使用相同的程序包名称。

在清单中,同一应用列表中的每个APK必须使用相同的程序包名称。有关详细信息,请参阅package

在应用商店中,使用程序包名称来标识各个应用。每个应用的程序包名称必须唯一,并且为了进行目录集成,程序包名称不能包含amazon字样。

多个APK的versionCode示例

我们来看看多个APK的package名称和versionCode的示例。假设您为同一个应用构建了单独的APK,一个APK用于Fire平板电脑,一个APK用于亚马逊Fire TV设备。第一个APK的清单属性可能会如下所示:

APK 1的清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mycompany.myapp">

</manifest>

APK 1的build.gradle文件

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 13
        versionName "1.0.6"
    }

APK 2的清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mycompany.myapp">

</manifest>

APK 2的build.gradle文件

    defaultConfig {
        minSdkVersion 22
        targetSdkVersion 23
        versionCode 14
        versionName "1.0.6"
    }

请注意,在上述代码示例中,唯一的区别在于versionCode,以及旨在实现多样性的minSdkVersionpackage名称保持不变。各应用的清单和build.gradle文件可能在其他方面有所不同(例如,声明不同的功能或意图),但package名称应保持不变。相比之下,每个versionCode应使用唯一值。

(亚马逊应用商店不会执行逻辑检查以确保APK彼此之间存在足够差异。)

亚马逊对多个APK的支持方式与Google Play的不同之处

亚马逊上的多个APK有一个不同之处(与Google Play相比),那就是当您上传多个APK时,您需要在亚马逊应用商店中手动为各个APK选择支持的设备。

例如,假设多个APK与同一个设备兼容。亚马逊不会基于Google Play所用的相同逻辑(自动选择设备支持的最高API级别,或者通过较高的versionCode确定设备支持情况)自动选择支持的设备。

在亚马逊应用商店中,在您上传了第一个APK之后,您会看到根据筛选逻辑自动选择的支持设备。想要第二个APK支持不同设备,您必须从第一个APK中手动删除支持的设备。然后在上传第二个APK之后,您可以选择第二个APK要支持的设备。应用商店不会让您的多个APK支持同一个设备。(这个思路与Google Play相同,也就是每台设备一个APK,但是在亚马逊上选择过程是手动的。)

当设备不可用于第二个APK时

请注意,许多开发者经常对这一点感到疑惑。开发者上传第二个APK后发现所有设备不兼容,或者无法选择任何设备。这是因为他们已经为第一个APK选择了这些设备,因此需要在第一个APK中对这些设备取消选择,这样它们才能用于第二个APK。