Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

打包和分发 Wear 应用

借助 Wear OS by Google 谷歌,用户可以在手表上访问 Play 商店,并将 Wear 应用直接下载到手表上。此外,用户还可以通过 Play 商店网络版将应用直接安装到其手表上。

所有运行 Wear 2.0 的设备都使用 Android 7.1.1(API 级别 25)。如果您的应用仅支持运行 Wear 2.0 或更高版本的设备,则最低的目标 API 级别应为 25。如果您的应用同时支持 Wear 1.x 和 2.0,则最低和目标 API 级别可以为 23。所有 Wear 应用的目标 API 级别都必须为 23 或更高级别,因此需要获取运行时权限

另请参阅独立应用

如果 Wear 2.0 应用具有配对应用,则必须使用同一密钥为这两个应用签名。此要求也适用于 Wear 1.x 应用(这类应用一律具有配对应用)。

规划 Play 商店

要让您的应用出现在手表上的 Play 商店中,请在 Play 管理中心上传手表 APK,就像上传其他任何 APK 一样。如果您只有手表 APK 而没有手机 APK,则不需要执行其他步骤。

如果您不仅有手表 APK,而且还有手机 APK,则必须使用多 APK 交付方式

分发到 Wear 2.0 手表

在运行 Wear 2.0 的设备上,当用户安装具有关联手表应用(嵌入式 APK 或通过 Play 管理中心上传的 APK)的手机应用时,用户将收到关于可用手表应用的手表通知。点按此通知将打开手表上的 Play 商店,让用户可以选择安装手表应用。

此外:

  • 当您使用新的嵌入式手表 APK 更新手机 APK 时,用户的手表 APK 会自动更新。
  • 通过 Play 管理中心上传手表 APK 时,您可以将手机 APK 与 Wear APK 分开进行更新,而且用户可通过手表上的 Play 商店接收更新。
  • 对于嵌入式手表 APK,当手机上的 APK 更新时,用户的手表 APK 会自动更新。如果是多 APK,更新行为取决于 Play 商店设置(自动更新应用)。如果嵌入式 APK 和多 APK 的版本不同,强烈建议不要同时为您的应用提供这两种 APK。举个例子,假设您有嵌入式 APK v1 和多 APK v2。如果用户先安装了嵌入式 APK,则多 APK 版本将取代嵌入式 APK,因为多 APK 版本较高。日后,如果开发者将手机 APK 更新到 v3,嵌入式 APK 将会自动安装,从而替换掉通过多 APK 提供的较高版本。

分发到 Wear 1.x 和 2.0 手表

过去,Wear 1.x 的标准分发模型是在手机应用内嵌入手表应用。现在,Wear OS 允许您以相同的方式为 Wear 1.0 和 2.0 分发 Wear 应用。当用户安装您的手机应用时,如果您在 Play 商店中提供了兼容的 Wear 应用,该应用将自动安装到 Wear 1.0 手表上。此功能允许您停止在手机应用的 APK 中嵌入 Wear 应用。您可以在 Play 商店中为 Wear 1.0 和 Wear 2.0 手表提供手表 APK 的独立版本。

指定版本代码

为确保独立 APK 升级手表上现有的嵌入式 Wear APK,独立 Wear APK 的版本代码通常应高于嵌入式 Wear APK 的版本代码(手机 APK 的版本代码方案可以独立于手表 APK,不过它们必须具有唯一性)。不过,如果独立 APK 和嵌入式 Wear APK 等效,则它们的版本代码可以相同。

如果 APK 不等效,但版本代码相同,那么当手表从 Wear 1.x 更新为 2.0 时,只有等待一段比预期更长的时间后,手表才可能会获得新的 APK。

目前,无法创建一个同时适用于手机和手表的 APK。

如果您的 Wear APK 和配对 APK 共享代码且需要协调发布,您应保留 APK 变体版本代码的最后两位数。APK 变体的一个例子是 CPU 架构。要查看示例,请参阅支持多个 CPU 架构

下面是建议的版本代码方案:

  • 将版本代码的前两位数设为 targetSdkVersion,例如 25
  • 将接下来的三位数设为产品版本,例如,如果产品版本为 1.5.2,则设为 152
  • 将接下来的两位数设为版本号,例如 01
  • 保留多 APK 变体的最后两位数,例如 00

如果使用此建议的版本代码方案中的示例值(25、152、01 和 00),则示例 APK 变体的版本代码将为 251520100。

另请参阅设置应用版本信息

Gradle 文件中是否支持

如果您具有同时适合 Wear 1.x 和 Wear 2.0 的 Wear 应用,不妨考虑使用产品特性。例如,假设您的目标 SDK 版本为 23 和 25,如果现有 Wear 1.x 应用的最低 SDK 版本为 23,请更新 Wear 模块的 build.gradle 文件,使其包含以下内容:

    android {
        // Allows you to reference product flavors in your
        // phone module's build.gradle file
        publishNonDefault true
        ...
        defaultConfig
        {
           // This is the minSdkVersion of the Wear 1.x app
           minSdkVersion 23
           ...
        }
        buildTypes {...}
        productFlavors {
            wear1 {
              // Use the defaultConfig value
            }
            wear2 {
                minSdkVersion 25
            }
        }
    }
    

编译变体是产品特性和编译类型的组合。在 Android Studio 中,调试或发布应用时,请选择合适的编译变体。例如,如果 wear2 是产品特性,可选择 wear2Release 作为版本编译变体。

为了编写特定于 Wear 2.0 或 Wear 1.x 的代码,不妨考虑编译变体的源集

将 Wear 1.0 APK 从嵌入式 APK 迁移到多 APK

注意:由于延迟问题会影响应用在 Wear 1.x 手表上的可用性,因此您可以嵌入 Wear APK,而不是使用多 APK 交付方法(适用于 Wear 1.x 手表)。

一直以来,Wear 1.0 APK 都是嵌入在手机 APK 中,以便将穿戴式设备应用分发给用户。现在,Wear OS 允许您将 Wear 1.0 APK 直接上传到 Play 商店,而不是嵌入它们。这有助于减小手机 APK 的大小,并在 APK 的版本控制和发布方面实现更大的灵活性。如果您已有嵌入式 Wear 1.0 APK,则可以按照以下步骤配置和构建 APK,并将其上传到 Play 商店:

  1. wearAppUnbundled true 设置添加到手机模块的 build.gradle 文件中。仅当您之前在 Play 商店中发布了嵌入式 Wear 应用时,才需要执行此操作。
  2.     android {
          ...
          defaultConfig {
            ...
            wearAppUnbundled true
          }
        }
        
  3. 从手机应用的 build.gradle 文件中移除以下 wearApp 依赖项规则:
  4.     dependencies {
            ...
            wearApp project(path: ':wear', configuration: 'wear1Release')
        }
        
  5. 确保在 Wear 应用的清单文件中指定以下功能限制:
  6.     <manifest package="com.example.standalone"
            xmlns:android="http://schemas.android.com/apk/res/android">
            <uses-feature
                android:name="android.hardware.type.watch"/>
            ...
        </manifest>
        
  7. 在 Wear 模块的 build.gradle 文件中,将最低 SDK 版本设为 23。
  8. 如果需要,在查看独立应用页面后,将您的 Wear 应用指定为独立应用
  9. 构建您的 Wear APK 并使用 Google Play 管理中心进行部署。

对于 Wear 应用的最低 SDK 版本,请考虑以下几点:

  • 如果您对 Wear 1.0 和 Wear 2.0 使用不同的 APK,请务必在 Wear 2.0 模块的 build.gradle 文件中将最低 SDK 版本设为较高的 25。这样可确保 Play 商店只将 Wear 2.0 APK 分发给 Wear 2.0 设备,而不分发给 Wear 1.0 设备。
  • 如果您已有 Wear 2.0 应用且希望将其分发给 Wear 1.0 设备,确保该应用可在 Wear 1.0 设备上正常运行,才能将其最低 SDK 版本设为 23。

针对手表进行设置

在 Android 清单文件中,您必须将 uses-feature 元素设为 android.hardware.type.watch。此外,请勿将 required 属性设为 false。目前不支持同时适用于 Wear 设备和非 Wear 设备的单个 APK。

因此,如果一个 APK 具有以下设置,则 Google Play 仅向手表提供该 APK:

    <manifest package="com.example.standalone"
        xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-feature
            android:name="android.hardware.type.watch"/>
        ...
    </manifest>
    

上面的 android.hardware.type.watch 设置可以与其他条件结合使用,如 SDK 版本、屏幕分辨率和 CPU 架构。因此,不同的 Wear APK 可以针对不同的硬件配置。

将应用指定为独立应用

Wear 2.0 要求在手表应用的 Android 清单文件中添加一个 meta-data 元素作为 <application> 元素的子元素。meta-data 元素的名称为 com.google.android.wearable.standalone,且值必须为 truefalse。该元素可指明您的手表应用是否为独立应用。如果将该元素的值设为 true,则可以在与 iPhone 配对的手表上的 Play 商店中提供您的应用,前提是所有发布渠道中(例如,在测试版中)目前使用的 APK 都将该元素设为 true。如果您目前向用户提供的所有 APK(Alpha 版、测试版和正式版)并非都有上述设置,则当用户在与 iPhone 配对的手表上搜索时,您的应用不会显示。

手表应用不一定会被视为独立应用,它可以归入以下类别之一:

  • 完全独立于手机应用
  • 半独立(手机应用不是必需的,只提供可选功能)
  • 依赖于手机应用

如果手表应用为完全独立应用或半独立应用,请将新的 meta-data 元素的值设为 true

    <application>
    ...
      <meta-data
        android:name="com.google.android.wearable.standalone"
        android:value="true" />
    ...
    </application>
    

由于独立应用(即独立应用或半独立应用)可由 iPhone 用户或缺少 Play 商店的 Android 手机用户安装,因此手表应用应该可以在没有 Android 手机应用的情况下使用。

如果手表应用依赖于手机应用,请将上述 meta-data 元素的值设为 false。设为 false 表示手表应用应仅安装在与具有 Play 商店的手机配对的手表上。

注意:即使此值为 false,用户也可以在安装手机应用前安装手表应用。

如果您的 Wear 2.0 应用有配对的手机应用,请为您的 Wear 应用和该手机应用使用相同的软件包名称。

使用 Play 管理中心

您可以使用 Play 管理中心将独立 Wear APK上传到应用详情。

另请参阅多 APK 支持管理您的应用。在按照以下说明上传 APK 之前,必须先为 APK 签名

上传和发布您的 APK

要使用 Play 管理中心上传和发布您的 APK,请执行以下操作:

  1. 转到您的 Play 管理中心
  2. 在左侧菜单中,依次选择版本管理 > 应用版本

    注意:如果您的 APK 处于草稿模式,请直接从左侧菜单中选择应用版本

  3. 在您要创建的版本类型(正式版、Alpha 版或测试版)旁边,选择管理
  4. 要创建新版本,请选择创建版本
  5. 选择从文件库中添加 APK 以添加您的独立 Wear APK。或者,拖放您的 APK 文件或选择浏览文件
  6. 准备好版本后,请选择查看。此时将显示“查看并发布版本”屏幕。在此处,您可以使用信息图标查看 APK 的详细信息,如支持的 Android 设备数量。此外,还要确保已将硬件功能设为 android.hardware.type.Watch.
  7. 选择确认发布以发布您的应用。

嵌入 Wear 1.x APK

本部分中的流程仅供参考。如果 Wear 1.x APK 打包在手机应用 APK 中,则当用户下载手机应用时,系统会将 Wear 应用推送到配对的手表上。

注意:当您使用调试密钥为应用签名时,此功能不起作用。在开发应用时,需要使用 adb install 或 Android Studio 将应用直接安装到手表上。

使用 Android Studio 打包 Wear 1.x 应用

注意:由于延迟问题会影响应用在 Wear 1.x 手表上的可用性,因此您可以嵌入 Wear APK,而不是使用多 APK 交付方法(适用于 Wear 1.x 手表)。

要在 Android Studio 中打包 Wear 1.x 应用,请执行以下操作:

  1. 确保手表和手机应用模块具有相同的软件包名称。
  2. 在手机应用的 build.gradle 文件中声明一个指向手表应用模块的 Gradle 依赖项。此声明将类似于以下内容,但如需查看最新版本,请参阅设置 Google Play 服务v4 compat 库
        dependencies {
           compile 'com.google.android.gms:play-services-wearable:10.0.1'
           compile 'com.android.support:support-compat:25.1.0'
           wearApp project(':wearable')
        }
        
  3. 按照为您的发布版本签名中的说明,指定发布密钥库并为应用签名。Android Studio 会将一个包含嵌入式手表应用的已签名手机应用导出(到项目的根文件夹中)。

    或者,也可以使用 Gradle 封装容器从命令行为这两个应用签名。必须为这两个应用签名,才能自动推送手表应用。请参阅为您的应用签名

单独为 Wear 1.x 应用和手机应用签名

如果您的构建流程要求将手表应用与手机应用分开签名,您可以在手机模块的 build.gradle 文件中声明以下 Gradle 规则,以嵌入先前签名的手表应用:

    dependencies {
      ...
      wearApp files('/path/to/wearable_app.apk')
    }
    

然后,您可以根据需要为手机应用签名(使用 Android Studio 的 Build > Generate Signed APK... 菜单项,或者使用 Gradle signingConfig 规则)。

手动打包 Wear 1.x 应用

如果您正在使用其他 IDE 或构建方法,则可以手动将手表应用打包在手机应用中:

  1. 确保手表和手机 APK 具有相同的软件包名称和版本号。
  2. 将已签名的手表应用复制到手机项目的 res/raw 目录中。我们将该 APK 称为 wearable_app.apk
  3. 创建一个 res/xml/wearable_app_desc.xml 文件,使其包含手表应用的版本和路径信息。例如:
        <wearableApp package="wearable.app.package.name">
          <versionCode>1</versionCode>
          <versionName>1.0</versionName>
          <rawPathResId>wearable_app</rawPathResId>
        
        </wearableApp>
        

    packageversionCodeversionName 的值与手表应用清单文件中的值相同。rawPathResId 是 APK 资源的静态变量名称。例如,对于 wearable_app.apk,静态变量名称为 wearable_app

  4. 将一个 meta-data 标记添加到手机应用的 <application> 标记以引用 wearable_app_desc.xml 文件。
          <meta-data android:name="com.google.android.wearable.beta.app"
                         android:resource="@xml/wearable_app_desc"/>
        

    注意:不应更改上述 meta-data 标记。必须指定 com.google.android.wearable.beta.app

  5. 构建手机应用并为其签名。

关闭资源压缩

默认情况下,Android Studio 不会压缩 APK,但如果您使用其他构建流程,请确保手表应用不会被双重压缩。许多构建工具会自动压缩添加到 Android 应用的 res/raw 目录中的文件。手表 APK 已经压缩,因此会发生双重压缩。结果是,手表应用安装程序无法读取手表应用,安装失败,并且 PackageUpdateService 将记录以下错误:“This file cannot be opened as a file descriptor; it is probably compressed.”。