当前位置: 首页 > news >正文

Unity游戏打包——GooglePlay自动传包

本文由 NRatel 历史笔记整理而来,如有错误欢迎指正。

一、准备工作

参考文档:

https://developer.android.com/games/pgs/publishing/publishing?hl=zh-cn

https://developers.google.com/android-publisher/?hl=zh-cn
https://developers.google.com/android-publisher/getting_started?hl=zh-cn(准备工作)

按照文档

1、创建 Google Cloud 项目。

2、为 Google Cloud 项目启用 Google Play Developer API。

点击文档中链接,然后点击启用

3、设置一个对 Google Play 管理中心具有适当权限的服务账号,以便访问 Google Play Developer API。

创建服务账号:

https://developers.google.com/identity/protocols/oauth2/service-account?hl=zh-cn

创建服务账号结果:

点击此 电子邮件,在密钥页创建新密钥,选择推荐的Json格式

创建密钥结果:

前往 Google Play 管理中心 用户和权限 界面邀请此 电子邮件 账号
(如果自己没有邀请权限,让运营邀请)

4、准备使用 OAuth 客户端

在 Google Cloud 控制台中,创建 OAuth 权限

二、使用python库上传

Python 库

https://github.com/googleapis/google-api-python-client

1、安装

google-api-python-client/docs/README.md at main · googleapis/google-api-python-client · GitHub

pip3 install google-api-python-client

安装注意:

需在命令行和jenkins 运行时,分别查看

python3 --version 和 which python3

确保是否是同一个python3

若不是,则执行 pip3 install 时,可指定将库安装到哪个python3中。

否则,安装错误的话,jenkins运行的python将不能识别目标 python库。

安装命令:

/usr/bin/python3 -m pip install google-api-python-client

验证命令:

/usr/bin/python3 -m pip show google-api-python-client/usr/bin/python3 -m pip list

强制安装:

若 jenkins 使用的是 homebrew 中的 python,则安装三方 python 库时可能会提示失败。

可以考虑装在虚拟环境中,但使用不方便。

可以强制安装(有风险)。

pip3 install google-api-python-client --break-system-packages

2、设置、身份验证和授权访问、build a service、传包

https://github.com/googleapis/google-api-python-client/blob/main/docs/start.md

from googleapiclient.discovery import build

service = build('drive', 'v3')

# ...

service.close()

查看支持的API页面,确认使用 androidpublisher v3,并查看其文档:

https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.html

根据文档,调用 Edits下的方法进行传包

(编辑会话)(Edits方法和工作流程介绍)

https://developers.google.com/android-publisher/edits?hl=zh-cn

(APK和轨道介绍)

https://developers.google.com/android-publisher/tracks?hl=zh-cn

(Edits方法API文档)

https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits

四步:

1、使用 service.edits().insert 创建新修改,得到 edit_id

https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits.html#insert

2、使用 service.edits().bundles().upload 上传 aab,得到 本次上传的 versionCode

(上传到某个存储域中,以便分配给本修改或后续修改中的某个轨道。)

https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits.bundles.html#upload

3、使用 service.edits().tracks().update 将 aab 分配到指定轨道

https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits.tracks.html#update

4、使用 service.edits().commit 提交 edit 中的更改,从而替换应用的当前状态。

与通过 Play 管理中心进行更改时一样,这些更改可能数小时后才能生效。

https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits.html#commit

注意:脚本中需要的service_account_file 来自这里:

credentials = Credentials.from_service_account_file(service_account_file, scopes=['https://www.googleapis.com/auth/androidpublisher'])

遇到的问题:

1、returned "The caller does not have permission". Details: "The caller does not have permission">

原因:权限不足,传包账号要让运行加到play后台,需要上传权限。

2、超时
TimeoutError: The write operation timed out

raise RemoteDisconnected("Remote end closed connection without response")

解决:网络和超时设置问题

import socketsocket.setdefaulttimeout(300)

3、returned "Version code 49 has already been used.". Details: "Version code 49 has already been used.">

原因:googleplay后台内容库中已存在相同vercode的包。不可重复上传。

其他:

1、service.edits().bundles().upload 时,track 文档中的 qa 实际需要传 internal

https://developers.google.com/android-publisher/tracks#ff-track-name

2、service.edits().tracks().update 时,可设置 inAppUpdatePriority,默认为0

https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits.tracks.html#update

若要支持,请参考:

https://developer.android.com/guide/playcore/in-app-updates/unity?hl=zh-cn

三、完整上传代码

# -*- coding: utf-8 -*-import logging
import socketfrom googleapiclient.discovery import build as google_client_build
from google.oauth2.service_account import Credentials
from google.auth.transport.requests import Requestlogging.basicConfig(level=logging.DEBUG)
socket.setdefaulttimeout(300)# 创建服务,自动刷新令牌
service_account_file = "C:/Users/NRatel/Desktop/xxxxx-xxxxx.json"
# service_account_file = "/Users/nratel/.jenkins/workspace/BuildApp_DailyTest_Android/Build/BuildGame/builders/build_app/Credentials/Android/GoogleService/xxxxx-xxxxx.json"
credentials = Credentials.from_service_account_file(service_account_file, scopes=['https://www.googleapis.com/auth/androidpublisher'])
service = google_client_build('androidpublisher', 'v3', credentials=credentials)
if credentials.expired and credentials.refresh_token:credentials.refresh(Request())# 流程文档: https://developers.google.com/android-publisher/edits?hl=zh-cn
# 可选轨道和状态:https://developers.google.com/android-publisher/tracks#ff-track-name
# API文档:https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits.htmlpackage_name = "com.xxx.xxx"
aab_file = "/Users/NRatel/Desktop/xxxxx_xxxxx_v1.4.1(49).0_release_1206_2109.aab"
#aab_file = "/Users/nratel/Projects/xxxxx/BuiltResult/BuiltApk/xxxxx_xxxxx_v1.4.1(49).0_release_1206_2109.aab"
track = "internal"              #设为内测轨道(可选:alpha、beta、internal/qa(内测轨道)、production(正式版轨道)
status = "draft"                #设为完成状态(可选:draft(草稿版本)、inProgress(分阶段发布,需配合 userFraction字段)、halted(暂停分阶段发布)、completed(完成)# 1、使用 service.edits().insert 创建新修改,得到 edit_id
# https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits.html#insert
inert_request = service.edits().insert(body = {}, packageName = package_name
)
inert_response = inert_request.execute()
edit_id = inert_response['id']
print(f"inert_response: {inert_response}")# 2、使用 service.edits().bundles().upload 上传 aab,得到 本次上传的 versionCode
# (上传到某个存储域中,以便分配给本修改或后续修改中的某个轨道。)
# https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits.bundles.html#upload
aab_upload_request = service.edits().bundles().upload(editId = edit_id,packageName = package_name,media_body = aab_file,media_mime_type = 'application/octet-stream'
)
# aab_upload_request.http.timeout = 300
aab_upload_response = aab_upload_request.execute()
versionCode = aab_upload_response['versionCode']
print(f"aab_upload_response: {aab_upload_response}")# 3、使用 service.edits().tracks().update 将 aab 分配到指定轨道
# https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits.tracks.html#update
track_update_request = service.edits().tracks().update(editId = edit_id,track = track,packageName = package_name,body = {'releases': [{'versionCodes': [versionCode],'status': status}]}
)
track_update_response = track_update_request.execute()
print(f"track_update_response: {track_update_response}")# 4、使用 service.edits().commit 提交 edit 中的更改,从而替换应用的当前状态。
# 与通过 Play 管理中心进行更改时一样,这些更改可能数小时后才能生效。
# https://googleapis.github.io/google-api-python-client/docs/dyn/androidpublisher_v3.edits.html#commit
commit_request = service.edits().commit(editId = edit_id,packageName = package_name
)
commit_response = commit_request.execute()
print(f"commit_response: {commit_response}")# 关闭服务
service.close()
http://www.dtcms.com/a/359191.html

相关文章:

  • DFS 回溯 【各种题型+对应LeetCode习题练习】
  • 【多项式】快速莫比乌斯变换(FMT)
  • CCS自定义函数.h与.c问题解决办法
  • Android15适配16kb
  • 计算机毕设项目 基于Python与机器学习的B站视频热度分析与预测系统 基于随机森林算法的B站视频内容热度预测系统
  • Robolectric拿到当前的Activity
  • 轻量化模型-知识蒸馏1
  • Wheat Gene ID Convert Tool 小麦中国春不同参考基因组GeneID转换在线工具
  • 2025年外贸服装跟单管理软件TOP3推荐榜单
  • 手动安装的node到nvm吧版本管理的过程。
  • 基于Docker部署的Teable应用
  • [特殊字符]️ STL 容器快速参考手册
  • 海盗王64位dx9客户端修改篇之三
  • 【有序集合 有序映射 懒删除堆】 3510. 移除最小数对使数组有序 II|2608
  • 9. 函数和匿名函数(一)
  • enumerate 和for in搭配使用
  • 接雨水,leetCode热题100,C++实现
  • 【随笔】【Debian】【ArchLinux】基于Debian和ArchLinux的ISO镜像和虚拟机VM的系统镜像获取安装
  • C++的迭代器和指针的区别
  • 「日拱一码」066 深度学习——Transformer
  • Flutter MVVM+provider的基本示例
  • Qt中的锁和条件变量和信号量
  • Science:机器学习模型进行遗传变异外显率预测
  • 线段树相关算法题(5)
  • 【大语言模型 30】指令微调数据工程:高质量数据集构建
  • audioLDM模型代码阅读(二)——HiFi-GAN模型代码分析
  • 【光照】[光照模型]发展里程碑时间线
  • C++ 高并发内存池项目——无锁化设计、TLS 线程隔离与内存碎片优化
  • fork详解(附经典计算题)
  • 【系列07】端侧AI:构建与部署高效的本地化AI模型 第6章:知识蒸馏(Knowledge Distillation