设备筛选和兼容性
当提交Android应用到亚马逊应用商店时,应用清单和build.gradle
文件中的属性决定了应用可在哪些设备上安装。这些文件与设备功能之间的不兼容,会使得该设备不支持您的二进制文件。以下各节介绍了一些影响设备支持的筛选条件。还可以在开发者控制台中手动调整支持设备列表。
- 背景知识
- 与设备筛选相关的关键术语
- 由应用清单确定的设备兼容性
- Android移动设备上的支持
- Fire OS和Android API级别
- 跨API级别的向后和向前兼容性
- 不断变化的API级别
- 常见硬件和软件功能
- Fire TV设备筛选
- 网页应用的设备筛选
- 按网页浏览器应用筛选设备
- 按国家/地区筛选设备
- 指定应用的安装位置
- 从应用清单中删除uses-amzn-sdk
- 同一上架应用的多个APK
背景知识
由于亚马逊的Fire OS基于Android系统,亚马逊将尽可能与Android保持一致。因此,此处的文档不会重复Android文档中的信息,而是会介绍亚马逊和Fire OS的不同之处。为了更好地理解此处的概念,请参考Android文档中的以下基础主题:
与设备筛选相关的关键术语
以下是应用提交中用于设备筛选的常用术语。
有关更全面的词汇表,请参阅应用提交术语表。
由应用清单确定的设备兼容性
和标准Android实践一样,应用清单和build.gradle
文件中的属性决定了哪些设备与应用兼容。例如:
- 如果在应用清单中设置
minSdkVersion=4
和smallScreens=false
,则亚马逊应用商店会阻止应用安装到任何不支持这些要求的设备上。 - 如果清单中声明要求相机功能(
<uses-feature android:name="android.hardware.camera" />
),则不兼容任何没有相机功能的设备。客户如果使用不兼容的设备,就无法安装该应用。
亚马逊应用商店根据应用清单中的筛选条件,检查客户设备的硬件和软件要求,以及运营商、位置和其他特性。亚马逊还会检查应用元数据(在发布应用时选择)中指定的地理位置可用性要求。根据筛选规则,如果应用与设备兼容,则会向客户提供该应用。如果应用不兼容,则会在该客户设备的搜索结果和类别浏览中隐藏应用。
下表示出了筛选条件示例:
筛选类型 | 示例 |
---|---|
基于设备兼容性的筛选 | 如果在应用清单中声明应用需要GPS,亚马逊应用商店只向支持GPS的设备显示该应用。 |
基于应用可用性的筛选 | 如果在开发者控制台中声明您的应用只能在北美地区提供,则亚马逊应用商店不会向非北美地区的设备显示该应用。 |
有关支持的清单筛选条件的完整列表,请参阅亚马逊应用商店支持的清单筛选条件。
Android移动设备上的支持
除了支持亚马逊设备外,亚马逊应用商店还支持运行Android 5.0及更高版本的Android移动设备。清单和build.gradle
文件也决定了这些设备上的筛选逻辑和设备支持情况。运行Android 5.0以下版本的Android移动设备将无法访问亚马逊应用商店。
要在Android移动设备上安装亚马逊应用,客户可通过适用于Android的亚马逊应用商店应用安装。如果客户已经从亚马逊应用商店购买了应用,并且不想再从Google Play购买该应用,或者如果他们拥有从亚马逊购买的Amazon Coins或订阅,并希望在其他设备(如Android平板电脑)上的同一应用中使用,则客户可能会在Android移动设备上安装您的亚马逊应用。
targetSdkVersion指南
如果您的应用仅支持Android移动设备,则在应用中设置targetSdkVersion
时,请遵循AOSP指南。要通过亚马逊应用商店覆盖Android 15设备,请在应用清单或build.gradle文件中将targetSdkVersion
设置为24或更高。如果您没有将targetSdkVersion
至少设置为24,则您的应用将无法在适用于Android 15设备的亚马逊应用商店上使用。
如果您的应用支持Android移动设备和Fire设备,请遵循targetSdkVersion的最低API级别中针对Fire OS设备的指南。要覆盖更广泛的Android移动设备和Fire OS设备,请将targetSdkVersion
设置为高于30,并将minSdkVersion
设置为应用可支持的最低API级别。
targetSdkVersion
以匹配最新的API级别,并在该API级别上彻底测试您的应用。Fire OS和Android API级别
Fire设备使用Fire OS作为操作系统。由于Fire OS是定制版Android,因此每个Fire OS版本对应一个Android API级别。在您的应用清单中,android:minSdkVersion
属性指示您想要支持的Fire设备的最低API级别。确保在minSdkVersion
属性中为应用指定正确的Android API级别。例如,要支持所有2013年及之后的平板电脑,清单应该包含如下条目:
<uses-sdk android:minSdkVersion="17" />
您还可以设置android:targetSdkVersion
属性,该属性具有与minSdkVersion
不同的功能。设置targetSdkVersion
可确保当您的应用在符合指定API级别的设备上运行时,它可以访问该API级别中提供的可用增强功能。由于较新API级别引入增强的安全性和性能,Android对targetSdkVersion
强制实施最低API级别要求。要了解有关Android的targetSdkVersion
最低要求的更多信息,请参阅Android文档。
targetSdkVersion
,则该值默认为您在minSdkVersion
中设置的值。如果您不设置minSdkVersion
,则表明您的应用支持所有Android API级别。和Android设备一样,并非所有Fire设备都具有相同的API级别。有关不同Fire设备上的具体API级别,请参阅以下内容:
targetSdkVersion的最低API级别
由于Android提出的要求,亚马逊将于2022年4月1日起在Fire OS 6和7上开始对targetSdkVersion
强制实施以下Android API级别要求:
targetSdkVersion
的最低API级别,而不是minSdkVersion
的最低API级别。通过将minSdkVersion
设置为所需的API级别,您仍然可以支持较旧的设备。Fire OS版本 | targetSdkVersion的最低API级别 |
---|---|
Fire OS 6 | 25 |
Fire OS 7 | 28 |
Fire OS 8 | 30 |
自2022年4月1日起,如果应用没有达到targetSdkVersion
所需的最低API级别,您就无法提交此类新应用或更新此类现有应用。所有已向亚马逊应用商店提交的现有应用都将继续正常运行,并可供您的客户使用。
请参阅Fire OS文档,以了解有关如何设置最低API级别的更多信息:
- Fire平板电脑上的Fire OS 6
- 适用于Fire平板电脑的Fire OS 7
- 适用于Fire平板电脑的Fire OS 8
- 适用于Fire TV的Fire OS 6
- 适用于Fire TV的Fire OS 7
- 适用于Fire TV的Fire OS 8
跨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。
如果应用二进制文件与多个版本的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"
)。由于隐含功能是必需的,应用二进制文件无法与任何不提供这些功能的设备兼容,即使该应用被设计成可在功能不存在时优雅降级。
为了更好地理解隐含功能,请考虑以下场景。您的应用使用设备的当前位置来查找附近的加油站。该应用可以从设备的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" />
如果随后向亚马逊应用商店提供此二进制文件,则只有配备内置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" />
有关会导致隐含功能的完整权限列表,请参阅隐含功能请求的权限。
仅支持64位应用的设备
一些设备不再支持32位应用,包括亚马逊应用商店目前提供的任何32位应用。尝试在这类设备上下载32位应用的客户现在将收到通知,提醒他们该应用不符合系统要求。
要让使用这些设备的客户可以使用您的应用,请为您的应用添加64位 (arm64-v8a) 支持,并使用亚马逊开发者控制台提交更新。在构建应用时,请不要去除对32位(armeabi-v7a)的支持,因为这可能会影响当前的亚马逊设备选择。
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设备设计的二进制文件时,仍然必须在开发者控制台中手动选择二进制文件与哪些设备兼容。有关详细信息,请参阅支持的设备。
网页应用的设备筛选
虽然基于Android清单的设备筛选不可用于网页应用,但在提交过程中,仍可通过复选框列表来控制支持的设备。对于网页应用,即使您提交网站的URL或上传带有网页文件的zip压缩包,亚马逊应用商店也会将网页应用拿出来,并使用Cordova包装器生成Android应用。此Cordova打包应用就是用户下载并安装在他们设备上的Android应用。
网页应用采用基础的Android API,因而与所有设备都能兼容—WebView有一个加载网页文件或URL的活动,且API级别设置为10,以获得尽可能广泛的兼容性。
按网页浏览器应用筛选设备
为了隐私和安全,亚马逊禁止在Fire平板电脑和Fire TV上使用第三方浏览器。请在应用提交流程中验证目标设备。在个别情况下,如果第三方浏览器应用达到了我们的隐私和安全要求,我们可能会允许这些应用。如果您想了解更多信息,请通过联系我们表单与我们联系,然后选择应用商店类别,并选择内容政策测试结果主题。
按国家/地区筛选设备
在提交过程中,您在步骤2: 确定您应用的支持目标,有助于确定应用可以支持哪些设备。并非所有亚马逊设备均在所有国家/地区提供。如果某款Fire TV或Fire平板电脑在您支持的任何国家或地区不可用,则在提交过程中,该款设备会被筛选出去,归为不受支持的设备。
指定应用的安装位置
Android清单文件指定了应用在Fire设备上的安装位置。对于大多数应用,将此值设置为“外部存储”(preferExternal
)可以为应用用户提供更好的体验,因为这会减少客户由于设备的内部存储已满而无法安装应用的情况。有关更多信息,请参阅指定应用的安装位置。
从应用清单中删除uses-amzn-sdk
如果应用清单中包含<uses-amzn-sdk>
标签,请移除该标签。此标签与旧的Fire OS SDK附加程序相关,不再用于Fire TV上的应用。
虽然即使在清单中保留此标签,您的应用(通常)仍能正常运行,但删除标签可以避免以后出现任何不兼容情况。为Fire设备开发应用时,无需使用旧的Fire OS SDK附加程序的任何组件。而应使用标准Android API和Amazon 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
。) 版本代码是您选择的单个整数,例如1
或1254
。versionCode
(以及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
,以及旨在实现多样性的minSdkVersion
。package
名称保持不变。各应用的清单和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。
Last updated: 2024年9月13日