{"id":"fe3cf309-f094-4d41-9ce9-3026ce56d5d2","shortId":"cmfTeX","kind":"skill","title":"play-store-release","tagline":"27 Android skills for AI agents (Claude Code, Codex, Cursor). Fixes Supabase auth, Hilt errors, design inconsistency, kapt→ksp, missing UiState states. Reduced my token bills 5×. FitGenZ AI shipped in 18 days.","description":"# Play Store Release\r\n\r\n## Release checklist — complete before every submission\r\n\r\n### 1. Version management\r\n\r\n```kotlin\r\n// build.gradle.kts — increment both on every release\r\nandroid {\r\n    defaultConfig {\r\n        versionCode = 12           // integer, must increment every upload\r\n        versionName = \"2.4.0\"     // human-readable, semantic versioning\r\n    }\r\n}\r\n\r\n// ✅ Automate versionCode in CI using build number\r\nval versionCode = System.getenv(\"BUILD_NUMBER\")?.toIntOrNull() ?: 1\r\n```\r\n\r\n### 2. Release build — required configuration\r\n\r\n```kotlin\r\nbuildTypes {\r\n    release {\r\n        isMinifyEnabled = true           // required — reduces APK size\r\n        isShrinkResources = true         // required — removes unused resources\r\n        isDebuggable = false             // never ship debuggable release\r\n        proguardFiles(\r\n            getDefaultProguardFile(\"proguard-android-optimize.txt\"),\r\n            \"proguard-rules.pro\"\r\n        )\r\n    }\r\n}\r\n```\r\n\r\n### 3. Build release AAB (not APK)\r\n\r\n```bash\r\n# Play Store requires AAB since Aug 2021\r\n./gradlew bundleProdRelease\r\n\r\n# Output: app/build/outputs/bundle/prodRelease/app-prod-release.aab\r\n```\r\n\r\n### 4. Target API level — must meet Play Store requirements\r\n\r\n```kotlin\r\n// Play Store requires targetSdk within 1 year of latest Android release\r\n// As of 2025: minimum targetSdk = 34, recommended = 35\r\ndefaultConfig {\r\n    minSdk = 24\r\n    targetSdk = 35    // must be current — Google enforces this\r\n    compileSdk = 35\r\n}\r\n```\r\n\r\n### 5. Data Safety form — required since 2022\r\n\r\n```\r\nRequired declarations in Play Console → App content → Data safety:\r\n  - What data your app collects (name, email, device ID, etc.)\r\n  - Whether data is encrypted in transit\r\n  - Whether users can request deletion\r\n  - Whether data is shared with third parties\r\n  \r\nFailure to complete = app rejected\r\n```\r\n\r\n### 6. Content rating — required for all apps\r\n\r\n```\r\nPlay Console → App content → Content ratings\r\n  - Complete the IARC questionnaire\r\n  - Rating applies globally (ESRB, PEGI, etc.)\r\n  - Get rating BEFORE submitting for review\r\n```\r\n\r\n### 7. Store listing requirements\r\n\r\n```\r\nApp icon:       512×512 PNG, max 1MB, no alpha\r\nFeature graphic: 1024×500 PNG/JPG, required for featured placement\r\nScreenshots:    2-8 per form factor (phone, tablet)\r\n                Phone: 1080×1920 or 1920×1080 minimum\r\n                Tablet: 1920×1200 or 2560×1600 minimum\r\nShort description: max 80 characters\r\nFull description:  max 4000 characters\r\n```\r\n\r\n### 8. Release tracks — use the right one\r\n\r\n```\r\nInternal testing  → up to 100 testers, instant publish\r\nClosed testing    → specific tester groups, review required\r\nOpen testing      → anyone can join, review required  \r\nProduction        → full rollout, review required (3-7 days first time)\r\n\r\n✅ Strategy:\r\n  1. Internal testing → get team feedback\r\n  2. Closed alpha → beta testers\r\n  3. Staged production rollout → 10% → 50% → 100%\r\n```\r\n\r\n### 9. App signing — use Play App Signing\r\n\r\n```\r\nPlay Console → Setup → App integrity → Play App Signing\r\n  - Google manages your release key\r\n  - You upload with upload key (upload key compromise is recoverable)\r\n  - Enables AAB optimization\r\n  \r\n✅ Enroll in Play App Signing BEFORE first release\r\n❌ Managing your own release key = unrecoverable if lost\r\n```\r\n\r\n### 10. ProGuard mapping — upload for crash reports\r\n\r\n```kotlin\r\n// Upload mapping file so Crashlytics shows real stack traces\r\nbuildTypes {\r\n    release {\r\n        // mapping.txt generated at build/outputs/mapping/release/mapping.txt\r\n        // Upload to Play Console → Android vitals → Deobfuscation files\r\n        // Or configure Crashlytics auto-upload:\r\n    }\r\n}\r\n\r\n// build.gradle.kts\r\nplugins { id(\"com.google.firebase.crashlytics\") }\r\nfirebaseCrashlytics {\r\n    mappingFileUploadEnabled = true  // auto-uploads on release build\r\n}\r\n```\r\n\r\n## Pre-launch checklist\r\n\r\n- [ ] `isDebuggable = false` in release build type\r\n- [ ] `isMinifyEnabled = true` and `isShrinkResources = true`\r\n- [ ] `targetSdk = 35` (current requirement)\r\n- [ ] `versionCode` incremented from last upload\r\n- [ ] No test code or mock data in release build\r\n- [ ] API keys point to production endpoints (not dev/staging)\r\n- [ ] All permissions declared in manifest and justified in Data Safety\r\n- [ ] Proguard rules preserve DTO classes for serialization\r\n- [ ] All 3rd party SDK privacy policies added to Data Safety\r\n- [ ] App tested on physical device with release build (`adb install`)\r\n- [ ] Crash monitoring enabled (Firebase Crashlytics or similar)\r\n- [ ] Analytics enabled for production\r\n\r\n## Common Mistakes\r\n\r\n❌ Uploading APK instead of AAB — rejected since 2021\r\n❌ `isDebuggable = true` in release — security violation, rejected by Play\r\n❌ Forgetting to increment versionCode — rejected, same version already uploaded\r\n❌ targetSdk too old — Play Store rejection after grace period\r\n❌ No mapping file upload — crash reports show obfuscated stack traces\r\n❌ Incomplete Data Safety form — app removed from store","tags":["play","store","release","android","agent","skills","piyushverma0","agent-skills","ai-agent","antigravity","claude-code","codex"],"capabilities":["skill","source-piyushverma0","skill-play-store-release","topic-agent-skills","topic-ai-agent","topic-android","topic-antigravity","topic-claude-code","topic-codex","topic-cursor","topic-gemini-cli","topic-hilt","topic-jetpack-compose","topic-kotlin","topic-material3"],"categories":["android-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/piyushverma0/android-agent-skills/play-store-release","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add piyushverma0/android-agent-skills","source_repo":"https://github.com/piyushverma0/android-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (5,019 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:09:10.649Z","embedding":null,"createdAt":"2026-05-18T13:14:50.454Z","updatedAt":"2026-05-18T19:09:10.649Z","lastSeenAt":"2026-05-18T19:09:10.649Z","tsv":"'-7':344 '-8':279 '/gradlew':131 '1':47,86,150,349 '10':364,416 '100':320,366 '1024':270 '1080':286,290 '12':60 '1200':294 '1600':297 '18':36 '1920':287,289,293 '1mb':265 '2':87,278,355 '2.4.0':67 '2021':130,564 '2022':183 '2025':158 '24':166 '2560':296 '27':5 '3':117,343,360 '34':161 '35':163,168,176,482 '3rd':525 '4':135 '4000':307 '5':31,177 '50':365 '500':271 '512':261,262 '6':226 '7':255 '8':309 '80':302 '9':367 'aab':120,127,398,561 'ad':530 'adb':542 'agent':10 'ai':9,33 'alpha':267,357 'alreadi':581 'analyt':551 'android':6,57,154,443 'anyon':333 'api':137,499 'apk':99,122,558 'app':189,196,224,232,235,259,368,372,377,380,403,534,606 'app/build/outputs/bundle/prodrelease/app-prod-release.aab':134 'appli':244 'aug':129 'auth':17 'auto':451,461 'auto-upload':450,460 'autom':73 'bash':123 'beta':358 'bill':30 'build':78,83,89,118,465,474,498,541 'build.gradle.kts':51,453 'build/outputs/mapping/release/mapping.txt':438 'buildtyp':93,433 'bundleprodreleas':132 'charact':303,308 'checklist':42,469 'ci':76 'class':521 'claud':11 'close':324,356 'code':12,492 'codex':13 'collect':197 'com.google.firebase.crashlytics':456 'common':555 'compilesdk':175 'complet':43,223,239 'compromis':394 'configur':91,448 'consol':188,234,375,442 'content':190,227,236,237 'crash':421,544,596 'crashlyt':428,449,548 'current':171,483 'cursor':14 'data':178,191,194,204,215,495,515,532,603 'day':37,345 'debugg':111 'declar':185,509 'defaultconfig':58,164 'delet':213 'deobfusc':445 'descript':300,305 'design':20 'dev/staging':506 'devic':200,538 'dto':520 'email':199 'enabl':397,546,552 'encrypt':206 'endpoint':504 'enforc':173 'enrol':400 'error':19 'esrb':246 'etc':202,248 'everi':45,55,64 'factor':282 'failur':221 'fals':108,471 'featur':268,275 'feedback':354 'file':426,446,594 'firebas':547 'firebasecrashlyt':457 'first':346,406 'fitgenz':32 'fix':15 'forget':574 'form':180,281,605 'full':304,339 'generat':436 'get':249,352 'getdefaultproguardfil':114 'global':245 'googl':172,382 'grace':590 'graphic':269 'group':328 'hilt':18 'human':69 'human-read':68 'iarc':241 'icon':260 'id':201,455 'incomplet':602 'inconsist':21 'increment':52,63,486,576 'instal':543 'instant':322 'instead':559 'integ':61 'integr':378 'intern':316,350 'isdebugg':107,470,565 'isminifyen':95,476 'isshrinkresourc':101,479 'join':335 'justifi':513 'kapt':22 'key':386,391,393,412,500 'kotlin':50,92,144,423 'ksp':23 'last':488 'latest':153 'launch':468 'level':138 'list':257 'lost':415 'manag':49,383,408 'manifest':511 'map':418,425,593 'mapping.txt':435 'mappingfileuploaden':458 'max':264,301,306 'meet':140 'minimum':159,291,298 'minsdk':165 'miss':24 'mistak':556 'mock':494 'monitor':545 'must':62,139,169 'name':198 'never':109 'number':79,84 'obfusc':599 'old':585 'one':315 'open':331 'optim':399 'output':133 'parti':220,526 'pegi':247 'per':280 'period':591 'permiss':508 'phone':283,285 'physic':537 'placement':276 'play':2,38,124,141,145,187,233,371,374,379,402,441,573,586 'play-store-releas':1 'plugin':454 'png':263 'png/jpg':272 'point':501 'polici':529 'pre':467 'pre-launch':466 'preserv':519 'privaci':528 'product':338,362,503,554 'proguard':417,517 'proguard-android-optimize.txt':115 'proguard-rules.pro':116 'proguardfil':113 'publish':323 'questionnair':242 'rate':228,238,243,250 'readabl':70 'real':430 'recommend':162 'recover':396 'reduc':27,98 'reject':225,562,571,578,588 'releas':4,40,41,56,88,94,112,119,155,310,385,407,411,434,464,473,497,540,568 'remov':104,607 'report':422,597 'request':212 'requir':90,97,103,126,143,147,181,184,229,258,273,330,337,342,484 'resourc':106 'review':254,329,336,341 'right':314 'rollout':340,363 'rule':518 'safeti':179,192,516,533,604 'screenshot':277 'sdk':527 'secur':569 'semant':71 'serial':523 'setup':376 'share':217 'ship':34,110 'short':299 'show':429,598 'sign':369,373,381,404 'similar':550 'sinc':128,182,563 'size':100 'skill':7 'skill-play-store-release' 'source-piyushverma0' 'specif':326 'stack':431,600 'stage':361 'state':26 'store':3,39,125,142,146,256,587,609 'strategi':348 'submiss':46 'submit':252 'supabas':16 'system.getenv':82 'tablet':284,292 'target':136 'targetsdk':148,160,167,481,583 'team':353 'test':317,325,332,351,491,535 'tester':321,327,359 'third':219 'time':347 'tointornul':85 'token':29 'topic-agent-skills' 'topic-ai-agent' 'topic-android' 'topic-antigravity' 'topic-claude-code' 'topic-codex' 'topic-cursor' 'topic-gemini-cli' 'topic-hilt' 'topic-jetpack-compose' 'topic-kotlin' 'topic-material3' 'trace':432,601 'track':311 'transit':208 'true':96,102,459,477,480,566 'type':475 'uistat':25 'unrecover':413 'unus':105 'upload':65,388,390,392,419,424,439,452,462,489,557,582,595 'use':77,312,370 'user':210 'val':80 'version':48,72,580 'versioncod':59,74,81,485,577 'versionnam':66 'violat':570 'vital':444 'whether':203,209,214 'within':149 'year':151","prices":[{"id":"88616a5e-a061-4cd8-9494-d506c1f39658","listingId":"fe3cf309-f094-4d41-9ce9-3026ce56d5d2","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"piyushverma0","category":"android-agent-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:14:50.454Z"}],"sources":[{"listingId":"fe3cf309-f094-4d41-9ce9-3026ce56d5d2","source":"github","sourceId":"piyushverma0/android-agent-skills/play-store-release","sourceUrl":"https://github.com/piyushverma0/android-agent-skills/tree/main/skills/play-store-release","isPrimary":false,"firstSeenAt":"2026-05-18T13:14:50.454Z","lastSeenAt":"2026-05-18T19:09:10.649Z"}],"details":{"listingId":"fe3cf309-f094-4d41-9ce9-3026ce56d5d2","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"piyushverma0","slug":"play-store-release","github":{"repo":"piyushverma0/android-agent-skills","stars":8,"topics":["agent-skills","ai-agent","android","antigravity","claude-code","codex","cursor","gemini-cli","hilt","jetpack-compose","kotlin","material3","open-source","skills","supabase"],"license":"mit","html_url":"https://github.com/piyushverma0/android-agent-skills","pushed_at":"2026-04-27T09:15:31Z","description":"27 Android skills for AI agents (Claude Code, Codex, Cursor). Fixes Supabase auth, Hilt errors, design inconsistency, kapt→ksp, missing UiState states. Reduced my token bills 5×. FitGenZ AI shipped in 18 days.","skill_md_sha":"1ec0aaa35cbe32a4c99c70313b92c35615dc892d","skill_md_path":"skills/play-store-release/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/piyushverma0/android-agent-skills/tree/main/skills/play-store-release"},"layout":"multi","source":"github","category":"android-agent-skills","frontmatter":{},"skills_sh_url":"https://skills.sh/piyushverma0/android-agent-skills/play-store-release"},"updatedAt":"2026-05-18T19:09:10.649Z"}}