{"id":"9bf12084-8fab-4257-b86b-2a88ecc226d6","shortId":"q8yFfC","kind":"skill","title":"gradle","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":"# Gradle Build System\r\n\r\n## Rule 1: Version Catalog is the only place for versions\r\n\r\n```toml\r\n# gradle/libs.versions.toml — single source of truth\r\n[versions]\r\nagp = \"8.5.2\"\r\nkotlin = \"2.0.21\"\r\nksp = \"2.0.21-1.0.25\"\r\n\r\n[libraries]\r\nandroidx-core-ktx = { group = \"androidx.core\", name = \"core-ktx\", version.ref = \"coreKtx\" }\r\n\r\n[plugins]\r\nandroid-application = { id = \"com.android.application\", version.ref = \"agp\" }\r\nkotlin-android = { id = \"org.jetbrains.kotlin.android\", version.ref = \"kotlin\" }\r\n```\r\n\r\n```kotlin\r\n// ✅ Use catalog aliases everywhere — never hardcode versions\r\nimplementation(libs.androidx.core.ktx)\r\nplugins { alias(libs.plugins.android.application) }\r\n\r\n// ❌ Hardcoded versions anywhere in build files\r\nimplementation(\"androidx.core:core-ktx:1.13.1\")\r\n```\r\n\r\n## Rule 2: Convention Plugins for multi-module consistency\r\n\r\n```kotlin\r\n// buildSrc/src/main/kotlin/AndroidLibraryConventionPlugin.kt\r\nclass AndroidLibraryConventionPlugin : Plugin<Project> {\r\n    override fun apply(target: Project) = with(target) {\r\n        pluginManager.apply(\"com.android.library\")\r\n        pluginManager.apply(\"org.jetbrains.kotlin.android\")\r\n\r\n        extensions.configure<LibraryExtension> {\r\n            compileSdk = 35\r\n            defaultConfig.minSdk = 24\r\n            compileOptions {\r\n                sourceCompatibility = JavaVersion.VERSION_17\r\n                targetCompatibility = JavaVersion.VERSION_17\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// buildSrc/build.gradle.kts\r\nplugins { `kotlin-dsl` }\r\ndependencies {\r\n    implementation(libs.android.gradlePlugin)\r\n    implementation(libs.kotlin.gradlePlugin)\r\n}\r\n\r\n// Any feature module build.gradle.kts\r\nplugins {\r\n    id(\"convention.android.library\")   // one line instead of 20\r\n}\r\n```\r\n\r\n## Rule 3: Build variants for environments\r\n\r\n```kotlin\r\n// ✅ Product flavors for different environments\r\nandroid {\r\n    flavorDimensions += \"environment\"\r\n\r\n    productFlavors {\r\n        create(\"dev\") {\r\n            dimension = \"environment\"\r\n            applicationIdSuffix = \".dev\"\r\n            versionNameSuffix = \"-dev\"\r\n            buildConfigField(\"String\", \"BASE_URL\", \"\\\"https://dev-api.myapp.com/\\\"\")\r\n        }\r\n        create(\"staging\") {\r\n            dimension = \"environment\"\r\n            applicationIdSuffix = \".staging\"\r\n            versionNameSuffix = \"-staging\"\r\n            buildConfigField(\"String\", \"BASE_URL\", \"\\\"https://staging-api.myapp.com/\\\"\")\r\n        }\r\n        create(\"prod\") {\r\n            dimension = \"environment\"\r\n            buildConfigField(\"String\", \"BASE_URL\", \"\\\"https://api.myapp.com/\\\"\")\r\n        }\r\n    }\r\n}\r\n// Results in: devDebug, devRelease, stagingDebug, stagingRelease, prodDebug, prodRelease\r\n```\r\n\r\n## Rule 4: Signing config\r\n\r\n```kotlin\r\n// ✅ Read signing from environment — never commit keystore or passwords\r\nandroid {\r\n    signingConfigs {\r\n        create(\"release\") {\r\n            val keystorePath = System.getenv(\"KEYSTORE_PATH\") ?: \"\"\r\n            val keystorePassword = System.getenv(\"KEYSTORE_PASSWORD\") ?: \"\"\r\n            val keyAlias = System.getenv(\"KEY_ALIAS\") ?: \"\"\r\n            val keyPassword = System.getenv(\"KEY_PASSWORD\") ?: \"\"\r\n\r\n            if (keystorePath.isNotEmpty()) {\r\n                storeFile = file(keystorePath)\r\n                storePassword = keystorePassword\r\n                this.keyAlias = keyAlias\r\n                this.keyPassword = keyPassword\r\n            }\r\n        }\r\n    }\r\n    buildTypes {\r\n        release {\r\n            signingConfig = signingConfigs.getByName(\"release\")\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n## Rule 5: Build performance — always enabled\r\n\r\n```properties\r\n# gradle.properties\r\norg.gradle.jvmargs=-Xmx4096m -XX:+UseParallelGC\r\norg.gradle.configuration-cache=true\r\norg.gradle.parallel=true\r\norg.gradle.caching=true\r\nandroid.nonTransitiveRClass=true\r\nandroid.enableR8.fullMode=true\r\n```\r\n\r\n## Rule 6: KSP migration from kapt\r\n\r\n```kotlin\r\n// ❌ kapt — slow, requires Java stub generation\r\nplugins { id(\"kotlin-kapt\") }\r\nkapt(libs.hilt.compiler)\r\nkapt(libs.room.compiler)\r\n\r\n// ✅ KSP — 2-3× faster, Kotlin-native\r\nplugins { alias(libs.plugins.ksp) }\r\nksp(libs.hilt.compiler)\r\nksp(libs.room.compiler)\r\n```\r\n\r\n## Common Mistakes\r\n\r\n❌ Version numbers in build files — always use `libs.*` catalog references\r\n❌ kapt — migrate to ksp for all annotation processors\r\n❌ Missing `org.gradle.configuration-cache=true` — 30-50% slower builds\r\n❌ Root build.gradle.kts with dependencies — root is plugins only\r\n❌ Hardcoded signing credentials — read from environment variables\r\n❌ No product flavors — use dev/staging/prod for env-specific config","tags":["gradle","android","agent","skills","piyushverma0","agent-skills","ai-agent","antigravity","claude-code","codex","cursor","gemini-cli"],"capabilities":["skill","source-piyushverma0","skill-gradle","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/gradle","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 (4,586 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:09.841Z","embedding":null,"createdAt":"2026-05-18T13:14:49.483Z","updatedAt":"2026-05-18T19:09:09.841Z","lastSeenAt":"2026-05-18T19:09:09.841Z","tsv":"'-3':334 '-50':371 '1':39 '1.0.25':61 '1.13.1':114 '17':148,151 '18':33 '2':116,333 '2.0.21':58,60 '20':173 '24':144 '27':2 '3':175 '30':370 '35':142 '4':234 '5':28,288 '6':311 '8.5.2':56 'agent':7 'agp':55,82 'ai':6,30 'alia':101,265,340 'alias':93 'alway':291,353 'android':3,77,85,186,247 'android-appl':76 'android.enabler8.fullmode':308 'android.nontransitiverclass':306 'androidlibraryconventionplugin':127 'androidx':64 'androidx-core-ktx':63 'androidx.core':68,110 'annot':364 'anywher':105 'api.myapp.com':224 'appli':131 'applic':78 'applicationidsuffix':194,207 'auth':14 'base':200,213,222 'bill':27 'build':36,107,176,289,351,373 'build.gradle.kts':165,375 'buildconfigfield':198,211,220 'buildsrc/build.gradle.kts':152 'buildsrc/src/main/kotlin/androidlibraryconventionplugin.kt':125 'buildtyp':282 'cach':300,368 'catalog':41,92,356 'class':126 'claud':8 'code':9 'codex':10 'com.android.application':80 'com.android.library':137 'commit':243 'common':346 'compileopt':145 'compilesdk':141 'config':236,398 'consist':123 'convent':117 'convention.android.library':168 'core':65,71,112 'core-ktx':70,111 'corektx':74 'creat':190,203,216,249 'credenti':384 'cursor':11 'day':34 'defaultconfig.minsdk':143 'depend':157,377 'design':17 'dev':191,195,197 'dev-api.myapp.com':202 'dev/staging/prod':393 'devdebug':227 'devreleas':228 'differ':184 'dimens':192,205,218 'dsl':156 'enabl':292 'env':396 'env-specif':395 'environ':179,185,188,193,206,219,241,387 'error':16 'everywher':94 'extensions.configure':140 'faster':335 'featur':163 'file':108,274,352 'fitgenz':29 'fix':12 'flavor':182,391 'flavordimens':187 'fun':130 'generat':322 'gradl':1,35 'gradle.properties':294 'gradle/libs.versions.toml':49 'group':67 'hardcod':96,103,382 'hilt':15 'id':79,86,167,324 'implement':98,109,158,160 'inconsist':18 'instead':171 'java':320 'javaversion.version':147,150 'kapt':19,315,317,327,328,330,358 'key':264,269 'keyalia':262,279 'keypassword':267,281 'keystor':244,254,259 'keystorepassword':257,277 'keystorepath':252,275 'keystorepath.isnotempty':272 'kotlin':57,84,89,90,124,155,180,237,316,326,337 'kotlin-android':83 'kotlin-dsl':154 'kotlin-kapt':325 'kotlin-n':336 'ksp':20,59,312,332,342,344,361 'ktx':66,72,113 'lib':355 'librari':62 'libs.android.gradleplugin':159 'libs.androidx.core.ktx':99 'libs.hilt.compiler':329,343 'libs.kotlin.gradleplugin':161 'libs.plugins.android.application':102 'libs.plugins.ksp':341 'libs.room.compiler':331,345 'line':170 'migrat':313,359 'miss':21,366 'mistak':347 'modul':122,164 'multi':121 'multi-modul':120 'name':69 'nativ':338 'never':95,242 'number':349 'one':169 'org.gradle.caching':304 'org.gradle.configuration':299,367 'org.gradle.jvmargs':295 'org.gradle.parallel':302 'org.jetbrains.kotlin.android':87,139 'overrid':129 'password':246,260,270 'path':255 'perform':290 'place':45 'plugin':75,100,118,128,153,166,323,339,380 'pluginmanager.apply':136,138 'processor':365 'prod':217 'proddebug':231 'prodreleas':232 'product':181,390 'productflavor':189 'project':133 'properti':293 'read':238,385 'reduc':24 'refer':357 'releas':250,283,286 'requir':319 'result':225 'root':374,378 'rule':38,115,174,233,287,310 'ship':31 'sign':235,239,383 'signingconfig':248,284 'signingconfigs.getbyname':285 'singl':50 'skill':4 'skill-gradle' 'slow':318 'slower':372 'sourc':51 'source-piyushverma0' 'sourcecompat':146 'specif':397 'stage':204,208,210 'staging-api.myapp.com':215 'stagingdebug':229 'stagingreleas':230 'state':23 'storefil':273 'storepassword':276 'string':199,212,221 'stub':321 'supabas':13 'system':37 'system.getenv':253,258,263,268 'target':132,135 'targetcompat':149 'this.keyalias':278 'this.keypassword':280 'token':26 'toml':48 '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' 'true':301,303,305,307,309,369 'truth':53 'uistat':22 'url':201,214,223 'use':91,354,392 'useparallelgc':298 'val':251,256,261,266 'variabl':388 'variant':177 'version':40,47,54,97,104,348 'version.ref':73,81,88 'versionnamesuffix':196,209 'xmx4096m':296 'xx':297","prices":[{"id":"e4942411-c5c3-47fd-8f28-ed43253688ac","listingId":"9bf12084-8fab-4257-b86b-2a88ecc226d6","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:49.483Z"}],"sources":[{"listingId":"9bf12084-8fab-4257-b86b-2a88ecc226d6","source":"github","sourceId":"piyushverma0/android-agent-skills/gradle","sourceUrl":"https://github.com/piyushverma0/android-agent-skills/tree/main/skills/gradle","isPrimary":false,"firstSeenAt":"2026-05-18T13:14:49.483Z","lastSeenAt":"2026-05-18T19:09:09.841Z"}],"details":{"listingId":"9bf12084-8fab-4257-b86b-2a88ecc226d6","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"piyushverma0","slug":"gradle","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":"cbe406cdd847f3084b80ba50b234585ab6d9b595","skill_md_path":"skills/gradle/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/piyushverma0/android-agent-skills/tree/main/skills/gradle"},"layout":"multi","source":"github","category":"android-agent-skills","frontmatter":{},"skills_sh_url":"https://skills.sh/piyushverma0/android-agent-skills/gradle"},"updatedAt":"2026-05-18T19:09:09.841Z"}}