혹시 모를 미래의 나를 위해서 작성한다.
분명 이전에 했었는데 다시 하려니까 까마득하게 잊어버려서(무려 2년 전에 했기 때문) 그때 어떻게 했는지 기록을 했겠지 하고 찾아봤는데 찾지 못하여 식은땀을 흘리며 빌드 기도를 한 기념으로 정리한다.
빌드 명령어는 다음과 같다.
flutter build apk --release --target-platform=android-arm64
명령어를 입력하니 당연히 에러가 발생했다.
FAILURE: Build failed with an exception.
* What went wrong:
Could not open settings generic class cache for settings file '/Users/(...프로젝트 경로...)/android/settings.gradle' (/Users/(내이름)/.gradle/caches/7.4/scripts/9cj2juayyzdzoy7ot69w9men4).
> BUG! exception in phase 'semantic analysis' in source unit '_BuildScript_' Unsupported class file major version 65
버전 관련 에러같았다.
찾아보니 Java 버전 17(클래스 파일 메이저 버전 65)이 원인이 되어 발생하는 Gradle 호환성 문제, Gradle이 Java 17을 제대로 지원하지 못할 때 발생하는 에러라고 한다. 그냥 지원해줘
Java 버전을 11이나 8로 다운그레이드하거나 Gradle을 최신 버전으로 업그레이드해야 해결된다.
설치된 Java 버전을 확인 후,
/usr/libexec/java_home -V
Java 11을 기본 버전으로 설정하는 명령어를 입력한다.
export JAVA_HOME=$(/usr/libexec/java_home -v 11)
그 후 다시 빌드해보기
flutter clean
flutter build apk --release --target-platform=android-arm64
빌드가 잘 되어 apk 파일이 생성됨과 함께 그 경로를 알려준다.
해당 경로로 들어가서 apk 파일을 다운받았는데
누가봐도 완전 수상한 파일명.. unsigned...
다운받은 파일을 핸드폰에 설치해보았더니 '패키지가 잘못되어 앱이 설치되지 않았습니다.' 라는 문구가 뜨면서 앱이 설치되지 않았다.
빌드된 파일명에 'unsigned' 라는 단어가 있는 걸로 봐서, 어렴풋이 기억하기론 키와 관련된 문제인 것 같았다. 그때 뭔가 키를 설정해줬던 것 같은데 그게 빠져있어서 이렇게 된 느낌..
찾아봤더니 API 서명 문제라고 한다.
앱을 배포용으로 빌드할 때는 APK 파일이 서명되어야 한다고 한다.
먼저 키스토어를 사용하여 APK를 서명해야 하기 때문에 키스토어를 생성해야 한다.
keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
이 명령어 똑같이 입력해주면 된다!
그때 했던 기억이 난다!
아무튼 저렇게 입력하면 비밀번호랑 이름이랑 사는곳 등.. 적으라고 하는데 혹시 그 때 예전에 처음 생성했던 비밀번호랑 똑같이 해줘야 하나 하고 잠깐 식은땀이 날 뻔했지만 다행이 새로운 비밀번호를 설정해주면 되었다. (플레이 스토어에 업로드되지 않은 상태)
다 입력하고 나면 이제 키스토어 파일이 생성된다.
그 후 android
디렉토리에 key.properties
라는 파일을 생성한 후 다음과 같이 적어준다.
storePassword=서명 생성 시 작성한 비밀번호
keyPassword=서명 생성 시 작성한 비밀번호
keyAlias=key
storeFile=키스토어 파일 경로(파일 생성될 때 알려줌)
그리고 android/app
의 build.gradle
파일의 android 블록 위에 다음과 같이 작성하여 key.properties
파일을 불러오도록 해준다. (나의 경우엔 이미 작성되어 있었다.)
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
그리고 android 블록 안에 다음을 추가한다. (나의 경우엔 이것도 주석 해제만 해주면 됐다. 과거의 나에게 진짜 감사)
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources false
}
}
그리고 다시 빌드 명령어를 입력하면 앱이 정상적으로 빌드되고 추출한 apk 파일명에도 unsigned 표기가 없어지면서 다운로드가 잘 된다.