Wear OS 6 引入了一项新的 API,即表盘推送,这为更高级的表盘发布用例创造了机会。
确定何时使用表盘推送
表盘推送是 Wear OS 上的一个 API,可让开发者直接添加、更新或移除表盘。标准表盘开发不需要此权限。
与表盘推送功能搭配使用的表盘必须使用表盘格式编写。这可以包括使用 Watch Face Studio 或任何其他可生成使用表盘格式的表盘的工具设计的表盘。
虽然表盘推送 API 可以有多种潜在用途,但下表应作为主要使用情形的指南:
用例 | 推荐解决方案 | 复杂性 |
---|---|---|
我想创建并发布个性化表盘主题。 | 直接使用或通过 Watch Face Studio 等工具使用表盘格式,然后在 Google Play 上发布。 | 低 |
我想创建一个手机应用,让用户可以从精选的表盘主题集中选择表盘主题,也可以设计和自定义表盘主题,以便直接安装到 Wear OS 手表上。 | 在手表上使用表盘推送 API 创建手表和手机应用。 | 高 |
用途
表盘推送 API 的典型使用情形是创建 Marketplace 应用。通过此应用,用户可以在手机上从精选的表盘主题集中选择表盘主题,并直接控制将这些表盘主题安装到已连接的手表上。
注意事项
如需详细了解如何构建表盘,请参阅表盘格式指南:使用表盘推送功能部署的表盘是常规的表盘格式表盘。
在构建表盘时,请牢记以下注意事项。
软件包名称
使用表盘推送安装的表盘必须符合以下惯例:
<app name>.watchfacepush.<watchface name>
... 其中 <app name>
是调用表盘推送 API 的应用的软件包名称。
例如,对于软件包名称为 com.example.mymarketplace
的应用,以下是有效的表盘软件包名称:
com.example.mymarketplace.watchfacepush.watchface1
com.example.mymarketplace.watchfacepush.watchface2
com.example.mymarketplace.watchfacepush.another_watchface
不符合此惯例的表盘主题会被 API 拒绝。
软件包内容
严格执行 APK 内容。需要注意确保表盘格式符合以下限制:从技术上讲,可以生成包含无害元数据文件和其他制品的表盘格式 APK,这些 APK 可能符合 Google Play 的要求,但无法通过表盘推送验证(见下文)。
每个表盘 APK 中只能包含以下文件/路径:
/AndroidManifest.xml
/resources.arsc
/res/**
/META-INF/**
此外,AndroidManifest.xml
文件中仅允许使用以下标记:
<manifest>
<uses-feature>
<uses-sdk>
<application>
<property>
<meta-data>
最后,软件包应指定至少为 33
的 minSdk
,并且 <application>
标记应指定属性 android:hasCode="false"
。
验证
与通过 Google Play 分发的常规表盘不同,Watch Face Push 会检查以确保每个表盘都具有良好的格式和性能,而这是 Marketplace 应用的责任。
Google Play 会使用以下验证检查来验证每个使用表盘推送功能的表盘的质量:
- 通过表盘推送 API 安装或更新的所有表盘都必须通过表盘推送验证工具。
- 只有官方验证工具可用于生成与 API 搭配使用的验证令牌。
- 所使用的验证工具在运行验证时必须是最新的。
如果 APK 没有更改,则无需重新验证。即使所用验证工具的版本被取代,令牌也不会过期。
与此同时,我们建议您不时重新运行验证器,因为验证器会定期更新。
运行验证器
验证器有三种形式:
- CLI 工具
- 适用于 JVM 的库
- 可在 Android 上使用的库
命令行验证器的用法
- 从 Google 的 Maven 制品库获取验证器。
运行该工具,如下所示:
java -jar validator-push-cli-1.0.0-alpha06.jar \ --apk_path=<your watch face>.apk \ --package_name=<your marketplace package name>
如果成功,输出会包含一个验证令牌,您在添加或更新表盘时必须将此令牌提供给表盘推送 API。
如果发生错误,输出会包含有关哪个特定检查失败的详细信息。
库验证器使用情况
添加验证器依赖项所需的 Jitpack 代码库:
repositories { ... google() maven { url = uri("https://jitpack.io") content { includeGroup("com.github.xgouchet") } } }
在项目中添加验证器依赖项:
// For use on JVM implementation("com.google.android.wearable.watchface.validator:1.0.0-alpha06") // For use on Android implementation("com.google.android.wearable.watchface.validator-android:1.0.0-alpha06")
运行验证器:
val validator = DwfValidatorFactory.create() val result = validator.validate(watchFaceFile, appPackageName) if (result.failures().isEmpty()) { val token = result.validationToken() println("Validation token: $token") // Validation success - continue with the token // ... } else { // There were failures, handle them accordingly - validation has failed. result.failures().forEach { failure -> println("FAILURE: ${failure.name()}: ${failure.failureMessage()}") // ... } }
如需查看使用此库的示例,请参阅 GitHub 示例。另请参阅 Portable Asset Compiler Kit (Pack) 库,该库可用于在设备上构建 APK,以搭配基于 Android 的验证器使用。
APK 大小
对于表盘推送表盘,应特别注意确保 APK 大小保持在最低限度:表盘 APK 可能会通过蓝牙从手机应用传输到手表应用,这可能会很慢。
过大的 APK 可能需要相当长的时间才能传输完毕,这不仅会带来糟糕的用户体验,还会消耗大量电池电量。
- 使用
pngquant
等适当的库,尽可能缩小图片文件大小- 在表盘合集构建流程中包含此内容
- 检查图片的尺寸是否适合其使用时的比例。
- 确保图片经过适当裁剪,移除了所有周围背景。
- 缩小字体文件的大小
- 例如,如果仅使用特定字体以
HH:MM
格式显示时间,您可以使用pyftsubset
等工具将字体文件限制为仅包含必要的字形。这样可以大幅减小生成的字体文件和 APK 的大小。如需了解在其他情况下如何尽可能减小字体文件大小,请参阅这篇博文。
- 例如,如果仅使用特定字体以
如需有关如何尽可能缩减 APK 大小的更多建议,请参阅优化内存用量指南。
APK 签名
与常规 APK 一样,您的所有表盘都需要签名。创建与主应用所用密钥不同的密钥,并为所有表盘使用该密钥。
架构
考虑系统的三个主要组成部分:
- 基于云的存储:在规范的 Marketplace 应用中,您的表盘是在云端构建和存储的,可供用户随时使用。表盘主题包括:
- 预构建为常规表盘格式 APK
- 每个软件包仅包含一个基于表盘格式的表盘
- 已使用表盘推送验证流程进行验证,并与关联的验证令牌一起存储。
- 可随时由手机应用检索。
- 电话应用:电话应用是用户与系统互动的主要方式。这样一来,他们便可以:
- 浏览和搜索表盘主题目录
- 在手表上安装或更换表盘
- 手表应用:手表应用通常没有显著的用户界面。它主要是手机应用和表盘推送 API 之间的桥梁,具有以下功能:
- 使用表盘推送 API 安装/更新或替换表盘
- 请求必要的权限并提示用户
- 提供默认表盘
- 提供最少的表盘缓存
- 手机与手表之间的通信:手机和手表应用之间的通信对于整体体验的成功至关重要。使用 Wear OS Data Layer API,该 API 允许:
- 安装检测:通过使用功能和
CapabilityClient
,手机应用可以检测手表应用是否缺失,反之亦然。然后,启动前往 Play 商店的 intent 以安装缺少的设备规格。 - 状态管理:使用
DataClient
或MessageClient
可让手机与手表的状态保持同步,例如确保手机知道设置了哪个表盘。 - APK 传输:使用
ChannelClient
或MessageClient
,可以将 APK 从手机发送到手表 - 远程调用:使用
Messageclient
,手机可以指示手表调用表盘推送 API,例如安装表盘。
- 安装检测:通过使用功能和
如需了解详情,请参阅数据层 API 指南。