用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/a5c-ai/babysitter --skill google-play-console命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | Google Play Console |
| description | Google Play Store publishing and management expertise |
| version | 1.0.0 |
| category | Android Distribution |
| slug | google-play-console |
| status | active |
| graph | {"domains":["domain:mobile"],"specializations":["specialization:mobile-development"],"skillAreas":["skill-area:app-store-deployment","skill-area:android-native"],"roles":["role:mobile-engineer"],"workflows":["workflow:feature-development","workflow:release-management"],"topics":["topic:accessibility"]} |
This skill provides comprehensive capabilities for Google Play Store publishing and management. It enables interaction with Google Play Developer API, store listing management, release track configuration, and app lifecycle management.
bash - Execute bundletool, Gradle, and Google Cloud commandsread - Analyze store listing files and configurationswrite - Generate metadata files and API configurationsedit - Update Play Store metadataglob - Search for metadata and graphics filesgrep - Search for patterns in configurationsAPI Authentication
App Management
AAB Upload
Build Information
Release Tracks
Staged Rollouts
App Details
Graphics Assets
Localization
Internal App Sharing
Pre-launch Reports
This skill integrates with the following processes:
android-playstore-publishing.js - Play Store publishingbeta-testing-setup.js - Beta distributionapp-store-optimization.js - ASO optimizationautomated-release-management.js - Release automation# Create service account in Google Cloud Console
# 1. Go to Google Cloud Console
# 2. Create new service account
# 3. Grant "Service Account User" role
# 4. Create JSON key file
# Link to Play Console
# 1. Go to Play Console > Settings > API access
# 2. Link Google Cloud project
# 3. Grant permissions to service account
{
"type": "service_account",
"project_id": "your-project-id",
"private_key_id": "key-id",
"private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
"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/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",
# Rollout percentage (0.0 to 1.0)
rollout: "0.1",
# Skip metadata upload
skip_upload_metadata: false,
skip_upload_images: false,
skip_upload_screenshots: false,
skip_upload_changelogs: false,
# Release notes
release_status: "completed",
# Version code
version_code: 42,
# Mapping file for crash reports
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:
)
lane
supply(
,
,
,
)
fastlane/metadata/android/
├── en-US/
│ ├── title.txt # Max 30 chars
│ ├── short_description.txt # Max 80 chars
│ ├── full_description.txt # Max 4000 chars
│ ├── changelogs/
│ │ ├── default.txt
│ │ ├── 42.txt # Version code specific
│ │ └── 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/
│ └── ... (same structure)
└── default.txt # Default language code
// Example: Publishing via Google Play Developer 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()
// Create edit
val edit = edits.insert(packageName, null).execute()
val editId = edit.id
try {
// Upload AAB
val aabFile = java.io.File(aabPath)
val uploadResponse = edits.bundles()
.upload(packageName, editId, FileContent("application/octet-stream", aabFile))
.execute()
versionCode = uploadResponse.versionCode
release = TrackRelease().apply {
.versionCodes = listOf(versionCode.toLong())
.status =
.releaseNotes = releaseNotes.map { (lang, notes) ->
LocalizedText().apply {
language = lang
text = notes
}
}
}
trackConfig = Track().apply {
.track = track
.releases = listOf(release)
}
edits.tracks()
.update(packageName, editId, track, trackConfig)
.execute()
edits.commit(packageName, editId).execute()
println()
} (e: Exception) {
edits.delete(packageName, editId).execute()
e
}
}
}
# data_safety.yaml
data_collection:
- category: "Personal info"
types:
- "Name"
- "Email address"
purposes:
- "App functionality"
- "Account management"
is_optional: false
- category: "Financial info"
types:
- "Purchase history"
purposes:
- "App functionality"
is_optional: false
data_sharing:
- category: "Analytics"
shared_with: "Third parties"
purpose: "Analytics"
security_practices:
data_encrypted_in_transit: true
data_deletion_available: true
independent_security_review: false
# Validate AAB
bundletool validate --bundle=app-release.aab
# Build APKs from AAB
bundletool build-apks \
--bundle=app-release.aab \
--output=app.apks \
--ks=release.keystore \
--ks-key-alias=release \
--ks-pass=pass:password
# Install APKs on device
bundletool install-apks --apks=app.apks
# Get device spec
bundletool get-device-spec --output=device-spec.json
# Build APKs for specific device
bundletool build-apks \
--bundle=app-release.aab \
--output=device.apks \
--device-spec=device-spec.json
// build.gradle.kts
android {
defaultConfig {
// Auto-increment version code based on CI build number
val buildNumber = System.getenv("BUILD_NUMBER")?.toIntOrNull() ?: 1
versionCode = buildNumber
versionName = "1.0.${buildNumber}"
}
}
fastlane-cicd - Build automationkotlin-compose - Android developmentfirebase-mobile - Firebase integration