build-release
2
总安装量
2
周安装量
#67324
全站排名
安装命令
npx skills add https://github.com/ingpdw/pdw-android-dev-tool --skill build-release
Agent 安装分布
mcpjam
2
openhands
2
replit
2
junie
2
windsurf
2
zencoder
2
Skill 文档
Android Release Build Skill
Google Play Store ë°°í¬ë¥¼ ìí Android App Bundle(AAB) íë¡ëì ë¹ë를 ìì±íë ì¤í¬ì ëë¤.
ë¹ë ì ì²´í¬ë¦¬ì¤í¸
íì íì¸ ì¬í
- Keystore íì¼ ì¤ë¹ ìë£
- gradle.propertiesì ìëª ì ë³´ ì¤ì
- versionCode ì¦ê° íì¸
- versionName ì ë°ì´í¸ íì¸
- ProGuard/R8 ê·ì¹ ì¤ì
- ëë²ê·¸ ì½ë ì ê±° (Log, debuggable ë±)
build.gradle.kts ë¦´ë¦¬ì¦ ì¤ì íì¸
android {
defaultConfig {
versionCode = 10
versionName = "1.2.0"
}
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig = signingConfigs.getByName("release")
}
}
}
AAB ë¹ë ëª ë ¹ì´
기본 ë¦´ë¦¬ì¦ ë¹ë
./gradlew bundleRelease
í´ë¦° ë¹ë (ê¶ì¥)
./gradlew clean bundleRelease
ë¹ë + í ì¤í¸
./gradlew clean test bundleRelease
í¹ì flavor ë¹ë
# productFlavorsê° ìë ê²½ì°
./gradlew bundleProductionRelease
./gradlew bundleFreeRelease
./gradlew bundlePaidRelease
ë¹ë ì¶ë ¥ ê²½ë¡
app/build/outputs/bundle/release/app-release.aab
ë¹ë ìµì í ìµì
ë³ë ¬ ë¹ë
./gradlew bundleRelease --parallel
ë¹ë ìºì ì¬ì©
./gradlew bundleRelease --build-cache
ë©ëª¨ë¦¬ ì¤ì (gradle.properties)
org.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError
org.gradle.parallel=true
org.gradle.caching=true
AAB ê²ì¦
bundletoolë¡ APK ì¶ì¶ í ì¤í¸
# bundletool ì¤ì¹ (macOS)
brew install bundletool
# APK ì¸í¸ ìì±
bundletool build-apks \
--bundle=app/build/outputs/bundle/release/app-release.aab \
--output=app-release.apks \
--ks=keystore/release-key.jks \
--ks-key-alias=my-key-alias \
--ks-pass=pass:<password>
# ì°ê²°ë ëë°ì´ì¤ì ì¤ì¹
bundletool install-apks --apks=app-release.apks
AAB ì ë³´ íì¸
bundletool dump manifest --bundle=app-release.aab
bundletool dump resources --bundle=app-release.aab
ì± í¬ê¸° ë¶ì
bundletool get-size total --bundle=app-release.aab
Play Console ì ë¡ë
Google Play Console CLI (ì¶ì²)
# ì¤ì¹
pip install google-play-scraper
# ëë Gradle Play Publisher íë¬ê·¸ì¸ ì¬ì©
./gradlew publishReleaseBundle
Gradle Play Publisher ì¤ì
// build.gradle.kts
plugins {
id("com.github.triplet.play") version "3.8.4"
}
play {
serviceAccountCredentials.set(file("play-service-account.json"))
track.set("internal") // internal, alpha, beta, production
defaultToAppBundles.set(true)
}
ë©í° 모ë íë¡ì í¸
ì ì²´ 모ë ë¹ë
./gradlew :app:bundleRelease
Dynamic Feature Module í¬í¨
./gradlew :app:bundleRelease \
:feature1:bundleRelease \
:feature2:bundleRelease
문ì í´ê²°
ì¼ë°ì ì¸ ë¹ë ì¤ë¥
| ìë¬ | ìì¸ | í´ê²° |
|---|---|---|
| Keystore was tampered with | ì못ë ë¹ë°ë²í¸ | ë¹ë°ë²í¸ íì¸ |
| No matching signing config | ìëª ì¤ì ëë½ | signingConfigs íì¸ |
| OutOfMemoryError | ë©ëª¨ë¦¬ ë¶ì¡± | gradle.propertiesìì Xmx ì¦ê° |
| R8 error | ProGuard ê·ì¹ 문ì | proguard-rules.pro ìì |
ProGuard/R8 ëë²ê¹
# 매í íì¼ ìì± íì¸
ls app/build/outputs/mapping/release/
# ê·ì¹ í
ì¤í¸
./gradlew :app:minifyReleaseWithR8 --info
리ìì¤ ì¶ì 문ì
// í¹ì 리ìì¤ ì ì§
android {
buildTypes {
release {
// res/raw/keep.xml ì¬ì©
}
}
}
<!-- res/raw/keep.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/some_layout,@drawable/some_image" />
CI/CD ë¹ë ì¤í¬ë¦½í¸
GitHub Actions ìì
- name: Build Release AAB
run: |
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > keystore.jks
./gradlew bundleRelease
env:
RELEASE_STORE_FILE: keystore.jks
RELEASE_STORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
RELEASE_KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
RELEASE_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
ë¹ë ìë£ í
- AAB íì¼ íì¸:
app/build/outputs/bundle/release/app-release.aab - 매í íì¼ ë°±ì
:
app/build/outputs/mapping/release/mapping.txt - Play Console ì ë¡ë
- ë´ë¶ í ì¤í¸ í¸ëìì 먼ì í ì¤í¸
- ë¨ê³ì ì¶ì (Staged Rollout) ê¶ì¥
ì¬ì© ìì
ì¬ì©ìê° ë¤ìê³¼ ê°ì´ ìì²íë©´ ì´ ì¤í¬ì íì©í©ëë¤:
- “AAB ë¹ëí´ì¤”
- “ë¦´ë¦¬ì¦ ë¹ë ë§ë¤ì´ì¤”
- “íë¡ëì ë¹ëí´ì¤”
- “Play Storeì© ë¹ëí´ì¤”
- “ë²ë¤ ë¹ëí´ì¤”
- “ë°°í¬ì© ë¹ë ìì±í´ì¤”