반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

가끔 보자, 하늘.

Flutter 로 앱 개발 및 릴리즈 - 08. google play console 연결하기 #1 본문

개발 이야기/개발 및 서비스

Flutter 로 앱 개발 및 릴리즈 - 08. google play console 연결하기 #1

가온아 2025. 5. 30. 13:00

2025.05.05 - [개발 이야기/개발 및 서비스] - Flutter 로 앱 개발 및 릴리즈 - 00. 마음의 준비

2025.05.05 - [개발 이야기/개발 및 서비스] - Flutter 로 앱 개발 및 릴리즈 - 01. 생성 및 시뮬레이터 테스트

2025.05.06 - [개발 이야기/개발 및 서비스] - Flutter 로 앱 개발 및 릴리즈 - 02. 폴더 구조 정리

2025.05.07 - [개발 이야기/개발 및 서비스] - Flutter 로 앱 개발 및 릴리즈 - 03. Flutter Compoent와 Native Component

2025.05.10 - [개발 이야기/개발 및 서비스] - Flutter 로 앱 개발 및 릴리즈 - 04. Calendar 페이지

2025.05.10 - [개발 이야기/개발 및 서비스] - Flutter 로 앱 개발 및 릴리즈 - 05. Project 페이지

2025.05.11 - [개발 이야기/개발 및 서비스] - Flutter 로 앱 개발 및 릴리즈 - 06. Settings 페이지

2025.05.21 - [개발 이야기/개발 및 서비스] - Flutter 로 앱 개발 및 릴리즈 - 07. 앱 기능 정리 및 중간 소회

(*구글 플레이 개발자로 이미 등록되어 있다고 가정하고 진행됩니다. 구글 플레이 개발자 등록 과정은 이 링크를 참고하세요.)

https://console.cloud.google.com/ 에서 "새 프로젝트"를 생성합니다. 그리고 "OAuth Client 만들기" 를 선택하고 Android 를 선택 후 "이름", "패키지 이름", "SHA-1 인증서 디지털 지문"을 등록합니다.

패키지 이름 설정하기

패키지 이름은 flutter 프로젝트에서 "app/src/main/AndroidManifest.xml"에 설정된 패키지 이름을 설정합니다. 저의 경우 해당 파일을 열어보니 package 설정이 없더군요. 없으신 분들은 해당 파일을 열고 다음과 같이 설정하세요.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.your_company.todo_app_name">
    <application
        android:label="todo_app_name"
	.
    .
    .

SHA-1 인증서 디지털 지문 생성/등록하기

SHA-1 서명 인증서 디지털 지문을 생성하려면 keytool 명령어를 사용해야 합니다. 아래는 macOS에서 생성하는 방법입니다.

1. JDK 설치 확인

terminal 창에서 keytool을 실행해서 정상적으로 실행이 안된다면 jdk가 설치되었는지, 설정 경로에 문제가 없는지 살펴봐야 합니다.

brew install openjdk.   >> jdk 설치
vi ~/.zshrc   >> 환경 설정 파일에 들어가 
# 아래 내용을 추가합니다.
export "/opt/homebrew/opt/openjdk/bin:$PATH"  >> jdk 경로 설정
source ~/.zshrc >> 환경 설정 내용 적용

키 저장소 파일(*.keystore) 파일을 만든적이 없다면 다음과 같이 생성합니다.

keytool -genkey -v -keystore ~/.android/your_android_key.keystore -alias your_android_key -keyalg RSA -keysize 2048 -validity 10000

설명:

  • -genkey: 새로운 키 쌍을 생성합니다.
  • -v: 상세한 정보를 출력합니다.
  • -keystore ~/.android/your_android_key.keystore: 키 저장소 파일의 경로와 이름을 지정합니다. (이 경로에 파일을 생성할 것입니다.)
  • -alias your_android_key: 키 저장소 내에서 키를 식별하는 별칭(alias)을 지정합니다. (나중에 앱 서명에 이 별칭을 사용합니다.)
  • -keyalg RSA: 키 알고리즘으로 RSA를 사용합니다.
  • -keysize 2048: 키 크기를 2048비트로 설정합니다.
  • -validity 10000: 인증서의 유효 기간을 10000일(약 27년)로 설정합니다.

이후 생성한 keystore에서 SHA-1 값을 확인하여 "SHA-1 인증서 디지털 지문"에 입력합니다. 

keytool -keystore ~/.android/your_android_key.keystore -list -v

이후 확인을 누르면 app id가 발급됩니다. 

키 저장소 파일을 생성했다면, Flutter 프로젝트가 이 파일을 사용하여 Android 앱을 서명하도록 설정해야 합니다. 이를 위해 android/key.properties 파일과 android/app/build.gradle.kts 파일을 다음과 같이 수정합니다.

// key.properties

storePassword=당신이_설정한_키저장소_비밀번호
keyPassword=당신이_설정한_키_비밀번호
keyAlias=your_android_key
storeFile=~/.android/your_android_key.keystore

(* 중요: key.properties 파일은 민감한 정보를 포함하고 있으므로, 절대로 Git과 같은 버전 관리 시스템에 커밋하지 마세요. .gitignore 파일에 android/key.properties를 추가하여 관리해야 합니다.)

다음으로 build.gradle.kts 파일에 아래 내용을 추가합니다. 

우선 파일 상단에 아래 내용을 추가합니다.

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

val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

android { ... } 블록 내부에 signingConfigs 를 추가합니다. (보통 defaultConfig 아래 또는 buildTypes 위에 추가)

android {
    // ... 다른 설정들 ...

    signingConfigs {
        create("release") { // "release"라는 이름으로 signingConfig를 생성
            storeFile = if (keystoreProperties.containsKey("storeFile")) file(keystoreProperties["storeFile"].toString()) else null
            storePassword = keystoreProperties["storePassword"]?.toString()
            keyAlias = keystoreProperties["keyAlias"]?.toString()
            keyPassword = keystoreProperties["keyPassword"]?.toString()
        }
    }

    buildTypes {
        getByName("release") { // "release" buildType을 가져옴
            signingConfig = signingConfigs.getByName("release") // 위에서 정의한 signingConfig를 연결
            // ... 다른 release 설정들 (minifyEnabled, proguardFiles 등) ...
        }
    }
}

이 외에도 설정값 중 appId나 minSdk 값을 조정해야 할 수 있습니다. 다음과 같이 빌드를 시도해보고 에러가 나면 내용에 맞게 수정을 하면 됩니다. 아래 몇 가지 샘플을 같이 정리합니다. 

> flutter clean
> flutter build appbundle --release

에러 예 1)

Your project is configured with Android NDK 26.3.11579264, but the following plugin(s) depend on a different Android NDK version:
- audioplayers_android requires Android NDK 27.0.12077973
- cloud_firestore requires Android NDK 27.0.12077973
- firebase_auth requires Android NDK 27.0.12077973

일부 패키지의 최소 버전과 현재 flutter 프로젝트에 설정된 NDK 버전의 차이 때문에 발생합니다. app/build.gradle.kts파일의  android 항목에 다음과 같이 버전을 설정하세요.

android {
	.
	.
    compileSdk = flutter.compileSdkVersion
    ndkVersion = "27.0.12077973"
	.

 

에러 예2)

~/StudioProjects/new_todo/android/app/src/main/AndroidManifest.xml Error: uses-sdk:minSdkVersion 21 cannot be smaller than version 23 declared in library [:firebase_auth] ~/StudioProjects/new_todo/build/firebase_auth/intermediates/merged_manifest/release/processReleaseManifest/AndroidManifest.xml as the library might be using APIs not available in 21 Suggestion: use a compatible library with a minSdk of at most 21, or increase this project's minSdk version to at least 23, or use tools:overrideLibrary="io.flutter.plugins.firebase.auth" to force usage (may lead to runtime failures)

minSdk 버전이 너무 낮다는 에러이며 역시 app/build.gradle.kts 파일의 defaultConfig 에서 설정하면 됩니다.

defaultConfig {
	.
        .
        // minSdk = flutter.minSdkVersion
        minSdk = 23 // Minimum SDK version for Android 6.0 (Marshmallow)
	.
	.

이 외에도 applicationId 등 패키지 이름와 맞추고 싶은 항목은 별도로 수정하면 됩니다. 부디 문제없이 flutter build 가 정상적으로 되셨길 바랍니다. 혹시 해결되지 않는 문제가 있다면 댓글로 달아주세요. AI 덕분에 왠만한 문제들은 대부분 해결책을 쉽게 찾을 수 있으실 겁니다. 그럼에도 안되면 ... 

크로스 플랫폼 개발 프레임워크가 여럿 있지만 게임을 제외하고(Unity, Unreal 등) 이전에는 react native 만 사용해 봤습니다. react native를 쓰면서 가장 힘들었던건 component 관리였는데 사실 너무 힘들었습니다. 에러가 나면 해결하기도 힘들었고, 특정 플랫폼을 지원하지 못하는 경우도 다반사였습니다. 얼마 써보지 않은 지금까지의 flutter에 대한 간단한 소회를 남겨보자면 사실 이전에 비해 너무 편합니다. 생각보다 flutter를 쓰는 곳이 많지 않은 것 같아 아쉽지만, 그래도 계속 발전하지 않을까 합니다. 

번외로 kotlin과 dart가 왜 나눠졌을까 궁금해서 찾아본 답변을 이 링크에 공유합니다.

#2로 다시 찾아뵙겠습니다. :)

반응형