name: Google Play Console description: Google Play商店发布与管理专业知识 version: 1.0.0 category: Android分发 slug: google-play-console status: active
Google Play Console技能
概述
本技能提供Google Play商店发布与管理的全面能力。它支持与Google Play开发者API交互、商店列表管理、发布轨道配置以及应用生命周期管理。
允许的工具
bash- 执行bundletool、Gradle和Google Cloud命令read- 分析商店列表文件和配置write- 生成元数据文件和API配置edit- 更新Play商店元数据glob- 搜索元数据和图形文件grep- 在配置中搜索模式
能力
Google Play开发者API
-
API认证
- 配置服务账户凭据
- 实现OAuth 2.0认证
- 处理API配额和限制
- 配置项目权限
-
应用管理
- 创建和管理应用列表
- 配置应用内容评级
- 管理目标受众设置
- 处理应用分类
构建管理
-
AAB上传
- 上传Android应用包(AAB)
- 使用bundletool验证AAB文件
- 配置构建版本管理
- 处理上传错误
-
构建信息
- 跟踪上传状态
- 配置原生代码调试
- 管理反混淆文件
- 处理扩展文件(OBB)
发布管理
-
发布轨道
- 配置内部测试轨道
- 设置封闭测试(Alpha)
- 管理公开测试(Beta)
- 处理生产发布
-
分阶段发布
- 配置百分比发布
- 监控发布指标
- 处理发布暂停/恢复
- 实施回滚策略
商店列表
-
应用详情
- 配置应用标题和描述
- 设置简短和完整描述
- 管理应用分类
- 配置内容评级
-
图形资源
- 上传屏幕截图
- 配置特色图形
- 管理宣传视频
- 处理图标要求
-
本地化
- 配置支持的语言
- 管理翻译列表
- 处理默认语言
- 导入/导出翻译
数据安全
- 数据安全声明
- 配置数据收集披露
- 声明数据共享实践
- 设置安全实践
- 处理数据删除请求
应用内产品
- 产品配置
- 创建托管产品
- 配置订阅
- 设置订阅基础计划
- 处理促销优惠
测试
-
内部应用分享
- 配置内部分享
- 生成可分享链接
- 管理测试版本
- 处理测试者反馈
-
预发布报告
- 审查自动化测试
- 分析崩溃报告
- 检查无障碍问题
- 审查安全发现
目标流程
本技能与以下流程集成:
android-playstore-publishing.js- Play商店发布beta-testing-setup.js- Beta分发app-store-optimization.js- ASO优化automated-release-management.js- 发布自动化
依赖项
必需
- Google Play开发者账户
- 具有API访问权限的服务账户
- Android SDK(用于bundletool)
- 已签名的AAB文件
可选
- Fastlane
- Google Cloud CLI
- bundletool
配置
服务账户设置
# 在Google Cloud控制台创建服务账户
# 1. 前往Google Cloud控制台
# 2. 创建新服务账户
# 3. 授予“服务账户用户”角色
# 4. 创建JSON密钥文件
# 链接到Play控制台
# 1. 前往Play控制台 > 设置 > API访问
# 2. 链接Google Cloud项目
# 3. 向服务账户授予权限
凭据文件
{
"type": "service_account",
"project_id": "your-project-id",
"private_key_id": "key-id",
"private_key": "-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
",
"client_email": "service-account@project.iam.gserviceaccount.com",
"client_id": "123456789",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token"
}
使用示例
Fastlane Supply配置
# fastlane/Fastfile
lane :deploy_production do
gradle(
task: "bundle",
build_type: "Release"
)
supply(
track: "production",
aab: "./app/build/outputs/bundle/release/app-release.aab",
json_key: "./fastlane/play-store-key.json",
package_name: "com.example.myapp",
# 发布百分比(0.0到1.0)
rollout: "0.1",
# 跳过元数据上传
skip_upload_metadata: false,
skip_upload_images: false,
skip_upload_screenshots: false,
skip_upload_changelogs: false,
# 发布说明
release_status: "completed",
# 版本代码
version_code: 42,
# 崩溃报告的映射文件
mapping: "./app/build/outputs/mapping/release/mapping.txt"
)
end
lane :deploy_beta do
gradle(task: "bundle", build_type: "Release")
supply(
track: "beta",
aab: "./app/build/outputs/bundle/release/app-release.aab",
json_key: "./fastlane/play-store-key.json"
)
end
lane :promote_to_production do
supply(
track: "beta",
track_promote_to: "production",
json_key: "./fastlane/play-store-key.json",
rollout: "0.2"
)
end
元数据目录结构
fastlane/metadata/android/
├── en-US/
│ ├── title.txt # 最多30个字符
│ ├── short_description.txt # 最多80个字符
│ ├── full_description.txt # 最多4000个字符
│ ├── changelogs/
│ │ ├── default.txt
│ │ ├── 42.txt # 特定版本代码
│ │ └── 43.txt
│ └── images/
│ ├── phoneScreenshots/
│ │ ├── 1_home.png
│ │ ├── 2_feature.png
│ │ └── 3_settings.png
│ ├── sevenInchScreenshots/
│ ├── tenInchScreenshots/
│ ├── tvScreenshots/
│ ├── wearScreenshots/
│ ├── featureGraphic.png # 1024x500
│ ├── icon.png # 512x512
│ ├── promoGraphic.png # 180x120
│ └── tvBanner.png # 1280x720
├── es-ES/
│ └── ... (相同结构)
└── default.txt # 默认语言代码
Google Play开发者API使用
// 示例:通过Google Play开发者API发布
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport
import com.google.api.client.json.gson.GsonFactory
import com.google.api.services.androidpublisher.AndroidPublisher
import com.google.api.services.androidpublisher.model.*
import com.google.auth.http.HttpCredentialsAdapter
import com.google.auth.oauth2.GoogleCredentials
import java.io.FileInputStream
class PlayStorePublisher(
private val packageName: String,
credentialsPath: String
) {
private val publisher: AndroidPublisher
init {
val credentials = GoogleCredentials
.fromStream(FileInputStream(credentialsPath))
.createScoped(listOf("https://www.googleapis.com/auth/androidpublisher"))
publisher = AndroidPublisher.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
GsonFactory.getDefaultInstance(),
HttpCredentialsAdapter(credentials)
)
.setApplicationName("MyApp Publisher")
.build()
}
fun uploadAndPublish(aabPath: String, track: String, releaseNotes: Map<String, String>) {
val edits = publisher.edits()
// 创建编辑
val edit = edits.insert(packageName, null).execute()
val editId = edit.id
try {
// 上传AAB
val aabFile = java.io.File(aabPath)
val uploadResponse = edits.bundles()
.upload(packageName, editId, FileContent("application/octet-stream", aabFile))
.execute()
val versionCode = uploadResponse.versionCode
// 创建发布
val release = TrackRelease().apply {
this.versionCodes = listOf(versionCode.toLong())
this.status = "completed"
this.releaseNotes = releaseNotes.map { (lang, notes) ->
LocalizedText().apply {
language = lang
text = notes
}
}
}
// 更新轨道
val trackConfig = Track().apply {
this.track = track
this.releases = listOf(release)
}
edits.tracks()
.update(packageName, editId, track, trackConfig)
.execute()
// 提交编辑
edits.commit(packageName, editId).execute()
println("成功将版本 $versionCode 发布到 $track")
} catch (e: Exception) {
// 失败时删除编辑
edits.delete(packageName, editId).execute()
throw e
}
}
}
数据安全配置
# data_safety.yaml
data_collection:
- category: "个人信息"
types:
- "姓名"
- "电子邮件地址"
purposes:
- "应用功能"
- "账户管理"
is_optional: false
- category: "财务信息"
types:
- "购买历史"
purposes:
- "应用功能"
is_optional: false
data_sharing:
- category: "分析"
shared_with: "第三方"
purpose: "分析"
security_practices:
data_encrypted_in_transit: true
data_deletion_available: true
independent_security_review: false
Bundletool命令
# 验证AAB
bundletool validate --bundle=app-release.aab
# 从AAB构建APKs
bundletool build-apks \
--bundle=app-release.aab \
--output=app.apks \
--ks=release.keystore \
--ks-key-alias=release \
--ks-pass=pass:password
# 在设备上安装APKs
bundletool install-apks --apks=app.apks
# 获取设备规格
bundletool get-device-spec --output=device-spec.json
# 为特定设备构建APKs
bundletool build-apks \
--bundle=app-release.aab \
--output=device.apks \
--device-spec=device-spec.json
版本代码管理
// build.gradle.kts
android {
defaultConfig {
// 基于CI构建号自动递增版本代码
val buildNumber = System.getenv("BUILD_NUMBER")?.toIntOrNull() ?: 1
versionCode = buildNumber
versionName = "1.0.${buildNumber}"
}
}
质量门
商店列表要求
- 标题:最多30个字符
- 简短描述:最多80个字符
- 完整描述:最多4000个字符
- 特色图形:1024x500 PNG或JPEG
- 屏幕截图:每种设备类型2-8张
- 图标:512x512 32位PNG
发布要求
- 已签名的AAB文件
- 目标API级别合规
- 64位支持
- 已声明权限
- 数据安全表单完成
合规性
- 内容评级问卷
- 目标受众声明
- 广告声明
- 数据安全部分
相关技能
fastlane-cicd- 构建自动化kotlin-compose- Android开发firebase-mobile- Firebase集成
版本历史
- 1.0.0 - 初始版本,支持Play开发者API v3