본문 바로가기
IT 정보/플러터 flutter

flutter 출시 배포 빌드 하기 : 안드로이드 스튜디오 편

by 쩜오개미 2024. 1. 31.

드디어

플러터 빌드를 성공하고

google 플레이스토어 콘솔에 번들을 등록하고

테스트 계정으로 다운로드 설치까지 성공하였다.

 

그 긴여정 기록으로 남긴다.

 

안드로이드 스튜디오에서 처리한 것/ 구글 플레이 스토어 콘솔에서 처리한 것 

안드로이드 스튜디오에서 처리한 것

 

0. android studio 에서 프로젝트를 연다.

1. 하단의 터미널 탭을 누른다.

2. 명령어 창에 flutter build appbundle 이라는 명령어를 친다.

 

androidstudio > build > generate signed bundle/apk ... 에서 생성하는 방법

flutter build apk 명령어 사용하는 방법도 있는데

apk 보다는 번들로 생성하는 것을 구글에서 권장하고

추후에는 apk  는 플레이스토어 콘솔에 등록 안되게 한다는 말이 있어서 번들로 뽑

 

3. 앱이 빌드 되고 번들이 파일로 떨어진다. ABB( AppBundle)

4. 아래 주소 참조, 번들 파일 위치 찾는다.

C:\Users\윈도우 사용자명\StudioProjects\프로젝트 \build\app\outputs\bundle\release\app.aab

 

이렇게 쉬웠다면 얼마나 좋았으랴.

이 작업 전 해줘야 하는 것이 많다.

출시 위해 앱 번들에 디지털 서명을 적용하는 과정이란다.

 

 

 

 

 

  • keystore 만들기

key.jks 파일을 생성

(아래 사진에서 위치 참조, 나는 그냥 New 에서 File로 만든다음에 이름 바꿈)

 

Terminal 부분에서 (윈도우라면) 이 코드를 넣는다.

안되면 윈도우 탐색기에서 프로젝트 파일의 루트로 가서 마우스 오른쪽, 추가 옵션 표시, 터미널에서 열기 누르고 

터미널에서 이 코드를 넣는다.

keytool -genkey -v -keystore %userprofile%\key.jks ^
          -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 ^
          -alias key

위에거 아니면

keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

 

이거. 이 것도 안되면

~/ 이부분을 지우거나 절대 경로를 다 넣 해보자.

 

여기서 -keystore 다음에 key.jks는 키파일 이름이고   

마지막에 alias 뒤에 key는 별칭이다.

나중에 flutter 소스에 추가해줘야하므로 기억해야한다.

 

자바가 설치되어 있어야 하며

 

잘 실행이 되면 주소 등 이것 저것 묻는데 실수  해도 상관 없지만 하나는 잘 해야 한다.

패스워드를 입력하는 부분이 있는데

이 패스워드를 잘 기억해서 안드로이드 스튜디오에 key.properties 파일에 넣어주어야 함

(아래 설명 있음)

 

CN=, OU=, O=, L=, ST=, C=82이(가) 맞습니까?

[아니오]: Y

여기는 대답을 Y 넣고 엔터

 

 

 

 

  • keystore 키를 앱에 넣기

사진의 위치에 key.properties 파일을 생성 (Resource Bundle 파일로 생성한 후 이름 변경하였음)

 

 

key.properties 에 내용 입력 

 

storePassword= 여기에 비밀번호를 넣으세요 <> 이런거 빼고 비밀번호만요
keyPassword= 여기에 비밀번호를 넣으세요 <> 이런거 빼고 비밀번호만요
keyAlias=key
storeFile=key.jks

 

인터넷에 보면

storeFile 부분에

key store 파일 위치 예시) /Users/<user name>/key.jks

이런 식으로 다양한 형태의 값을 넣으라고 되어 있는데 

뒤에 android/app/build.gradle 파일에 

storeFile 값 넣는 과정에서 파일 위치를 잘 지정한다면 

key.properties 파일에는 간단하게 key.jks만 써도 되는 것 같다.

 

 

 

 

 

  • android/app/build.gradle 수정

이 파일은 java sdk jdk 등 버전을 정확하게 등록하지 않을 경우 

버그가 나고 난리가 난다. 버그 있다고 막 바꿔보지 말고

오류 메시지를 자세히 읽고 버전을 잘 등록해보자.

 

에러 메시지 Cannot resolve symbol 로 'Properties' 부분에서 애러나면
File > Project Structure
Project Setting

Modules 프로젝트이름을 선택
하면 No SDK 거나 설치된 것과 다른 SDK가 물려 있는 것을 볼 수 있는데

Android API 버전 플러그인을 다시 맞게 설치하거나 

설치된 플러그인을 설정하면 된다.

 

나는 API 34 ~~ level 7 platform 을 sdk manager 매니저 메니저 에서 설치하고 

다시 돌아와서 선택하였다.

 

 

 

GradleException 오류는

API 29부터는 FileNotFoundException으로 대체되어서

대체된 글자로 바꿔주자.

 

 

 

 

 

하단 부터는 코드 추가 부분

// start of Gradle 서명 구성
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('app/key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
    namespace

build.gradle 의 안드로이드 부분

바로 위에 위 코드를 쓴다. 

rootProject.file('key.properties') 이 부분에 나는 app/ 이라고 명시했다.

왜냐, 거기 파일을 만들었으니까.

 

 

또 다른 코드 추가 부분

기존의  buildTypes 위 아래로 잘 맞춰서 넣어보자 

이 코드는 android {} 중괄호 안에 있는 코드다 .

// start of signingConfigs
signingConfigs {
    release {
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
        storeFile file(keystoreProperties['storeFile'])
                ? file(keystoreProperties['storeFile']) : null
        storePassword keystoreProperties['storePassword']
    }
}
// end of signingConfigs

buildTypes {

    //debug {
    //    signingConfig signingConfigs.debug

        // 프로가드 활성화
        ////minifyEnabled true

        // 기본 프로가드 설정
        ////proguardFile getDefaultProguardFile('proguard-android.txt')
        // 프로젝트에 필요한 프로가드 설정
        ////proguardFile 'proguard-rules.pro'
        // 디버그에 필요한 프로가드 설정
        ////proguardFile 'proguard-debug.pro'

    //}

    release {
        // Add your own signing config for the release build.
        // Signing with the debug keys for now, so `flutter run --release` works.
        //signingConfig signingConfigs.debug
        signingConfig signingConfigs.release

        // start of 코드난독화 및 사이즈 축소
        minifyEnabled false
        //useProguard true

        // Enables resource shrinking, which is performed by the
        // Android Gradle plugin.
        shrinkResources false

        //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        proguardFiles getDefaultProguardFile(
                'proguard-android-optimize.txt'),
                'proguard-rules.pro'
        //testProguardFiles 'test-proguard-rules.pro'
        // end of 코드난독화 및 사이즈 축소
    }
}

 

이 코드에서 

storeFile file(keystoreProperties['storeFile'])
        ? file(keystoreProperties['storeFile']) : null

 

이부분은 이전 버전과 다른 부분, 잘 보고 붙여 넣어야 

 

buildTypes 안에

코드 축소화, 코드 암호화 부분이 있는데

버그가 나면 일단

하단처럼 주석 처리 + 관련 코드 false 처리해도 된다.

minifyEnabled false
shrinkResources false

 

그래도 버그가 나면

useProguard true 부분을 주석 처리해라

버전 업이 되면서 이 코드가 필요 없어졌고 애러를 일으킨다고 한다.

 

그래도 버그가 나면 

C:\Users\사용자 이름\StudioProjects\프로젝트이름\build\app\outputs\mapping\release

이 폴더로 가서 

missing_rules.txt 파일을 열고 안의 내용을 복사해서 

proguard-rules.pro 파일안에 붙여 넣자

(proguard-rules.pro 파일은 없다면 C:\Users\사용자 이름\StudioProjects\프로젝트 이름\android\app 이 폴더에 직접 만들면 된다. 직접 만들었다면

-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }
-dontwarn io.flutter.embedding.**

해당 내용이 포함되어 있어야 한다.)

 

 

 

또 다른 사항으론

 

안드로이드 함수 밖에

 

task prepareKotlinBuildScriptModel {

}
//tasks.register("prepareKotlinBuildScriptModel"){}
//https://stackoverflow.com/questions/64290545/task-preparekotlinbuildscriptmodel-not-found-in-project-app

 

이 코드 추가.

Task 'prepareKotlinBuildScriptModel' not found in project ':app'.

이 애러 에러 메시지가 떴는데 

버전 바뀌면서 추가된 코틀린? kotlin 함수 처리하는 부분인거 같은데 

android/app/build.gradle 의 android {} 함수 안에 

그냥 넣었다. 코드 안에 관련 내용 있는 스텍플로우 페이지를 주석으로 넣어둠

 

 

 

 *** 중요한 것은 build.gradle 이 파일을 수정하면

코드 최상단에 있는 get~ 어쩌구하는 파랑색 버튼을 잘 눌러줘야 적용되는 듯하다.

터미널에 flutter clean 후 재시작하라는 글도 있다.

물론 클린 후 build.gradle  파일 상단에 pub get~ 버튼 잘 눌러줘야 한다. 

 

 

이거 말고도 난관이 많다.

 

compileSdkVersion is marked as deprecated

compileSdkVersion' is deprecated 이 애러 메시지는 

 

flutter.minSdkVersion, flutter.targetSdkVersion가 선언된 위치를 알아야하는데

바로 여기 android/app/build.gradle 파일에 아래 코드이다.

minSdkVersion 21 // flutter.minSdkVersion

 

기본적으론 sdk 버전을, 최소로 쓰고 있을텐데

사용하는 패키지가 요구하는 더 높은 버전으로 바꿔줘야 하는경우가 있다.

 

 

 

task wrapper(type: Wrapper) {
    gradleVersion = '7.0'
}

 

task 'wrapper' not found in project ':app' 에러 나서 

android{} 내부에

위의 코드도 수정하였다.

git clone 시 문제라는데 당연히도 못알아들었다.

 

 

 

versionCode flutterVersionCode.toInteger()
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'

 

위 부분도 앞으로 업데이트 할 때마다 숫자를 올려줘야 한다고 한다.

 

 

 

 

 

  • pubspec.yaml 파일에도 버전 관련해서 수정할 것이 있다.

부분에

version: 1.0.0+1

 

이부분이랑도 연관되 있는듯?

1.0.0은 버전 네임이라 개발자가 자신이 알아볼 용도의 규칙으로 막 지어도 되는 듯하고 심지어 안바꿔도 되는 듯하고

+ 1 이부분이 버전 코드라서 좀더 큰 숫자로 올려야 하는듯?

 

 

 

 

 

  • 안드로이드 폴더안에 local.properties 파일

이 안에도

flutter.versionCode=5

이 부분 맞게 잘 수정해줘야 할 것 같고 

 

 

 

나는

  • 안드로이드 폴더안에 app 폴더 안의  local.properties 파일의
sdk.dir=C:\\Users\\윈도우 사용자 이름\\AppData\\Local\\Android\\sdk

이부분도 수정한 기억이 있다.

 

 

 

 

 

하도 이것 저것 많이 바꿔서 

바꿔놓고 여기 누락한 게 있을 수 있다.

 

번들 빌드 만드는게 이렇게 힘든 건줄은 직접 하기 전에는 몰랐다.

엄청난 검색을 하였다. 

https://earthspin.tistory.com/10

 

flutter 안드로이드 출시하기 keystore 적용 (keystore 분실 해결방법)

나는 과거에 가지고 있던 keystore을 잃어버려 앱을 업데이트 못하고 있었다. 이를 해결하는 방법에 대해서 적고 이번에 앱을 업데이트하면서 발생했던 문제를 적으려고 한다. 필자는 맥북을 사용

earthspin.tistory.com

이블로그 글 초보 입장에서 쓴 것이라 이해하기 좋았다.

 

 

 

 

 

 

 

 

 

  • 내가 지금까지 겪은 오류 코드

 

아래 오류는 이렇게 처리한다.

storeFile file(keystoreProperties path may not be null or empty string.

// key.jks properties 주소 부분을 정확히 해야함 위의 내용을 체크하면 해결 될 듯 

 

 

아래 버그 메세지 는 이렇게 처리한다.

An exception occurred applying plugin request [id: 'com.android.application']

// Android Gradle plugin을 Java 11 이상으로 설정

https://www.oracle.com/kr/java/technologies/javase/jdk11-archive-downloads.html

오라클 홈페이지에서 일단 JDK 11 Download 해서 직접 설치하고 

환경변수 등록하는거 검색해서 등록해줌

아마 환경 변수에는 이전 버전이 등록 되어 있을 수 있는데 그냥 두고 새로 또 등록한다.

안드로이드 스튜디오로 돌아가

//file - Settings - Build, Execution, Deployment 탭  - Build Tools 접힌 메뉴 열기 > Gradle 눌러서

Gradle JDK 를 설정해주면 되는데

Gradle JDK 설정해주는 부분만 없다 ㄷㄷ

https://timotimo.tistory.com/99

 

[IntelliJ] Gradle 플러그인이 안보일때 대처방법 (Gradle Tool Window)

인텔리제이에서 프로젝트를 오픈했을 때, 빌드툴 관련 플러그인이 보이지 않는 경우가 있습니다. 이때 조치할 수 있는 방안 두가지를 공유드립니다. 인텔리제이 Gradle Toolbar 안보이거나 Gradle 프

timotimo.tistory.com

이 블로그 보고 해결

View > Tool Windows > Gradle 을 클릭

또는 

 

기존 프로젝트를 열기 한 경우 자동으로 Gradle 프로젝트로 인식을 못하는 경우가 있습니다.

이럴때는 내프로젝트 디렉토리에서 build.gradle을 찾습니다.

 

 

 build.gradle 파일을 찾았으면, 우측 클릭을 하여 Gradle 코끼리 아이콘을 찾습니다. 

제 IntelliJ 버전에서는 Link Gradle Project로 표시되어 있으나,

버전에 따라서 Import Gradle Project로 표시된 경우도 있습니다. 

 
프로젝트 인식이 문제라면 해당 콘텍스트 메뉴에서 Gradle Project로 인식시키는 항목이 나오게 됩니다.

클릭하면 인텔리제이 우측에 아래와 같이 Gradle 플러그인 탭이 생기게 됩니다.

 



Gradle 탭이 표시되고 내 프로젝트가 import 되어 있는 것을 확인할 수 있습니다.

 

 

 

아래 오류

execution failed for task ':app:minifyreleasewithr8'.

안드로이드 파일 안에  gradle.properties 파일 찾아서 그안에 문구 바꿈

기존에 org.gradle.jvmargs=-Xmx1536M 이건데 

org.gradle.jvmargs=-Xmx2048M 이렇게 바꾸란다.

 

처리 메모리 용량을 2기가로 늘리는 거 같은데

나는 더 통크게

org.gradle.jvmargs=-Xmx4g

 

4기가로 함

 

 

 

// 빌드할 때 이전 작업 캐시 찌꺼기가 남아 있어서 생기는 오류 같다.

Unfortunately you can't have non-Gradle Java modules and > Android-Gradle modules in one project
1. 안드로이드 스튜디오 종료 (혹시 모르니 컴퓨터도 껐다 켜라)
2. 프로젝트 폴더에 존재하는 .idea 디렉토리를 제거.( 혹시 모르니 막지우지 말고 어디로 옮겨서 백업)
3. 프로젝트 폴더에 존재하는 .iml 확장자 파일을 전부 제거. (혹시 모르니 막지우지 말고 어디로 옮겨서 백업)
4. 다시 프로젝트 열어서 빌드 재수행

 

<참조 > 
https://stackoverflow.com/questions/30142056/error-unfortunately-you-cant-have-non-gradle-java-modules-and-android-gradle

 

 

 

 

// 하단은   위에 있는 프로 가드 부분 내용을 참조

Could not find method useProguard() for arguments [true]  

ERROR: Missing classes detected while running R8. Please add the missing classes or apply additional keep

apply additional keep rules that are generated in build\app\outputs\mapping\release\missing_rules.txt

What went wrong: execution failed for task ':app:minifyreleasewithr8'.

failure occurred while executing com.android.build.gradle.internal.tasks.R8Task$R8Runnable

build failed when using AGP 8 in release mode

 

 

 

//아래 버그 메시지는 실제로 어떻게 하라는 내용이 아니라 그냥 help 파일을 열어보라는 항상 들어가는 관용구라고 

Run with --info or --debug option to get more log output.

 

 

 

 

 

//아래 오류 는 이렇게 처리한다.

OnBackInvokedCallback is not enabled for the application. android:enableOnBackInvokedCallback="true"

 

안드로이드 메니페스트 위치로 간다.

(C:\Users\윈도우 사용자 명\StudioProjects\프로젝트 파일 명\android\app\src\main\AndroidManifest.xml)

Set 'android:enableOnBackInvokedCallback="true"' in the application manifest.

<application
    ...
    android:enableOnBackInvokedCallback="true"
    ... >
...
</application>

728x90
반응형

댓글