Files
fanuzu/app/android/app/build.gradle.kts
T

107 lines
5.0 KiB
Kotlin

import java.util.Properties
plugins {
id("com.android.application")
id("kotlin-android")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
// Firebase 설정 파일(google-services.json) 투입 완료(S2). settings.gradle.kts 의
// 버전 선언과 짝이며, 파일이 빠지면 Gradle 빌드 자체가 실패한다.
id("com.google.gms.google-services")
}
// 릴리스 서명 키는 `android/key.properties` 에서 읽는다. 파일은 저장소에 넣지 않는다.
// 형식: storeFile= / storePassword= / keyAlias= / keyPassword=
val keystoreProperties = Properties().apply {
val f = rootProject.file("key.properties")
if (f.exists()) f.inputStream().use { load(it) }
}
// 카카오 네이티브 앱 키 — `config/kakao.env` 한 파일이 Dart(--dart-define-from-file)·
// Android(여기)·iOS(Flutter/*.xcconfig)에 같은 값을 준다. 파일은 저장소에 넣지 않는다.
// 없으면 빈 값으로 빌드되고 카카오 로그인만 「설정 전」으로 막힌다.
val kakaoProperties = Properties().apply {
val f = rootProject.file("../config/kakao.env")
if (f.exists()) f.inputStream().use { load(it) }
}
/// 이번 실행이 릴리스 산출물(assembleRelease · bundleRelease 등)을 요구하는가.
val wantsRelease = gradle.startParameter.taskNames.any { it.contains("Release", ignoreCase = true) }
// 앱 식별자 단일 출처. 별첨 C 4번으로 `kr.co.fanuzu.app` 확정(2026-09-11, Q14 해소).
// 기존 잠정값 kr.co.sweech.fancake 는 더 이상 쓰지 않는다.
// namespace(=R 클래스 패키지)와 Kotlin 패키지도 같이 옮겼다 — AndroidManifest 가
// 액티비티를 `.MainActivity` 상대명으로 적으므로 셋이 어긋나면 기동 시 클래스를 못 찾는다.
val fanuzuApplicationId = "kr.co.fanuzu.app"
android {
namespace = fanuzuApplicationId
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
defaultConfig {
// 확정값(별첨 C 4번). 스토어에 한 번 올리면 변경 불가다.
applicationId = fanuzuApplicationId
// **계약값이다.** 별첨 1 v1.0 이 최소 지원 OS 를 Android 10(API 29)으로 적었고,
// 근거는 2주차 플러그인 선검증 리포트의 바이너리 실측이다.
//
// Flutter 기본값(API 24)을 그대로 두면 우리가 검증하지 않은 기기까지 설치가
// 열린다 — 스토어에 올라간 뒤에는 그 기기의 크래시가 우리 책임이 된다.
// 플러그인을 늘릴 때 이 값을 재계산하는 절차는 선검증 리포트 §3.5 에 있다.
minSdk = 29
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
// AndroidManifest 의 카카오 로그인 리다이렉트 스킴 `kakao{네이티브 앱 키}`.
manifestPlaceholders["kakaoNativeAppKey"] =
kakaoProperties.getProperty("FANUZU_KAKAO_NATIVE_APP_KEY", "")
}
signingConfigs {
create("release") {
if (keystoreProperties.isNotEmpty()) {
storeFile = file(keystoreProperties.getProperty("storeFile"))
storePassword = keystoreProperties.getProperty("storePassword")
keyAlias = keystoreProperties.getProperty("keyAlias")
keyPassword = keystoreProperties.getProperty("keyPassword")
}
}
}
buildTypes {
release {
// 키가 없으면 **릴리스 빌드를 실패시킨다.** 기본 템플릿은 debug 키로 조용히 서명하는데,
// 그렇게 만든 release 산출물은 Play 가 거부하고 배포도 못 하면서 겉보기엔 성공한다.
// 릴리스 서명 키는 스토어 등록 명의(OPEN-QUESTIONS Q5 · 내부 조치 S3)가 정해져야
// 만들 수 있다 — 지금은 없는 게 정상이고, 없다는 사실이 드러나야 한다.
//
// 검사는 릴리스 태스크를 실제로 요청했을 때만 한다. 설정 시점에 무조건 던지면
// `assembleDebug` 까지 같이 깨진다.
if (keystoreProperties.isEmpty()) {
if (wantsRelease) {
throw GradleException(
"릴리스 서명 키가 없습니다. android/key.properties 를 만들고 키스토어를 지정하세요. " +
"(미해결: OPEN-QUESTIONS Q5 스토어 등록 명의 · 내부 조치 S3) " +
"디버그 빌드는 `flutter build apk --debug` 로 그대로 됩니다."
)
}
} else {
signingConfig = signingConfigs.getByName("release")
}
}
}
}
flutter {
source = "../.."
}