플러터 안드로이드 배포

LeeWonjin·2024년 5월 17일
1

플러터

목록 보기
15/15

맥북이 없어서 안드로이드 기준으로 적어넣었다.
나중에 맥북사면 ios도 추가함.

공통

스플래시 스크린 생성하기

자동생성하는 툴이 있다
https://pub.dev/packages/flutter_native_splash

자세한 설정은 위 링크 참고. 설정가능한 내용 엄청 많으니 잘 쓰면 된다.

  1. 기준이 될 스플래시 이미지 파일을 프로젝트 안쪽 어딘가에 잘 넣는다.
    참고로 안드로이드가 이미지를 그대로 보여주지 않고 좀 잘라서 보여주기 때문에, 원 모양으로 보일 때 까지 고려해서 잘 만들어야 한다. 그런 조건들은 위 링크에 설정파일 주석으로 잘 설명되어 있으니 따라하면 된다.

  2. 프로젝트 루트에 flutter_native_splash.yaml을 만들고 설정을 적어준다.
    안드로이드 기준 아래 내용만 적어도 동작한다. 주석을 일부 살려 같이 달아둔다.

flutter_native_splash:
  color: "#FFFFFF"
  # The image parameter allows you to specify an image used in the splash screen.  It must be a
  # png file and should be sized for 4x pixel density.
  image: assets/image/splash/splash_logo_768.png

  android_12:
    # The image parameter sets the splash screen icon image.  If this parameter is not specified,
    # the app's launcher icon will be used instead.
    # Please note that the splash screen will be clipped to a circle on the center of the screen.
    # App icon with an icon background: This should be 960×960 pixels, and fit within a circle
    # 640 pixels in diameter.
    # App icon without an icon background: This should be 1152×1152 pixels, and fit within a circle
    # 768 pixels in diameter.
    image: assets/image/splash/splash_logo_1152.png
  1. 아래 커맨드로 생성한다
dart run flutter_native_splash:create

런쳐 아이콘 생성하기

얘도 자동생성 툴이 있다
https://pub.dev/packages/flutter_launcher_icons

  1. 기준이 될 이미지 파일을 프로젝트 안쪽 어딘가에 잘 넣는다.

  2. pubspec.yaml이 있는 프로젝트 루트에
    flutter_launcher_icons.yaml 파일 만들고 내용 채워넣는다
    기준 이미지 파일의 경로를 image_path의 값으로 준다.

flutter_launcher_icons:
  android: "launcher_icon"
  ios: false
  image_path: "assets/image/launcher/launcher_icon_768.png"
  min_sdk_android: 16 # android min sdk min:16, default 21
  # web:
  #   generate: false
  #   image_path: "path/to/image.png"
  #   background_color: "#hexcode"
  #   theme_color: "#hexcode"
  # windows:
  #   generate: false
  #   image_path: "path/to/image.png"
  #   icon_size: 48 # min:48, max:256, default: 48
  # macos:
  #   generate: false
  #   image_path: "path/to/image.png"
  1. 기준 이미지도 image_path위치에 잘 놨고, yaml파일도 썼다면 아래 커맨드로 아이콘을 생성한다.
flutter pub run flutter_launcher_icons

안드로이드

https://docs.flutter.dev/deployment/android
위 공식문서에 설명돼있는 것도 있고, 없는 것도 있다. 아무튼 다 적는다.

앱 라벨(사용자에게 보이는 이름) 변경

android/app/src/main/AndroidManifest.xml

<application
        android:label="여기에 원하는 이름 입력"
        android:name="${applicationName}"
        android:icon="@mipmap/launcher_icon">
 ...
</application>

앱 라벨 다국어 지원

사용자 기기 언어별로 다른 이름을 보여줄 수 있다.
일단 android/app/src/main/AndroidManifest.xml의 label을 저렇게 적어둔다.

<application
        android:label="@string/app_name"
        ... >
  ...
</application>

android/app/src/main/res 아래에 values-언어2글자코드폴더를 만든다.
그 폴더 안에는 strings.xml을 만들고, 내용은 이렇게 채운다.

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <string name="app_name">해당 언어에서 라벨로 사용할 이름. 여기 입력</string>
</resources>

예시는 아래와 같다. 사진의 경우 앱 라벨은 세 종류가 준비되어있다.

  • 영어를 위한 values-en/strings.xml
  • 한국어를 위한 values-ko/strings.xml
  • 그 외 언어를 위한 values/strings.xml

애플리케이션 id 변경

세 군데에서 바꿔주면 된다.

  • android/app/src/main/kotlin/com/example/프로젝트명/MainActivity.kt의 첫 줄 package
  • android/app/build.gradle의 defaultConfig.applicationId
  • android/app/src/main/kotlin 폴더 밑의 폴더 세 개

만약 in 도메인을 사용중이라면 ( e.g., wonj.in ) 오류가 난다.
그거 도메인 in이랑 코틀린 키워드 in 구분못해서 그러는거다.

e: android/app/src/main/kotlin/in/wonj/rapidganadraw/MainActivity.kt: (1, 9): Package name must be a '.'-separated identifier list

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileReleaseKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction
   > Compilation error. See log for more details

android/app/src/main/kotlin/in/wonj/rapidganadraw/MainActivity.kt 의 패키지 이름에서 in을 백틱으로 감싸면 해결된다

  • 해결법 : 흑흑 감사합니다 감사합니다.

앱 인증키

요약하면. 구글플레이 키는 두 가지다 : 앱 서명키, 업로드키
키와 인증서는 다르다. 비공개용인 키를 사용해서 공개가능한 분신 '인증서'를 만든다.

인증키 생성, 빌드, 출시까지 : https://velog.io/@tygerhwang/Flutter-Android-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-Play-Console
인증키 생성, 빌드 : https://whoyoung90.tistory.com/79
구글 키 시스템 : https://giantsol.github.io/android-key-and-certificate/

옛날 인증키 시스템을 쓰는 경우 보면 좋은 글

처음 출시하는 경우

Keytool 커맨드로 jks든 keystore든 키 만들고, 이걸로 앱에 서명하면 된다.
이 키는 '업로드 키'가 된다.

업로드키로 서명된 앱 aab를 구글플레이에 올리면, 구글플레이가 알아서 업로드키 기반으로 앱서명키를 만든다. 이건 구글플레이가 지네들 서버에서 관리한다. 우리한테 없다.

이게 전부다.
참고로 업로드키 분실하면 그냥 구글플레이에 요청해서 변경하면 된다.

옛날 apk와 p12시절 앱을 출시한 경우

구글의 키 정책이 바뀌기 전에 출시된 앱을 업데이트 하고 싶다고 하자. (21~22년 이전?)

옛날에는 키가 '앱 서명키'하나만 있었고, 구글플레이 서버가 아니라 개발자 컴퓨터에 직접 저장해서 관리했다. 그런데 시간이 지나면서 구글 정책이 변했고, 이제는 반드시 구글플레이에 앱 서명키를 업로드 해 놓아야 한다. 그래서 앱 서명키를 업로드하지 않은채로 aab파일을 업로드하려고 하면, 아래와 같이 말한다.

Android App Bundle을 업로드하려면 Play 앱 서명에 등록되어 있어야 합니다. 라고 하면 Play 앱 서명 사용으로 들어가서 해주면 된다.

현재는 선택가능한 옵션이 크게 두 가지가 있다.

  • 기존에 쓰던 앱 서명키 업로드하기
    • 자바 키스토어 jks, keystore (쉬움)
    • 그 밖의 키 파일 (빡셈)
  • 앱 서명키를 기존것에서 새로운 것으로 교체하기
    • 자바 키스토어 jks, keystore (쉬움)
    • 그 밖의 키 파일 (빡셈)

일단 구글플레이에 업로드할 파일 만드는건 쉽다. 설명 있는대로 그대로 따라하면 된다.
1. 다운받으라는거 다운로드
2. 프로그램 pepk 다운로드
3. 치라는 커맨드 입력
4. 산출된 파일 업로드

단, 서명키를 기존 것을 사용하지 않고 새로운 것으로 교체하려는 경우 (당연하게도)

  • 기존 서명키를 갖고 있어야 한다. 또, 비밀번호도 알아야 한다.
  • 새로 사용하려는 서명키도 마찬가지로 갖고 있어야 되고, 비번도 알아야 된다.
  • 위 두 조건을 만족했다면, 이제 apksigner rotate로 키 순환 증빙 자료를 만들어야 한다. APKSigner는 안드로이드 명령줄도구에 있다. 링크

만약 기존 인증서의 비밀번호를 모른다면, 기존 인증서를 분실했다면 어떻게 될까?

  • 어떡하긴, 그냥 포기해라. 새로 출시를 하자.
    • (본인은 10년전 만든 인증서를 풀기 위해 비밀번호 100번정도 브루트 포스로 쳐보고 왔다.)
  • 아, 그럼 새로운 앱 서명키로 서명한 apk파일을 업로드하면 서명키 업로드가 필요없는거 아닐까?
    • 응 아니야.
이전 APK와 다른 인증서로 서명한 APK를 업로드했습니다. 동일한 인증서를 사용해야 합니다. 이전 APK는
SHA1: 87:69:3A:B0:3E:06:C7:90:F4:33:A6:3E:A0:F5:E5:00:96:DA:CA:A5
지문이 있는 인증서로 서명되었으며, 업로드한 APK는
SHA1: 5C:58:BD:C7:88:A6:DC:81:A0:61:A8:89:54:BA:4B:27:0E:6B:F4:4D
지문이 있는 인증서로 서명되었습니다.

다 하셨습니까?

빌드를 하고 구글플레이에 잘 올려보자
프로젝트루트/build/app/outputs/bundle/releaseapp-release.aab파일이 생긴다.

flutter build appbundle

iOS

https://docs.flutter.dev/deployment/ios

profile
노는게 제일 좋습니다.

0개의 댓글

관련 채용 정보