设备筛选和兼容性


设备筛选和兼容性

在您将APK提交到应用商店时,应用程序清单中的属性确定您的应用程序可以安装到什么设备上。您的清单与设备功能之间的不兼容会使得APK文件在该设备上不受支持。以下各节介绍一些影响设备支持的筛选条件。您也可以手动编辑应用程序支持的设备。

背景知识

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

这也有助于理解一些常见术语。

有关更多词汇表定义,请参阅应用程序提交术语表

设备兼容性由APK清单确定

就如标准安卓实践一样,APK的清单和build.gradle文件中的属性确定哪些设备与应用程序兼容。例如:

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

亚马逊应用商店使用APK清单中的筛选条件,检查客户设备的硬件和软件要求,以及运营商、位置和其他特性。亚马逊还会检查应用程序元数据中指定的地理位置可用性要求(在发布应用程序时选择)。

如果根据筛选规则您的应用程序与设备兼容,则会向客户提供该应用程序。如果应用程序不兼容,则会在该客户设备的搜索结果和类别浏览中隐藏您的应用程序。

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

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

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

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

亚马逊和安卓API级别

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

有关各种亚马逊Fire设备的安卓和亚马逊API级别,请参阅平板电脑规格Fire TV规格。例如,要定向到所有2013年及更新的平板电脑,您的清单应该包括类似于以下的条目:

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

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

请注意以下事项:

  • 设备的安卓API级别随着部署的Fire OS更新会发生变化。例如,2014年Fire平板电脑运行Fire OS 4.5,安卓API级别为19。当这些设备更新到Fire OS 5.0(通过无线方式,也就是“OTA”更新过程)时,安卓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的规范。

隐含功能

许多开发者会在隐含功能上犯错误。根据安卓<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,则将只兼容Fire平板电脑的WAN型号,因为只有这些型号的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的设备支持

网页应用程序的设备筛选

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

网页应用程序与所有设备兼容,因为对于安卓API,它们是非常基本的,其中只有一个WebView活动,用于加载Web文件或URL,并且API级别设置为10以获得尽可能最广泛的兼容性。

指定应用程序的安装位置

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

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

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

虽然您的应用程序在清单中有此标签时(通常)仍能工作,不过删除它可以避免以后出现任何不兼容情况。开发Fire设备的应用程序时无需旧Fire OS开发工具包附加程序的任何组件。而是使用标准安卓API亚马逊应用程序和游戏服务开发工具包

上传APK

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

同一个应用程序列表的多个APK

虽然您可以在一个APK中支持不同的设备(例如,通过在运行时检查权限并在设备不支持功能时按正常方式降级),不过为同一个应用程序列表构建多个APK可能会更加轻松。每个APK可以适应不同设备的不同软件或硬件功能及组件。

多个APK可以适应的设备差异包括API级别、OpenGL压缩格式、CPU、屏幕尺寸和分辨率、设备功能,甚至可能是其他因素,例如地理区域设置。例如,您可能希望一个APK用于Fire平板电脑,一个单独的APK用于Fire TV,另一个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的versionCode增加为11,已经安装了Eggs的客户不会接收更新,因为Eggs具有较高的versionCode。因此,您需要在提交更新之前将versionCode设置为21或更高。

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

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

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

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

多个APK的versionCode示例

现在我们浏览具有多个APK的程序包名称和versionCode的示例。假设对于同一个应用程序,您在构建单独的APK,一个APK用于Fire平板电脑,一个APK用于Amazon 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"
        ...
    }

请注意,唯一的区别在于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可用。