针对运行 Fire OS 6 的 Amazon Fire TV 设备进行开发 (Amazon Fire TV)


针对运行 Fire OS 6 的 Amazon Fire TV 设备进行开发 (Amazon Fire TV)

运行 Fire OS 6 的 Amazon Fire TV 设备基于 Android Nougat。您可以按照此处的指南确保您的应用在 Fire OS 6 上的兼容性。

运行 Fire OS 6 与 Fire OS 5 的设备

大多数 2018 Fire TV 设备(Fire TV Stick 4K、Fire TV Edition Insignia 和 Toshiba、Fire TV Cube 等)运行 Fire OS 6。然而,以前的 Fire TV 设备(Fire TV Stick(第 1 代和第 2 代)、Fire TV(第 1 代和第 2 代)和 Fire TV Edition)仍然采用 Fire OS 5(该版本基于 Lollipop 或 Android 5.1 22 级,和一些向后移植的 Marshmallow)。以前的 Fire TV 设备不会升级到 Fire OS 6。

有关 Fire TV 设备和版本的详细列表,请参阅 Fire OS 版本

Android Nougat 的行为变化和新功能

Android Nougat 与 Lollipop 和 Marshmallow 相比有一些变化,您需要在 Fire OS 6 设备上的应用中考虑到这些变化。您可以在 Android 7.0 更改Android 6.0 更改中阅读有关这些更改的信息。一些显著的变化包括在运行时检查权限和链接到专用库。

在运行时检查权限

与往常一样,您的应用所需的正常和危险权限需要在应用的清单声明(通过 uses-featureuses-permission 元素)。但是,对于 API 级别 23 及更高级别的设备,需要根据安卓的指南在运行时检查权限;请参阅使用系统权限,特别是在运行时请求权限

在运行时检查权限是 Marshmallow(API 级别 23)中引入的一项功能,以简化安装和更新过程,并为用户提供对应用的更多控制力。请注意,由于存在运行时权限,用户将能够在出现提示时撤销单个权限。您必须处理用户撤销权限的情景。

此外,如果您有一个面向多种设备(Fire 平板电脑和 Amazon Fire TV 设备)的单个二进制文件,请避免在清单中为这些设备上不存在的功能请求权限(例如,在 Fire TV 应用上请求陀螺仪权限)。有关更多详细信息,请参阅处理不受支持的硬件功能

链接到专用库

Android Nougat 不允许应用动态链接到非 NDK 或专用库。您的应用必须在 APK 中包含任何必需的库,或者您必须改用公共 NDK API。有关更多详细信息,请参阅直接从 APK 打开共享库专用 API(对 API 级别 >= 24 强制执行)

Fire OS 6 的 Nougat 奇偶校验

Fire OS 6 支持 Android Nougat 中的所有功能。Fire OS 6 支持的 Nougat 电视特定的功能包括以下这些:

  • 画中画 (PiP): 允许用户在导航到应用中的其他区域时将视频固定到屏幕的一角。请注意,PIP 窗口不能在应用外部使用,也不能叠加原生 Fire OS 用户界面元素。
  • 内容录制: 允许用户录制电视上的内容,类似于 DVR。
  • 时移 API: 允许用户暂停、倒回或快进直播内容。

有关这些功能的编码的详细信息和说明,请参阅安卓文档。

请记住,虽然 Fire OS 6 具有 Nougat 奇偶校验,但您无法在 Amazon Fire 设备上使用 Google 服务。相反,您必须对您所需的服务(例如应用内购买)使用应用和游戏服务软件开发工具包。有关更多详细信息,请参阅 Amazon Fire TV 开发与 Android TV 开发

让您的应用面向 Fire OS 5 和 Fire OS 6 设备

为了最大限度地提高与 Fire OS 5 和 Fire OS 6 功能的兼容性,您需要相应地确定目标设备。您可以使用 AFTN 作为 Build.Model 来标识 Fire TV 第 3 代设备。但是,确定目标 SDK 级别会更有效。在您的代码中,您可以检查 Build.VERSION.SDK_INT 是否大于等于 25(Nougat 的 API 级别),以针对 Fire OS 6 设备。有关更多详细信息,请参阅识别 Fire TV 设备。另请参阅支持不同平台版本

在新的 Amazon Fire TV 设备上测试应用的兼容性

目前,无法测试您的应用与 Fire OS 6 设备的兼容性,除非您有实际的设备要连接。应用测试服务仅提供极少的兼容性测试,不会告诉您您的应用是否与 Fire OS 6 设备兼容。但是,如果您通过标准应用提交流程提交应用,应用商店团队将指出应用失败的任何具体原因。目前,与当前 Amazon Fire TV 设备兼容的应用也与新设备兼容。

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

对于 Fire OS 5 和 Fire OS 6 设备,您应该从应用清单中删除的一个标签是 <uses-amzn-sdk>。此标签与旧的 Fire OS 开发工具包附加程序相关。检查您是否在 AndroidManifest.xml 文件中声明了 <uses-amzn-sdk>。如果是这样,请删除此标签(以及代码中对它的任何依赖项)。该 <uses-amzn-sdk> 标签不再用于 Amazon Fire TV 上的应用。

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

使用较旧版本的 Unity 开发的游戏应用

如果您有一个游戏应用是使用较旧版本的 Unity 开发的(例如 Unity 4.5 或 4.6,其中 UnityPlayerNativeActivity 为默认活动),则在游戏第一次加载到内存中时,您的游戏可能会有 1-2 秒的空白屏幕。这个问题是由于在应用加载到内存(并等待所有工作完成)时 Android N 冷启动导致的。此问题发生在所有 Nougat 设备上,并不特定于 Fire OS 6。

要修复此问题,请升级到最新版本的 Unity。如果升级不可行,您可以尝试通过将 UnityPlayerNativeActivity 更改为 UnityPlayerActivity(从 Unity 5.0b12 开始提供)来尝试更新您的安卓清单文件。有关更多信息,请参阅 Unity 文档中的安卓清单

节省资源和内存的媒体播放最佳实践

Amazon Fire TV(第 3 代)上的某些应用因无法正确处理媒体播放而失败。(这与 Fire OS 6 无关,但对于亚马逊和谷歌应用来说,这是最佳实践。) 由于 Amazon Fire TV 中的媒体播放资源基于硬件且受内存限制,因此您的应用必须运行良好,并在使用完媒体资源时释放媒体资源。

具体而言,播放视频的应用应该暂停播放,并且必须立即释放所有媒体资源,例如 onPause() 方法中的解码器。有关详细信息,请参阅释放媒体播放器MediaPlayer.release()

如果您的应用通过 Android WebView(带有 <video> HTML 标签)播放视频,则当您的应用暂停或停止时,系统当前不会释放硬件媒体资源。要变通解决此问题,请在实现 onPause()onStop() 方法时通过终止进程来显式释放这些资源:

public void onStop() {
   super.onStop();
   android.os.Process.killProcess(android.os.Process.myPid());
}

有关更多详细信息,请参阅以下内容:

要为 minSdkVersion 和 targetSdkVersion 设置的内容

一般来说,应将您的 minSdkVersion 设置为 22 或更低版本(将其设置为您的应用需要的最低 API 级别)。这将使您的应用可供所有 Amazon Fire TV 设备(运行 Fire OS 5 和 6)使用。将 targetSdkVersion 设置为您测试应用时所用的最高 API 级别。

以下是关于这些设置的更多背景。在应用清单(或 build.gradle 文件)中,minSdkVersion 属性设置了应用正常运行所需的最低 SDK 级别。(不支持该 API 级别的设备不应允许在不受支持的设备上安装应用。)

Fire OS 5 设备基于 API 级别 22 (Lollipop 5.1)。Fire OS 6 设备基于 API 级别 25 (Nougat 7.1)。通过将 minSdkVersion 设置为 22,您指示您的应用要求设备至少具有 API 级别 22 才能正常运行。

minSdkVersion 设置为 22 时,您的应用还将安装在具有更高 API 级别(例如 25)的任何设备上,因为安卓级别是向后兼容的。API 级别 25 通常包含级别 1 到级别 25 的所有 API(每个版本都添加到上一个版本中)。

但是,假设您想利用 Nougat 中的 API(API 级别 25)。如果您将 minSdkVersion 设置为 22,则您的应用将安装在没有 API 级别 25 的 Fire OS 5 设备上。因此,您必须以防御方式编码来检查设备级别,如果设备不支持该 API 级别,则回退到替代方案。您的代码可能如下所示:

if (Build.VERSION.SDK_INT >= 25) {
 Log.v(TAG, "Yes, this is an API level 25 or higher device");
} else {
 Log.v(TAG, "No, this is not an API level 25 or higher device");
}

此代码检查设备的 API 级别是否大于或等于 25,如果是,则运行代码。如果没有,它会回退到 else 逻辑。

默认情况下,如果未指定 targetSdkVersion,它将使用与 minSdkVersion 相同的值。targetSdkVersion 允许您设置已针对应用测试的最新 API 级别。基于此值,安卓将确保此级别的设备上的正确行为。

例如,如果您将 targetSdkVersion 设置为 23 或更高版本(Marshmallow 的版本),安卓将应用 Marshmallow 中包含的运行时权限检查功能。但是,如果 targetSdkVersion 低于 23(在 Marshmallow 中推出运行时权限检查之前),安卓不会将此行为应用于您的应用。

在将 targetSdkVersion 设置为 25 之前,您应该在 Fire OS 6 设备上测试您的应用。

不推荐使用 maxSdkVersion 属性,但是如果您想让您的应用在 Fire OS 5 设备上可用,则可以将 maxSdkVersion 设置为 22。如果您想让您的应用 在 Fire OS 6 设备上可用,您可以将 minSdkVersion 设置为 25。

有关更多信息,请参阅以下内容:

自定义媒体播放器的 AV 同步问题

AV 同步是指视频与音频不完全同步(声音与口形不匹配)。如果您使用的是 ExoPlayer 或标准的安卓媒体播放器,则不会遇到 AV 同步问题。但是,如果您在应用中使用自定义媒体播放器,音频和视频 (AV) 可能会稍微不同步。(此问题不与 Fire OS 6 明确相关,而是为 Fire OS 设备开发应用时的一般最佳实践。) 有关如何消除 AV 同步问题的详细信息,请参阅 [音频和视频同步][fire-tv/audio-video-synchronization]。

支持

如果您在 Fire OS 6 上注意到您的应用存在任何问题,请在 Amazon Fire TV 和 Fire TV Stick 论坛中记下此问题。