调用Google Play Android Developer API下载签名APK返回204问题
问题根因
接口返回204无内容不是官方文档有误,是几个文档没明确标注的隐性限制:
- 异步构建未完成:上传AAB后Google不会立刻生成单文件Universal APK,只会先生成分发用的split APK集,Universal APK属于后台异步构建产物,构建未完成时提前调用下载接口会直接返回204。
- 权限校验静默失败:仅配置
androidpublisher鉴权Scope不满足要求,CI使用的服务账号必须在Play后台获得对应应用的版本管理、应用查看权限,缺权限时接口不会返回403错误,会静默返回204无任何提示。 - 下载ID取值错误:generatedApks列表接口会同时返回split APK集、Universal APK两类下载ID,二者格式相似度极高,错拿split APK的ID调用Universal APK下载接口也会返回204。
- 版本状态不满足要求:只有版本发布到至少一个轨道(内部测试、封闭测试、开放测试、正式版任意一个均可),后台才会生成可下载的正式签名APK,存在草稿箱未推到任何轨道的版本,下载接口会永久返回204。
- 未开启重定向跟随:该下载接口不会直接返回文件流,会先返回302跳转至带临时签名的存储地址,HTTP客户端默认不跟随重定向时,部分场景下会被处理为204无内容响应。
可落地解决步骤
按顺序排查即可打通全流程:
- 先校验服务账号权限:进入Play Console用户权限管理页,找到CI流程使用的服务账号,为其绑定对应应用的「查看应用信息」「管理测试/正式版本」权限,修改后等待2分钟待权限全局同步生效。
- 增加轮询等待逻辑:上传AAB并将版本推送到目标轨道后,不要立刻调用下载接口,每隔10秒请求一次generatedApks列表接口,直到对应versionCode的返回结果中
generatedUniversalApk.downloadId字段非空,再拿该ID发起下载请求。常规包体的Universal APK构建时长在30秒到2分钟区间,最大等待超时设为10分钟即可覆盖绝大多数情况。 - 修正下载请求参数:使用curl发起请求时必须加
-L参数开启重定向跟随,同时指定输出文件路径,正确请求示例如下:
curl -L \ 'https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{替换为你的应用包名}/generatedApks/{替换为对应版本号}/downloads/{替换为轮询拿到的universal apk下载ID}:download' \ -H 'Authorization: Bearer {替换为你的有效鉴权token}' \ -o google-signed-universal.apk
- 校验版本状态:确认要下载的版本已经推送到至少一个发布轨道,不要使用纯草稿状态的版本号调用接口。
实测验证:按上述步骤调整后,接口会正常跟随重定向下载到带Google官方正式签名的单文件APK,可直接旁加载到测试设备安装,和手动从控制台下载的文件签名、内容完全一致。
内容的提问来源于stack exchange,提问作者Navid
相关产品推荐
相关产品推荐

