약 1년전 했던 플러터 프로젝트를 apk로 배포 하려고 한다.
하지만 이전에 나는 계속해서 맥북 환경에서 플러터 개발을 했고, ios 시뮬레이터로만 동작했기 때문에 안드로이드 관련 설정은 하나도 되어 있지 않은 상태였다.
flutter doctor 명령어 결과로도 android 환경 설정이 덜 되어 있음을 알 수 있다
(cmdline-tools component is missing)
그래서 일단 오랜만에 안드로이드 스튜디오를 켜서 안드로이드 설정을 마저 해주었다.
Preferences -> Appearance & Behavior -> System Settings-> Android SDK 에서 다음과 같이 Android SDK Command-line Tools를 선택후 apply 하면 설치 된다.
설치 중,,
설치가 끝나면
flutter doctor --android-licenses
를 한번 실행 시켜주고 flutter doctor를 다시 해본다
깔-꼼
💡 Index
1. display 이름 설정
2. 앱 아이콘 등록3. 앱에 디지털 서명하기
- Key store 만들기
- 앱으로부터 keystore 참조하기
- Gradle에서 서명 구성하기
4. 빌드 구성
5. APK 빌드하기
AndroidManifest.xml에 다음과 같이 설정해주면 된다.
~~~
<application
android:label="marshmallow"
android:icon="@mipmap/launcher_icon">
~~~
android:label="marshmallow" 이부분이 display name!
이 프로젝트의 경우 실 기기를 통해 테스트 한다고 앱 아이콘을 미리 등록해 뒀었다. 그래서 생략,,
flutter_launcher_icons 패키지를 사용하였다.
keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
명령어를 친 후에 이런 저런 질문에 대답하면 keystore를 저장한 경로를 알려준다.
먼저 Android 폴더 안에 keystore 폴더를 만들어서 key.jks를 옮겨준다.
또 keystore.password 라는 파일을 만든다
그 다음 keystore.password에 설정한 비밀번호를 넣어주고
.gitignore 파일에 /keystore 폴더를 추가해준다
keyproperites는 자동으로 추가 되어 있음을 볼 수 있다.
android -> app -> build.gradle 파일에서 buildTypes 부분을 아래와 같이 수정한다.
signingConfigs {
release {
storeFile file('../keystore/key.jks')
storePassword file('../keystore/keystore.password').text.trim()
keyPassword file('../keystore/keystore.password').text.trim()
keyAlias 'key'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
문서에 나와 있는대로 AndroidManifest.xml와 build.gradle을 검토해준다
- 앱 매니페스트 검토하기
올바른 앱 설정을 위하여 <app dir>/android/app/src/main에 있는 기본 앱 매니페스트 파일인 AndroidManifest.xml을 검토하고 올바른 값들을 포함하는지 확인하세요. 특히:
application: 앱의 최종 이름을 반영하기 위해 application에 있는 android:label을 수정하세요.
uses-permission: 앱 내에서 인터넷 접근이 필요하지 않다면 android.permission.INTERNET permission을 제거하세요. 기본 템플릿에서는 Flutter 도구와 실행 중인 앱의 커뮤니케이션을 위해 해당 권한을 포함합니다.
- 빌드 구성 검토하기
올바른 빌드 구성을 위하여 <app dir>/android/app에 있는 기본 Gradle build file 파일인 build.gradle을 검토하고 올바른 값들을 포함하는지 확인하세요. 특히:
defaultConfig:
applicationId: 고유한 최종 (Application Id)appid를 지정하세요.
versionCode & versionName: 내부 앱 버전 번호를 지정하고, 문자열 형태로 명시하세요. pubspec.yaml 파일에 version 속성을 설정하여 내부 앱 버전 번호를 문자열 형태로 지정할 수 있습니다. 버전 정보 지침에 대해서는 버전 문서를 참조하세요.
minSdkVersion & targetSdkVersion: 최소 API 레벨과 개발 대상 버전으로 지정한 지정 API 레벨을 명시하세요. 자세한 내용은 버전 문서의 API 레벨 영역을 참조하세요.
출처: 공식 문서
프로젝트의 루트 경로로 가서
flutter build apk --split-per-abi
를 실행하면 끝 ✨
공식 문서에 따르면 앱 번들을 추천한다고는 하지만 나는 apk 실행 파일이 필요하므로 apk 빌드를 해줬다.
여기서부터 수많은 에러들의 향연이 펼쳐집니다 ㅠㅠ
Error 1)
Flutter Fix: [!] Your project requires a newer version of the Kotlin Gradle plugin.
이런 에러가 떴었는데 android 폴더안의 build.gradle에서 kotlin version을 다음과 같이 바꿔주면 된다
latest 버전 확인
ext.kotlin_version = '1.7.10'
Error 2)
Could not resolve all artifacts for configuration ~~
에러 해결 방법 : https://young-cow.tistory.com/3
주의! android 폴더 안에서 ./gradlew~~ 사용하기
https://velog.io/@g0709-19/Gradle-Could-not-find-method-compile-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95
이 에러도 났었따,,
Error 3)
또 하나더 ..
The Android Gradle plugin supports only Kotlin Gradle plugin version 1.5.20 and higher.
The following dependencies do not satisfy the required version:
project '!!!' -> org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32
와 같은 kotile gradle version 에러가 뜬다면 에러 메세지에서 몇 이상으로 하라는 버전으로 kotiln version을 바꿔주고
buildscript {
ext.kotlin_version = "여기!!"
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
!!! 에 들어가는 패키지를 다시 install 해서 업데이트 해주면 된다
---> 이렇게 했더니 또 버전이 너무 최신이어서 그런지 이 패키지에서 에러가 났다. kotiln과 gradle 버전이 release 된 날짜와 비슷한 시기의 버전으로 맞춰주었다.
이 외에도 여러 에러들이 있었는데 고치느라 정신이 없어서 다 기록해두지는 못했다..ㅠㅠ
하지만 에러들이 발생한 이유는 대부분 버전 문제였는데
gradle 버전, kotlin 버전, 플러터 버전, java 버전, 각 패키지들 버전을 적절히 맞춰줬더니 해결이 되었다
구글링 해보니 java는 11을 사용하라는 말이 많아서 11로 업데이트 시켜줬다.
gradle 버전은 아래 표 참고
어쨌든 무사히 apk가 만들어지면
/build/app/outputs/apk/release/app-armeabi-v7a-release.apk
/build/app/outputs/apk/release/app-arm64-v8a-release.apk
이 경로로 두개의 apk 파일이 생긴다!
진짜 끝..✨
ps. 안드로이드 apk 배포가 생각보다 너무 오래 걸려서(오류들 때문에..) ios의 ipa로 배포를 해볼까도 했는데 개발자 계정이 있어야 해서 포기 했다.. 하지만 참고 할 사람은 여기 링크를 보세용
참고 링크