한국어
Qt
 

반갑습니다. 가입기념으로 글 올립니다.

Qt로 안드로이드 앱 개발하시는 분들께 도움이 될 글입니다. (2019년)

 

https://j2doll.github.io/comply-upcoming-requirements-google-play-2019-kr/

 

[Qt] Google Play의 향후 요구 사항을 준수하는 방법

 

8월 1일부터 Google Play는 64비트 버전이 없는 새로운 애플리케이션이나 애플리케이션 업데이트를 더 이상 허용하지 않습니다 (물론 소스 코드가 전혀 없는 경우는 제외). Qt 사용자의 경우 64 비트 바이너리가 포함된 추가 APK를 빌드해야 합니다.

 

Qt는 5.12.0 이후 Qt는 Android 용 64 비트 바이너리를 출시했으므로 새로운 요구사항을 준수하는 것이 기술적으로 문제가 있지는 않습니다. 하지만 사용자와 논의한 후에 여러 사람이 한꺼번에 지원할 수 있는 앱을 Google Play에서 설정하는 방법에 대해 모든 사람이 정확히 알지 못합니다.

 

이러한 헬프 요청은 현재 새로운 Windows 워크스테이션을 설치하고 있다는 사실과 함께 일반적으로 Android 앱 개발을 위한 Qt를 볼 수 있는 절호의 기회였습니다. 이 블로그에서는 clean slate 로 시작하여 Android 에서 시작하는 방법과 Google Play 요구사항을 준수하는 앱을 게시하는 방법을 보여줍니다.

 

저는 다음과 같은 일들을 진행할 것 입니다:

  • 작업 환경을 확보하는 데 필요한 설치 단계를 안내하고,
  • 다중 아키텍처를 위한 애플리케이션 구축 프로세스를 설명하고,
  • 바이너리를 Google Play에 업로드하는 방법을 보여 드리겠습니다.

처음 몇 부분은 많은 사람들에게 친숙 할 수 있습니다. 따라서 지루하고 기본 주제에 대해 듣고 싶다면 4 단계로 건너 뛸 수 있습니다.

 

SDK 버전에 대한 참고 사항

안드로이드 SDK는 그 자체로 무겁게 개발되고 있으며, 종종 하위 호환이 안되기 때문에 Qt 와의 통합에 문제가 있습니다. SDK 의 변경 또는 회귀로 인해 발생하는 Qt의 비 호환성 문제에 대해 최대한 신속하게 대처할 수 있지만 일반적으로 경험할 수 있는 가장 좋은 버전의 Android 도구로 업그레이드하기 전에 기다려야합니다.

 

다른 플랫폼에도 몇 가지 문제가 있지만 우리가 보았던 대부분의 문제는 Windows 에서 발생했습니다. 따라서 윈도우즈를 호스트 시스템으로 사용한다면 환경을 설정하기 전에 알려진 좋은 버전이 있는지 확인하십시오.

현재 Qt 5.13.0과 함께 다음 도구의 사용을 권장합니다 :

  • Android 빌드 도구 버전 28
  • Android NDK r19
  • Java Development Kit 8

 

몇 가지 문제가 발생하면 알려진 문제 페이지 를 확인하여 업데이트 된 정보가 있는지 확인하십시오.

이제 모든 것을 올바른 버전으로 가져 오는 방법과 장소에 대한 세부 정보를 얻으십시오.

 

1 단계 : JDK 설치

안드로이드는 기본적으로 Java 기반 플랫폼이며 Qt 애플리케이션을 C++ 및 QML 로 작성할 수는 있지만 통합을 가능하게 하는 파일을 컴파일하려면 Java Development Kit 이 필요합니다.

 

Android SDK 관리자 도구(Manager tool)와 최신 버전의 Oracle JDK 간에는 호환이 잘 안되므로, Android 환경과 함께 최신 JDK 버전는 함께 사용할 수 없습니다. 이 문제를 해결하려면 Android 용 JDK 버전 8 을 다운로드하는 것이 좋습니다.

 

오라클의 공식 바이너리 또는 AdoptOpenJDK 프로젝트와 같은 대안을 사용할 수 있습니다.

 

설치 프로그램을 다운로드하여 실행하고 기본 위치에 설치하십시오.

 

2 단계 : Android 환경 설정

두 번째 단계는 실제 Android 개발 환경을 얻는 것입니다. Android Studio 를 다운로드하고 설치하면 됩니다. 다른 “beta” 및 “canary” 릴리스를 스크롤하면 최신 안정 릴리스가 제공됩니다.

 

Android Studio가 설치되면 이 도구를 사용하여 ‘SDK 플랫폼’을 설치할 수 있습니다. 이것은 특정 안드로이드 배포판을 위한 실제 Java 클래스 모음입니다. Android Studio 를 처음 시작하면 SDK 플랫폼을 설치하라는 메시지가 표시됩니다. 권장되는 기본값 인 SDK 29 의 최신 버전을 안전하게 사용할 수 있습니다.

 

SDK 외에도 NDK 도 설치해야합니다. 이것은 C++ 코드를 크로스 컴파일하여 Android 에서 실행하는 데 사용되는 개발 키트입니다. 위에서 언급했듯이 Android NDK r20 은 컴파일 오류를 일으키는 문제가 있으므로 최신 릴리스가 아닌 Android NDK r19c 를 사용합니다. 이 문제는 Qt 5.13.1 및 Qt 5.12.5에서 해결될 예정이므로 이를 사용하기 시작하면 Android NDK r20 으로 업그레이드 할 수 있습니다.

 

그리고 마지막 단계로 최신 버전이 아닌 Android 빌드 도구의 버전 28.0.3 을 사용하고 있는지 확인해야 합니다. 이 문제는 Windows 호스트에서만 발생합니다.

 

Android Studio의 시작 대화 상자에서 구성을 클릭한 다음 SDK 관리자 를 선택하십시오. SDK 도구 탭으로 이동하여 패키지 정보 표시가 선택되어 있는지 확인하십시오. Android 빌드 도구 에서 29.0.0 을 선택 취소하고 28.0.3 을 선택합니다.

 

그러면 작동하지 않는 버전의 빌드 도구가 설치 제거되고 이전 버전이 설치됩니다. Apply 을 클릭하여 프로세스를 시작하면 프로세스가 완료되면 작동하는 Android 환경이 설치됩니다.

 

3 단계 : Qt 설치

이 가이드에서는 Qt 5.13.0을 사용하게 될 것입니다. 아직 시작하지 않았다면 Qt 계정 에서 온라인 설치 프로그램을 다운로드하십시오.

 

설치 프로그램을 실행할 때 arm64-v8a 및 armv7a 대상 아키텍처를 선택해야 합니다. 이것은 각각 Android 디바이스에서 가장 일반적으로 사용되는 프로세서 인 ARM 계열 프로세서의 64 비트 및 32 비트 버전에 대한 기술 이름입니다.

  • 참고 : 이 예제에서는 특히 데모로 사용할 응용 프로그램이 포함되어 있으므로 Qt Purchasing 도 필요합니다. 같은 목록에서 선택할 수도 있습니다.

 

Qt 설치가 끝나면 Qt Creator 를 시작하고 Options 을 엽니다. 장치 아래에서 Android 탭을 선택하고 이전 단계에서 다른 패키지를 설치한 디렉토리를 선택하십시오.

모든 것이 올바르게 설정되면 Qt Creator 에 녹색 체크 표시가 나타나고 Qt 로 안드로이드 개발을 할 준비가 됩니다.

 

4 단계 : Qt Creator에서 프로젝트 설정하기

이 예제에서는 Qt Hangman 예제를 사용합니다. 이는 크로스 플랫폼 방식으로 인앱 구매를 구현하는 방법을 보여주기 위해 만든 작은 예입니다.

 

먼저 Qt Creator에서 예제를 엽니다. 시작 화면에서 수행할 수 있습니다. Qt Creator 가 열리면 Qt Creator가 이를 구축하기 위해 사용할 Qt 버전을 선택하도록 요청할 것입니다.

 

Qt의 64 비트와 32 비트 버전을 모두 선택하고 Configure Project를 클릭하십시오.

Google Play의 추가 요구사항을 준수하기 위해 32 비트 장치용 및 64 비트 장치용의 두 가지 APK 패키지를 만들고자 합니다. 우리는 이들 각각을 개별적으로 구성해야 합니다.

이 스크린 샷은 32 비트 빌드의 설정 예를 보여줍니다.

 

여기서 주목해야 할 중요한 사항은 다음과 같습니다:

  • 각 빌드마다 다른 섀도우 빌드 디렉토리를 사용하십시오.
  • 릴리스 구성을 선택했는지 확인하십시오.
  • 또한 패키지 서명 확인란을 선택하여 패키지에 서명해야 합니다. 그렇지 않으면 Google Play 스토어에서 패키지를 거부합니다.

빌드 디렉토리를 제외하고는 64 비트 빌드의 설정이 동일해야 합니다. 왼쪽에 있는 64 비트 키트를 선택하고 거기에서 동일한 조정을 하십시오.

 

5 단계 : manifest 준비

또한 두 패키지는 하나의 세부 사항을 제외하고는 동일한 AndroidManifest.xml 파일이 필요합니다.

 

두 버전의 버전 코드(version code)가 달라야 합니다.

 

버전 코드는 APK가 스토어의 기기에 설치될 때 버전 코드가 가장 높은 APK를 선택한다는 점을 명심하는 한 선택할 수 있는 거의 모든 항목이 될 수 있습니다.

 

Qt 사용자 Fabien Chéreau가 버그 보고서에 대해 언급한 바에 따르면, 일반적으로 64 비트 버전의 버전 코드를 32 비트 버전보다 높게 설정하게 하게 하느 것이 좋습니다. 그래서 두 버전을 모두 지원하는 장치가 64 비트 버전을 더 선호하도록 구성합니다.

 

Felix Barz가 같은 맥락에서 지적했듯이 프로젝트의 .pro 파일에서 이 작업을 자동화할 수 있습니다. 다음은 코드를 약간 수정한 것입니다.

 


defineReplace(droidVersionCode) {

        segments = $$split(1, ".")

        for (segment, segments): vCode = "$$first(vCode)$$format_number($$segment, width=3 zeropad)"

        contains(ANDROID_TARGET_ARCH, arm64-v8a): \

            suffix = 1

        else:contains(ANDROID_TARGET_ARCH, armeabi-v7a): \

            suffix = 0

        # add more cases as needed

        return($$first(vCode)$$first(suffix))

}

VERSION = 1.2.3

ANDROID_VERSION_NAME = $$VERSION

ANDROID_VERSION_CODE = $$droidVersionCode($$ANDROID_VERSION_NAME)
 

 

이 깔끔한 트릭(감사합니다, Felix!)은 응용 프로그램의 VERSION 을 정수로 변환하고 최하위 끝에 새로운 숫자를 추가하여 아키텍처를 나타냅니다. 예를 들어 버전 1.2.3의 경우, 버전 코드는 32 비트 패키지의 경우 0010020031 이고, 64 비트 패키지의 경우 0010020031 입니다.

 

프로젝트 설정에서 APK 빌드 아래의 버튼을 사용하여 AndroidManifest.xml 을 생성하면 이 버전 코드가 프로젝트에서 자동으로 선택됩니다. 이 작업을 완료하고 매니페스트를 편집하여 응용 프로그램의 패키지 이름과 제목을 얻으려면 패키지를 빌드해야 합니다. 먼저 두 키트 중 하나를 사용하여 빌드를 수행한 다음 다른 키트를 활성화하고 다시 빌드하십시오.

 

완료되면 두 개의 릴리스 가능한 APK 패키지(이전에 설정한 각 빌드 디렉토리에 하나씩)가 제공됩니다. 빌드 디렉토리와 관련하여 패키지는 android-build\build\outputs\apk\release 있습니다.

 

보다 효율적인 설정을 위해서는이 프로세스를 자동화하는 것이 좋습니다. Qt Creator에서 사용하는 모든 도구를 명령 줄에서 실행할 수 있기 때문에 이것은 또한 가능합니다. 자세한 정보는 androiddeployqt 문서 를보십시오.

 

6 단계 : Google Play에 애플리케이션 게시

Google Play 퍼블리싱 페이지(publishing page)는 자체적으로 문서화가 되어 있으며 이를 수행하는 방법에 대한 많은 훌륭한 가이드가 있으므로 양식을 작성하는 모든 단계를 수행하지 않겠습니다. 일반적으로 요청하는 모든 정보를 입력하고 필요한 이미지를 제공하며 왼쪽 사이드 바에있는 모든 체크 표시가 녹색인지 확인하십시오. 여기에 모든 종류의 컨텐츠를 추가 할 수 있으므로 시간을 투자하십시오. 결국에는 앱의 인기도에 영향을 미칩니다.

 

일단 완료되면 App Releases 에서 새 릴리스를 만들고 APK를 업로드 할 수 있습니다.

 

한 가지 유의할 점은 처음 Google Play에서 앱 서명 키를 관리하도록 허용할지 여부를 묻는 메시지가 표시됩니다.

 

지금은 이것을 선택 해제해야 합니다. 이 기능을 사용하려면 응용 프로그램이 새로운 “Android App Bundle” 형식이어야 합니다. 아직 Qt 에서 지원하지는 않지만 이를 지원하기 위해 노력하고 있습니다. 사실, KDAB의 Bogdan Vatra (Qt의 안드로이드 포트의 관리자이기도 함)는 이미 그러한 지원을 얻는데 있어 가장 큰 문제를 해결하는 패치 를 게시했습니다.

 

우리가 지원을 받으면 릴리즈 프로세스가 좀 더 편리해질 것입니다. AAB 형식을 사용하면 Google Play 에서 다양한 아키텍처를 위한 최적화된 APK를 생성하지만 지금은 이 자습서에서 설명한대로 여러 키트를 설정하고 여러 APK를 구축하여 수동으로 이 작업을 수행해야 합니다.

 

두 개의 APK가 릴리스로 업로드되면 다음과 같은 목록이 표시됩니다. 두 개의 개별 APK 패키지는 각각 단일 기본 플랫폼을 포함합니다. 각 항목을 확장하면 “차별화 APK 세부 정보”가 무엇인지 알 수 있습니다. 기기가 Google Play 스토어에서 APK를 다운로드 할 때 다른 기기를 선택하는데 사용되는 기준입니다. 이 경우 차별화된 세부 사항이 기본 플랫폼이어야합니다.

 

32 비트 및 64 비트 바이너리 모두를 사용하여 Google Play에서 Qt 애플리케이션을 생성하고 출시 할 수 있습니다. APK가 업로드되면 게시(Publish)를 클릭하고 Google Play에서 자동화된 마술을 기다릴 수 있습니다. 현재 매장에 32 비트 앱이 있는 경우 2021년 8월 이전에 64 비트 버전으로 업데이트 해야 합니다. 비 호환 앱이 더 이상 64 비트 버전으로 제공되지 않게됩 니다. 심지어 32 비트 바이너리를 지원하더라도.

번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 91480
120 Q_D매크로와 d-pointer file makersweb 2019.05.07 1563
119 Qt기반의 오픈소스 프로젝트들 makersweb 2019.05.15 6452
118 QtSerialPort를 사용한 시리얼(Serial)통신 [3] makersweb 2019.05.21 13646
117 QML에서 멀티 스레드(multithreading) 프로그래밍 file makersweb 2019.05.25 3293
116 QtCreator Design으로 GUI만들기 (QML로 만드는 Hello World -2) [1] file makersweb 2019.05.26 16477
115 QtInstallerFramework로 온라인 설치프로그램(Online Installer)만드는 방법 [4] file makersweb 2019.05.28 7034
114 QML 강좌 - 동적 Listing (ListView) file makersweb 2019.06.01 11116
113 Qt Quick Controls 2사용 및 스타일 설정 file makersweb 2019.06.07 7073
112 Qt Creator에서 임베디드 장치로 deploy설정(Custom Process Step) file makersweb 2019.06.15 3006
111 QML, 이미지, 폰트등을 바이너리 리소스로 만들기 makersweb 2019.06.24 4364
110 Qt기반의 오픈소스 프로젝트들 - 2 운영자 2019.07.21 4779
» [Qt] Google Play의 향후 요구 사항을 준수하는 방법 [2] j2doll 2019.07.29 1651
108 [Qt News] Qt6 Git 개발 초기 단계 시작하기 j2doll 2019.08.02 3085
107 [Qt News] Qt 6 기술 비전 (Technical vision for Qt 6) [2] j2doll 2019.08.08 2807
106 열거형(enum)을 QML에서 사용하는 방법과 문자열(QString)로 얻기 makersweb 2019.08.20 4819
105 [Qt News] Qt for Python을 위한 기술 비전 j2doll 2019.08.20 2343
104 MCU용 Qt에 대해서 makersweb 2019.08.22 2562
103 QSocketNotifier로 파일 디스크립터의 활동감지 makersweb 2019.08.28 2555
102 C++로 구현된 모델을 QML의 ListView에서 참조 file makersweb 2019.09.07 5841
101 컨테이너에 적재된 객체를 편리하게 삭제하기 makersweb 2019.09.18 2365