guricode

[flutter-sns-project - 10]안드로이드 릴리즈 단계 요약 본문

앱/Flutter&Dart

[flutter-sns-project - 10]안드로이드 릴리즈 단계 요약

agentrakugaki 2025. 9. 5. 19:46

 

1) 키스토어 생성

keytool -genkeypair -v -keystore "%USERPROFILE%\key.jks" -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key

질문에 답하며 비밀번호와 DN 입력. 국가코드는 KR.

2) 키 확인

keytool -list -v -keystore "%USERPROFILE%\key.jks"

alias가 key인지 확인.

3) key.properties 생성

android/app/key.properties 파일을 만들고 아래 내용 저장.

storeFile=C:\\Users\\<계정>\\key.jks
storePassword=<스토어비번>
keyAlias=key
keyPassword=<키비번>

경로는 실제 파일 위치. \\ 또는 / 사용.

4) Gradle(Kotlin DSL) 설정

android/app/build.gradle.kts에 서명 설정을 포함(이미 있다면 유지).

import java.util.Properties
import java.io.FileInputStream

val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("app/key.properties")
if (keystorePropertiesFile.exists()) {
  FileInputStream(keystorePropertiesFile).use { keystoreProperties.load(it) }
}
val hasKeystore =
  keystorePropertiesFile.exists() &&
  (keystoreProperties["storeFile"] as String?)?.isNotBlank() == true

android {
  // ... 기존 android { } 설정 ...
  if (hasKeystore) {
    signingConfigs {
      create("release") {
        keyAlias = keystoreProperties["keyAlias"] as String
        keyPassword = keystoreProperties["keyPassword"] as String
        storeFile = file(keystoreProperties["storeFile"] as String)
        storePassword = keystoreProperties["storePassword"] as String
      }
    }
    buildTypes { release { signingConfig = signingConfigs.getByName("release") } }
  } else {
    buildTypes { release { signingConfig = signingConfigs.getByName("debug") } } // 임시
  }
}

루트 android/build.gradle.kts에는 플러그인 버전만 선언.

plugins {
  id("com.android.application") version "8.7.3" apply false
  id("org.jetbrains.kotlin.android") version "2.1.0" apply false
  id("dev.flutter.flutter-gradle-plugin") apply false
  id("com.google.gms.google-services") version "4.4.2" apply false
}

settings.gradle.kts에 저장소:

pluginManagement { repositories { google(); mavenCentral(); gradlePluginPortal() } }
dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
  repositories { google(); mavenCentral() }
}

5) 디버그 캐시 정리

flutter clean
flutter pub get

6) 릴리즈 빌드

APK:

flutter build apk --release

AAB(플레이 스토어 권장):

flutter build appbundle --release

출력:

  • APK: build/app/outputs/flutter-apk/app-release.apk
  • AAB: build/app/outputs/bundle/release/app-release.aab

7) 버전 관리

pubspec.yaml

version: 1.0.0+1   # +뒤가 versionCode

릴리즈마다 +1 증가.

8) 업로드

  • Google Play Console → 앱 생성 → 내부 테스트 트랙에 .aab 업로드.
  • 앱 서명 by Google 사용 권장.

9) 흔한 오류 대처

  • path may not be null or empty: key.properties의 storeFile 비었음. 절대경로로 수정.
  • Keystore was tampered with: 비밀번호 불일치. storePassword/keyPassword 재확인.
  • Missing google_app_id: android/app/google-services.json 누락 또는 패키지명 불일치.

macOS/Linux용 키 생성만 참고:

keytool -genkeypair -v \
 -keystore "$HOME/key.jks" -storetype JKS \
 -keyalg RSA -keysize 2048 -validity 10000 \
 -alias key