借助 Google Play Developer API,您可以为应用上传新的 APK,并将这些 APK 发布到不同的发布轨道。这样,您就可以部署应用的 Alpha 版和 Beta 版,并向获批用户提供相应版本。此外,您还可以部署分阶段发布版本,该版本会自动提供给应用的一小部分用户。随后,您可以逐步增加可获取该应用版本的用户人数,直至您最终将该版本部署为“正式”版本。
添加和修改 APK
通过调用 Edits.apks: upload 方法上传一个或多个 APK。
该方法会将 APK 上传到一个“存储桶”中,系统可在这里将相应 APK 分配给某个“轨道”,以便将其部署至用户(如果删除或舍弃编辑会话,上传到相应编辑会话的所有 APK 也会丢失)。
通过调用 Edits.tracks: update 方法在“轨道”上发布 APK。您可以在以下轨道上发布 APK:
测试轨道,例如
"alpha"
和"beta"
Alpha 版和 Beta 版应用会部署至您分配到 Alpha 版和 Beta 版测试组的用户。您可以使用 Google Play 管理中心将用户分配到这些测试组。
内部测试轨道:
"qa"
您的应用的内部版本会部署到 Google Play 管理中心中配置的内部测试轨道。
正式版轨道:
"production"
在“正式版”轨道上发布的版本会部署至所有用户。您可以在“正式版”轨道上使用分阶段发布模式,先将相应版本安全地部署至一小部分正式版用户,然后随着您对该版本的信心日渐增强,再逐渐部署至更多用户。
如果您使用的是简单模式,则不应在任何轨道上放置多个 APK。如果您使用的是具有多 APK 支持功能的高级模式,则可以向每个轨道上传 0 个、1 个或更多个 APK。
设备规格轨道的轨道名称
设备规格轨道的轨道名称以特定标识符为前缀。
设备规格 | 前缀 |
---|---|
Android Automotive OS | automotive |
Wear OS | wear |
Android TV | tv |
如何推算某个设备规格轨道的轨道名称?
正式版轨道、开放式测试轨道和内部测试轨道等常用轨道都有众所周知的名称。
轨道类型 | 默认轨道名称 |
---|---|
正式版 | production |
开放式测试 | beta |
内部测试 | qa |
某个设备规格轨道的轨道名称可按如下格式推算:"[prefix]:defaultTrackName"
。例如,对于设备规格为 Wear OS 的轨道,轨道名称有:"wear:production"
、"wear:beta"
和 "wear:qa"
。
封闭式测试轨道需要手动创建,并采用自定义名称。因此,如果设备规格的名称为 $name
,则其对应封闭式测试轨道的名称将为 "[prefix]:$name"
。
APK 工作流程示例
本部分介绍了 Tracks API 的典型用法。在这里,我们假定您想要为每个轨道上传新的 APK 版本,并分配一定数量的用户来接收某个分阶段发布版本(现实中,开发者不太可能在同一次操作中执行所有这些动作,而是可能会在某一天更新 Beta 版,然后在另一天在“正式版”轨道上创建分阶段发布版本,诸如此类)。
- 打开新的编辑会话,具体如 Edits 工作流程中所述。
- 针对要上传的每个 APK 调用 Edits.apks: upload 方法。在该方法的请求正文中传递 APK(此操作会将 APK 置于某个存储区域中,但不会在某个轨道上将其发布,也不会对其进行部署)。该方法会针对您上传的每个 APK 分别返回一个版本代码;当您在某个轨道上发布相应 APK 时,您将需要使用该版本代码来引用此 APK。
针对要用于发布 APK 的每个轨道调用 Edits.tracks: update 方法。在请求正文中,传递包含您想发布的版本的 Edits.tracks 资源。例如,如需发布一个版本代码为 88 的 APK,请使用以下代码:
{ "releases": [{ "versionCodes": ["88"], "status": "completed" }] }
此时,用户仍无法获取 APK。与其他编辑会话一样,在您提交之前,相应更改不会发布。
调用 Edits: commit 方法来提交更改。在您执行此操作后,系统会为每个轨道上的用户提供更新后的 APK 版本(与所有编辑会话一样,相应更改可能需要几个小时才能生效)。
分阶段发布
如果您想逐步部署新版本的 APK,您可以选择以“分阶段发布”版本的形式进行发布。这样,Google Play 便会自动将其部署至所需比例(由您指定)的应用用户。如果“分阶段发布”的 APK 没有任何问题(如崩溃等),您可以提高接收该版本的用户比例;准备就绪后,您可以将该 APK 部署为新的正式版本。
本部分介绍了先分阶段发布 APK,再将其提升为正式版所需执行的步骤:
创建编辑会话,具体如 Edits 工作流程中所述。
使用 Edits.apks: upload 方法将新 APK 上传到编辑会话。
使用 Edits.tracks: update 方法在正式版轨道上启动
"inProgress"
分阶段发布版本。选择应接收新 APK 的用户比例。此时,最终用户仍无法获取相应 APK。{ "releases": [{ "versionCodes": ["99"], "userFraction": 0.05, "status": "inProgress" }] }
通过调用 Edits: commit 方法提交进行中的编辑会话中的更改。在接下来的几个小时内,系统将向用户发布新 APK。所选比例的用户将会收到新 APK。
您之后可能希望提高可接收相应 APK 版本的用户比例,或暂停发布该版本,具体取决于该分阶段发布版本是否获得成功。
提高可接收分阶段发布版本的用户比例
假定您正在进行分阶段发布,且可接收相应版本的用户比例为 5%(如上一部分中所述),本部分将介绍在相应版本获得成功的情况下如何提高这一比例:
创建编辑会话,具体如 Edits 工作流程中所述。
使用 Edits.tracks: update 方法更改正式版轨道上的
"inProgress"
分阶段发布版本。提高应接收新 APK 的用户比例:{ "releases": [{ "versionCodes": ["99"], "userFraction": 0.1, "status": "inProgress" }] }
通过调用 Edits: commit 方法提交进行中的编辑会话中的更改。在接下来的几个小时内,系统将向用户发布新 APK。所选比例的用户将会收到新 APK。
暂停分阶段发布
假定您正在进行分阶段发布,且可接收相应版本的用户比例为 5%(如上一部分中所述),本部分将介绍在发现相应版本存在问题时如何暂停分阶段发布。
创建编辑会话,具体如 Edits 工作流程中所述。
使用 Edits.tracks: update 方法更改正式版轨道上的
"inProgress"
分阶段发布版本。将状态设为"halted"
。{ "releases": [{ "versionCodes": ["99"], "status": "halted" }] }
通过调用 Edits: commit 方法提交进行中的编辑会话中的更改。新用户将无法再获取此版本。
如果您以后决定恢复已暂停的版本,只需将其状态重新设为 "inProgress"
即可。
完成分阶段发布
如果您对分阶段发布的版本感到满意,并想要向所有用户发布相应版本,可以将该版本的状态设为 "completed"
:
创建编辑会话,具体如 Edits 工作流程中所述。
使用 Edits.tracks: update 方法更改正式版轨道上的
"inProgress"
分阶段发布版本。将状态设为"completed"
。{ "releases": [{ "versionCodes": ["99"], "status": "completed" }] }
通过调用 Edits: commit 方法提交进行中的编辑会话中的更改。在接下来的几个小时内,系统将向用户发布新 APK。所选比例的用户将会收到新 APK。
草稿版本
借助草稿版本,您可以自动上传 APK,并通过 API 创建版本。之后,您可以通过 Google Play 管理中心部署相应版本。如需在某个轨道上创建草稿版本,请执行以下操作:
- 打开新的编辑会话,具体如 Edits 工作流程中所述。
- 针对要上传的每个 APK 调用 Edits.apks: upload 方法。在该方法的请求正文中传递 APK。该方法会针对您上传的每个 APK 分别返回一个版本代码;当您将 APK 分配到某个版本时,您将需要使用该版本代码来引用相应的 APK。
针对要用于发布 APK 的每个轨道调用 Edits.tracks: update 方法。在请求正文中,传递包含您想创建的草稿版本的 Edits.tracks 资源。例如:
{ "releases": [{ "name": "My draft release", "versionCodes": ["88"], "status": "draft" }] }
调用 Edits: commit 方法来提交更改。现在,您可以通过 Google Play 管理中心或 API 检查相应草稿版本并进行发布。
指定版本说明
在发布应用的新版本时,您可以通过在版本中指定版本说明,向用户重点介绍新变化。
为此,请在向 Edits.tracks: update 方法提供 Edits.tracks 资源时使用 "releaseNotes"
字段。
{ "releases": [{ "name": "Release with notes", "versionCodes": ["88"], "status": "completed", "releaseNotes": [ {"language": "en-US", "text": "Describe what's new in this release."} ] }] }