Fire平板电脑上的Fire OS 8
Fire OS 8引入了Android 10 (API 29) 和Android 11 (API 30) 的更新。在为Fire OS 8构建应用时,应该对这方面的重要变更予以考虑,下面介绍了其中一些变更。
- 运行Fire OS 8和之前Fire OS版本的设备
- Android 10更新
- Android 11更新
- Fire OS 8与Android 11同等
- 让应用以Fire OS 8设备为目标
- 在Fire OS 8设备上测试应用的兼容性
- minSdkVersion和targetSdkVersion的设置
- minSdkVersion对支持的设备有何影响
- 应用的指纹身份验证用户界面
- Fire平板电脑自动备份
- 唤醒锁更改
- 支持
运行Fire OS 8和之前Fire OS版本的设备
Fire OS 8包含了Android 10 (API 29) 和Android 11 (API 30) 的更新。部分较早版本的Fire平板电脑设备仍然搭载较早版本的Fire OS。
有关Fire平板电脑设备和版本的详细列表,请参阅平板电脑设备规格。
Android 10更新
以下是Android 10开发者应该了解的重要功能列表。有关更多详细信息,请参阅Android 10功能和API。
默认启用了TLS 1.3支持
Fire OS 8增加了对TLS 1.3的支持,默认情况下,它对所有TLS连接都启用。我们建议更新应用以支持TLS 1.3。如果需要使用较旧的TLS协议,可以通过以下调用来获得禁用了TLS 1.3的SSLContext
:
SSLContext.getInstance("TLSv1.2")
在应用内引用设置面板
Android 10中引入了设置面板,这是一种API,允许应用在其上下文中向用户显示设置。
Fire OS 8添加了设置面板API,允许直接在应用的上下文中显示关键系统设置,让用户无需离开应用就能访问多项系统设置,包括音量、互联网连接选项和WiFi控件等。
设置面板
可采用以下常量:
ACTION_INTERNET_CONNECTIVITY
显示与互联网连接相关的设置,例如飞行模式和WiFi。ACTION_WIFI
显示Wi-Fi设置的控件。这对于需要Wi-Fi连接来执行大规模上传或下载的应用非常有用。ACTION_VOLUME
显示所有音量流的设置。
共享方面的改进
Fire OS 8在共享方面有几项改进:
- Fire OS 8引入了对共享快捷方式API的支持,此类API允许应用提前发布直接共享目标。如果应用使用直接共享API来定义目标,则需要迁移到共享快捷方式API,因为API 30已弃用
ChooserTargetService
类。使用AndroidX库中提供的ShortcutManagerCompat
类将共享快捷方式API加入进来,并实施ChooserTargetServiceCompat
以确保向后兼容。 - 仅可将动态快捷方式发布为直接共享目标。请参阅发布直接共享目标。
用于访问位置的前台服务类型
如果应用以Fire OS 8(API级别29)或更高版本为目标,并且会访问前台服务中的位置信息,请将location
前台服务类型声明为<service>
组件的属性。
<manifest>
... <service ... *android:foregroundServiceType="location"* /></manifest>
前台服务类型 | 应声明此类型的服务的示例用例 |
---|---|
dataSync |
从网络下载文件 |
location |
继续用户发起的操作 |
mediaPlayback |
播放音频书籍、播客或音乐 |
mediaProjection |
在短时间内录制设备显示画面的视频 |
您应当将foregroundServiceType
添加至库清单。
在后台访问设备位置
以API 29或更高版本为目标的应用在后台无法访问位置信息。要在应用位于后台时接收位置信息,必须在应用清单中声明ACCESS_BACKGROUND_LOCATION权限。
<manifest ... >
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
对于从后台启动活动的限制
从Android 10开始,系统对于从后台启动活动加以限制。这种行为改变有助于最大限度减少对用户的干扰,并让用户对其屏幕上显示的内容保持更大控制权。只要应用将用户交互作为启动活动的直接原因,就很可能不会受到这些限制的影响。
高效率图像文件(HEIF)格式
Fire OS 8平板电脑现已提供对HEIF图像格式的原生支持。如果您的应用使用静态图像,请考虑添加对HEIF格式的支持。与JPEG文件格式相比,它可以提供更好的图像质量和更小的文件大小。
深色主题
Android 10增加了一个系统范围的深色主题。您可以为应用构建自定义深色主题,也可选择加入全新Force Dark功能,让系统根据现有主题动态创建深色版本。
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
有关更多详细信息,请参阅Android 10功能和API。
Android 11更新
现在需要APK签名方案v2
以Fire OS 8 (API 30)为目标的应用当前仅使用APK签名方案v1进行签名,现在还必须使用APK签名方案v2对APK进行签名。在仅使用APK签名方案v1签名的Fire OS 8设备上,用户将无法安装或更新应用。为确保支持在较旧Fire OS版本上运行的设备,应该先使用v1,然后使用v2或更高版本对APK进行签名。
可以通过apksigner
检查您在APK上使用的签名版本。
apksigner verify -v <apkname.apk>
单次授权
从Fire OS 8(以API 30为目标)开始,每当应用请求与位置、麦克风或相机相关的权限时,面向用户的权限对话框都包含一个称为“单次授权”的选项。如果用户在对话框中选择此选项,则会对应用授予临时权限。请遵循运行时检查和请求权限的最佳实践,以确保您拥有必要的权限。
程序包可见性
默认情况下,以Fire OS 8(API级别30)为目标的应用会看到过滤后的已安装应用列表。要想访问更广泛的已安装应用列表,应用可以指定其需要查询和直接与之交互的应用的信息。这可以通过在Android清单中添加一个<queries>
元素来实现。
<manifest package="com.yourapp.name">
…
<queries>
// 如果知道需要与之交互的应用程序包名称
<package android:name="com.anotherapp.firstapp" />
<package android:name="com.someapp.secondapp" />
// 如果要查询具有特定意图的所有应用
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
…
</manifest>
用于访问相机和麦克风的前台服务
如果应用的目标API级别为30或更高,并且会访问前台服务中的相机或麦克风,请分别声明camera
或microphone
前台服务类型,作为<service>
组件的属性。
<manifest>
...
<service ...
android:foregroundServiceType="camera|microphone" />
</manifest>
压缩资源文件
如果包含压缩resources.arsc
文件,或者如果此文件未在4字节边界上对齐,则无法安装以Android 11(API级别30)或更高版本为目标的应用。请检查压缩对齐日志,确保在出现错误时未压缩resources.arsc
文件。
Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary]
动态意图过滤器
现在,要接收意图,应用必须声明可以通过应用清单中的意图过滤器接收哪些数据类型。这些称为MIME组,是Android 11中引入的清单元素。要使用MIME组,请在应用清单中包含一个具有android:mimeGroup
属性的数据元素。
阻止来自后台的自定义toast
现已阻止包含从后台发送的自定义视图的toast。但是,在使用Toast.makeText()而非已弃用的setView()时,仍然允许文本toast。
Fire OS 8与Android 11对等
Fire OS 8实现的所有功能都与Android 11的功能对等,这并不意味着Android 11的所有功能在Fire OS 8中都可用。部分Fire OS 8设备尚不支持Android 11的部分功能。
另请记住,虽然Fire OS 8与Android 11对等,但在亚马逊Fire设备上无法使用Google服务。必须使用相应的应用和游戏服务开发工具包,才能实现所需的服务(如应用内购买)。
让应用以Fire OS 8设备为目标
用户可能会在Fire OS 5、Fire OS 6、Fire OS 7或Fire OS 8设备上运行应用。为了最大限度提高应用与设备上Fire OS版本的兼容性,建议根据SDK级别确定目标设备。
在代码中,可检查Build.VERSION.SDK_INT
是否大于等于30(Android 11 API级别),以便将Fire OS 8设备作为目标。
另请参阅Android文档中的支持不同平台版本。
在Fire OS 8设备上测试应用的兼容性
可通过连接到实际设备,测试应用与Fire OS 8的兼容性。
minSdkVersion和targetSdkVersion的设置
将minSdkVersion
设置为适用Fire OS版本所需的最低API级别。
Fire OS版本 | minSdkVersion |
---|---|
Fire OS 5 | 22 |
Fire OS 7 | 28 |
Fire OS 8 | 30 |
将targetSdkVersion
设置为支持的最高API级别。
请参阅设备筛选和兼容性,以了解有关最低API级别要求的更多信息。
minSdkVersion对支持的设备有何影响
在应用清单(或build.gradle
文件)中,minSdkVersion
属性设置了应用正常运行所需的最低SDK级别。(不支持该API级别的设备将不允许在该设备上安装应用 — 这是应用商店设备筛选和兼容性的工作方式。)
Fire OS 5设备基于API级别22 (Lollipop 5.1)。Fire OS 8设备基于API级别30 (Android 11)。将minSdkVersion
设置为22,即表示应用要求设备至少具有API级别22才能正常运行。
将minSdkVersion
设置为22时,还可在具有更高API级别(例如30)的设备中安装您的应用,因为Android级别向后兼容。API级别30通常包含级别1到级别30的所有API(每个版本均在上一个版本的基础上添加)。
但假设您想利用Android 11中的API(API级别30)。若将minSdkVersion
设置为22,则可以在没有API级别30的Fire OS 5设备中安装您的应用。因此,必须以防御性方式进行编程,检查设备级别,若设备不支持该API级别,则回退到替代方案。代码可能如下所示:
if (Build.VERSION.SDK_INT >= 30) {
Log.v(TAG, "是,这台设备具备API级别30或更高版本");
} else {
Log.v(TAG, "不是,这台设备不具备API级别30或更高版本");
}
此代码检查设备的API级别是否大于或等于30,如果是,则运行代码。如果不是,则回退到else
逻辑。
默认情况下,若未指定targetSdkVersion
,将使用与minSdkVersion
相同的值。targetSdkVersion
允许您设置应用测试所依据的最新API级别。基于该值,Android将确保此级别设备的性能正常。
例如,若将targetSdkVersion
设置为25或更高版本(Nougat的版本),Android将应用Nougat中包含的运行时权限检查功能。但如果targetSdkVersion
低于25(在Nougat中推出运行时权限检查之前),则Android不会在您的应用中应用此行为。
尽管不建议采取这一做法,但如果需要防止较早版本的应用出现在Fire OS 8设备上,可以将maxSdkVersion
设置为Fire OS 7 (28)。
有关更多信息,请参阅以下内容:
应用的指纹身份验证用户界面
使用您的指纹进行身份验证
要使用指纹进行身份验证,请在构建生物特征识别提示时设置一个否定按钮。
BiometricPrompt.PromptInfo.Builder promptInfo = dialogMetric();
promptInfo.setNegativeButtonText("Cancel");
biometricPrompt.authenticate(promptInfo.build());
支持指纹和PIN的应用
对于有选项供输入设备PIN的指纹身份验证,请删除否定按钮,并在构建生物特征识别提示时将setDeviceCredentialAllowed
设置为true
。
BiometricPrompt.PromptInfo.Builder promptInfo = dialogMetric();
promptInfo.setDeviceCredentialAllowed(true);
biometricPrompt.authenticate(promptInfo.build());
用户界面应当和以下所示类似:
有关更多信息,请参阅Android开发者文档。
Fire平板电脑自动备份
从2023年5月31日开始,亚马逊Fire平板电脑将为选择在平板电脑上进行备份和恢复的用户启用自动备份。如果您的应用以API 23或更高级别为目标平台,并且未在清单中明确禁用自动备份,则您的应用将自动参与。尽管自动备份的默认值为true
,但我们建议在清单中显式设置该属性。
自动备份详情
- 不再需要为键/值备份方法编写自定义备份和恢复逻辑,但该方法仍然受支持。
- 此功能在Fire OS 7及更高版本上可用,适用于以(
targetSdkVersion
) API 23或更高版本为目标的应用。 - 应用数据将免费自动备份到AWS S3。
- 除应用缓存外,会自动备份所有数据文件,包括数据库、共享首选项和应用专用目录中的其他内容,除非另有指定。
- 对于客户而言,每个设备的每个应用限制为25 MB。如果超过限制,将不会备份应用数据,但在限制范围内的旧备份仍将可用于恢复。
- 确保备份的数据不包括任何最终用户的敏感数据,例如,1996年《健康保险携带和责任法案》(HIPAA)定义的“受保护的健康信息”,或联邦贸易委员会《健康泄露通知规则》定义的“PHR可识别健康信息”。出于安全原因,您还应该在备份中排除密码令牌或凭证。
有关更多信息,请参阅Android自动备份功能文档。
备份您的应用
对于自动备份,您的应用若以API 23或更高版本为目标,并在Fire OS 7或更高版本上运行,将自动进行备份。您不需要实现BackupAgent
。自动备份(android:allowBackup
)的默认值为true
,但我们建议您在清单中显式设置布尔值,如下所示:
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
默认情况下,将备份应用数据目录中的所有文件(缓存文件除外)。
备份数据子集
Android允许应用开发者通过修改XML文件架构来自定义他们想要备份的文件。您可以使用此文件中的模式来选择要包含或排除的文件。确保备份的数据不包括任何最终用户的敏感数据,例如,1996年《健康保险携带和责任法案》(HIPAA)定义的“受保护的健康信息”,或联邦贸易委员会《健康泄露通知规则》定义的“PHR可识别健康信息”。出于安全原因,您还应该在备份中排除密码令牌或凭证。如果存在任何加密的数据文件,例如共享的首选项,则在将这些文件传输到新设备后它们可能无法工作。最好也将这类文件排除。
如果您的应用需要对备份的数据进行更精细的控制,或者您需要侦听onRestoreFinished()
或onQuotaExceeded()
等备份事件,请考虑实现备份代理。
禁用自动备份
如果您选择禁用自动备份,您可以在应用的清单文件中将android:allowBackup
设置为false
。有关更多信息,请参阅启用和禁用备份。
从键/值备份过渡到自动备份
如果您以前通过子类化BackupAgent
,并在您的清单(android:backupAgent
)中设置它,从而实现了键/值备份,可在<application/>
上添加android:fullBackupOnly="true"
属性。
在切换到自动备份时,您可能需要重新处理现有BackupAgent
或将其完全删除。请记住,切换备份选项可能会损害应用的向后兼容性,因此请进行计划,主动处理此类情况。
测试自动备份
这是关于如何在Fire平板电脑上测试自动备份功能的一组概括性步骤。有关AOSP的自动备份测试文档的更多信息,请参阅Android的备份测试指南。
选项1: 使用亚马逊的传输
-
确保正确设置传输。
adb shell bmgr list transports
您日志中的结果应当和以下所示类似:
* com.amazon.device.backup/.transport.BackupTransportService com.android.localtransport/.LocalTransport
如果未设置为亚马逊的备份传输,则可以通过命令行进行设置。
adb shell bmgr transport com.amazon.device.backup/.transport.BackupTransportService
-
设置全局设置
force_auto_backup
。要在您的设备上支持自动备份,可设置
force_auto_backup
标记。adb shell settings put global force_auto_backup 1
-
作为运行自动备份的前提条件,需要运行键值备份。必须先完成此操作。
adb shell bmgr backup @pm@ && adb shell bmgr run
-
备份程序包。
adb shell bmgr backupnow <程序包>
示例:
adb shell bmgr backupnow com.example.app
完整备份运行时,您应当会看到类似于如下的日志。
I PFTBT : 完整数据备份完成执行。
注意: 完整备份和自动备份是一回事,这两个术语可以互换使用。 -
查询恢复令牌。
恢复令牌是标识运行的备份的唯一ID。
例如:
adb shell dumpsys backup | grep "Current:"
输出:
Current: 3
在本例中,3是“恢复令牌”。
-
测试恢复令牌。
adb shell bmgr restore <令牌> <程序包>
示例:
adb shell bmgr restore 3 com.example.app
如果成功完成恢复,则应打印以下日志。
I BackupManagerService: 恢复完成。
您还可以测试数据删除,以检查恢复是否有效。卸载应用并重新安装。然后检查是否已恢复备份的数据。
如果您正确执行了所有步骤,应当能够对你的应用进行任何更改,并看到用您之前备份的数据恢复的更改。如果您遇到任何问题,请参阅下面的故障排除步骤。
选项2: 使用本地传输
您可使用AOSP的本地传输,在本地测试数据。这不会将任何数据备份到服务器,但您可以使用它来测试将备份哪些数据并将其恢复到应用。Android的备份测试指南包括使用本地传输的信息。相应步骤与以上所述大致相同。唯一的区别在于,您没有将您的传输设置为亚马逊的传输,而是AOSP的本地传输。
adb shell bmgr transport com.android.localtransport/.LocalTransport
关于备份传输
备份传输处理在服务器中上传和下载设备备份数据的逻辑。对于亚马逊而言,传输处理将数据备份到AWS S3的逻辑。
如何获取所有传输的列表
您可以通过以下命令获得所有传输的列表:
adb shell bmgr list transports
故障排除
未启用备份
如果您在日志中看到以下内容:
备份完成并且结果为: 不允许备份
无法运行备份
这意味着您的设备上没有启用备份。要解决这个问题,可以转到Settings(设置)> Device Options(设备选项)> Backup & Restore(备份和恢复)。然后将Backup & Restore切换为ON
(开)。接下来尝试重新运行备份。
传输已拒绝
首先,确保您的Fire平板电脑为最新版本。然后,如果您在日志中看到以下内容:
程序包<程序包名称>的结果: 传输已拒绝程序包,因为它目前无法处理该程序包
这种情况可能有几种原因,最常见的原因是节流。每天仅允许将程序包备份一次。要设置较低的节流限制,请运行以下命令
adb shell settings put secure overridden_backup_throttle_delay_ms <按毫秒计延迟>
示例:
adb shell settings put secure overridden_backup_throttle_delay_ms 1000
如果您已经将平板电脑设置为较低的节流限制,则此错误可能意味着您没有要备份的数据。进行检查以确认您的应用是否设置了任何要备份的数据。要获取一些任意的备份数据,请运行以下命令:
adb shell
cd /storage/emulated/0/Android/data/<您的程序包名称>/files
接下来创建测试文件:
touch test.txt
echo "some test data" >> test.txt
未找到程序包
如果您在日志中看到以下内容:
程序包<程序包名称>的结果: 未找到程序包
进行检查以确认设备上是否已安装您的程序包。
唤醒锁更改
支持
如果应用在Fire OS 8上存在问题,请在Fire平板电脑论坛中报告该问题。
Last updated: 2023年5月12日