开发人员控制台

设备筛选和兼容性


设备筛选和兼容性

当提交APK文件到应用商店时,应用清单中的属性决定您的应用可以安装到什么设备上。清单与设备功能之间的不兼容,会使得该设备不支持提交的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的设备显示该应用。
基于应用可用性的筛选 如果您在开发者门户中声明您的应用只能在北美地区提供,则亚马逊应用商店不会向非北美地区的设备显示该应用。

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

除了支持亚马逊设备之外,亚马逊应用商店还可以按照相同的筛选逻辑,向非亚马逊设备提供您的应用。通过Android应用的亚马逊应用商店,客户可以将应用安装到其Android设备上。(如果客户从亚马逊应用商店已购买了某个应用,且不希望从Google Play再次购买,或者如果客户拥有从亚马逊购买的虚拟货币或订阅,并且想要在其他设备上的同一应用中使用它们,那么这一点可能很重要。)

亚马逊和Android API级别

Fire设备使用Fire OS作为操作系统。由于Fire OS是Android的自定义版本,每个Fire OS版本对应一个单独的Android API级别。因此,创建应用清单的第一步是在android:minSdkVersion属性中为所要定向的Fire设备指定正确的Android API级别。

有关各种亚马逊Fire设备的Android和亚马逊API级别,请参阅平板电脑设备规格Fire TV设备规格。例如,要定向到所有2013年及之后的平板电脑,您的清单应该包含如下条目:

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

就如Android设备一样,并非所有Fire设备都具有相同的API级别。例如,一些Fire TV运行在基于Android API级别25的Fire OS 6上。其他一些设备运行在基于API级别22的Fire OS 5上。Fire平板电脑甚至具有更多不同的API级别。有关Fire OS版本和功能的详细信息,请参阅以下主题。

请注意以下事项:

  • 设备的Android API级别随着部署的Fire OS更新而变。例如,2014年的Fire平板电脑运行Fire OS 4.5,Android API级别为19。当这些设备运行的系统通过无线方式(OTA)更新到Fire OS 5.0时,Android API级别将更新为22。如果您的APK与Fire OS的两个版本均兼容(多数情况下如此),在清单的<uses-sdk>元素中,将您的minSdkVersion设置为设备支持的最低API级别,以确保与设备的最大兼容性。(如果将minSdkVersion设置为22,则仅支持级别19及更低级别的设备将不兼容。)
  • 亚马逊应用商店还支持android:maxSdkVersion属性,但该属性仅用于确定应用是否在特定设备上可用。当用户将其Fire OS更新为更高版本时,无任何影响。大多数情况下,除非更高的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,则只兼容WAN型号的Fire平板电脑,因为只有这些型号的Fire设备才具备GPS功能。要兼容其他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" />

为什么是这个属性? Fire TV不支持触摸屏和多点触控功能,但手机和平板电脑支持。

上传为Fire TV设计的APK时,您仍可手动调整APK所兼容的设备。有关详细信息,请参阅调整APK的设备支持

网页应用的设备筛选

虽然基于Android清单的设备筛选不可用于网页应用,但在提交过程中,您仍可以通过复选框列表来控制支持的设备。对于网页应用,即使您向网站提交URL或包含web文件的ZIP包,在提交过程中,亚马逊应用商店仍然会获取网页应用并使用Corodva引擎生成Android应用。最后,它是一款可在用户设备上下载和安装的Android应用。

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

指定应用的安装位置

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

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

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

尽管您的应用在清单中存在此标签时(通常)仍能工作,但删除它将避免将来出现任何不兼容。开发Fire设备的应用时,无需使用旧的Fire OS开发工具包附加程序的任何组件。不过,请使用标准Android API亚马逊应用和游戏服务开发工具包

上传APK

有关将您的APK上传到亚马逊应用商店的具体详情,请按照步骤7,选项1操作: 上传APK文件

同一个应用的多个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必须使用相同的程序包名称。有关详细信息,请参阅程序包

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

造成APK失败的一个常见原因是不同应用程序包名称重复(并非因为针对同一应用列表上传了多个APK)。不同的应用必须具有不同的程序包名称。但是,如果您的同一个应用具有多个APK,则每个APK必须使用相同的程序包名称。此外,当您提交APK的新版本时,程序包名称必须保持不变。

多个APK的versionCode示例

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

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

APK的build.gradle文件可能如下:

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

第二个APK的清单可能如下:

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

应用的build.gradle文件可能如下:

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

请注意,这两个APK的唯一区别在于versionCode,在某些情况下,区别还包括minSdkVersion。程序包名称保持不变。各应用的清单和build.gradle文件可能在其他方面有所不同(例如,声明不同的功能或意图),但程序包名称应保持不变,而每个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。