借助 Google Play Developer API,您可以为应用上传新的 APK,并将这些 APK 发布到不同的发布轨道。这样,您就可以部署 Alpha 版和 Beta 版的应用,并向获得批准的用户提供这些应用。此外,您还可以部署分阶段发布版本,该版本会自动提供给应用的一小部分用户。随后,您可以逐步增加可获取该应用版本的用户人数,直至您最终将该版本部署为“正式”版本。
添加和修改 APK
通过调用 Edits.apks: upload 方法上传一个或多个 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。
根据分阶段发布是否成功,您之后可能希望提高可以接收相应版本的用户所占的比例,或暂停发布该版本。
提高可接收分阶段发布版本的用户比例
假定您正在进行分阶段发布且可接收该版本的用户比例为 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 resource。例如:
{ "releases": [{ "name": "My draft release", "versionCodes": ["88"], "status": "draft" }] }
调用 Edits: commit 方法来提交更改。现在,您可以通过 Google Play 管理中心或 API 检查相应草稿版本并进行发布。
指定版本说明
在发布应用的新版本时,您可以通过在版本中指定版本说明,向用户重点介绍新变化。
为此,请在向 Edits.tracks: update 方法提供 Edits.tracks resource 时使用 "releaseNotes"
字段。
{ "releases": [{ "name": "Release with notes", "versionCodes": ["88"], "status": "completed", "releaseNotes": [ {"language": "en-US", "text": "Describe what's new in this release."} ] }] }