안드로이드용 Qt의 작동 방식

Qt가 안드로이드 플랫폼을 지원하는 방법에 대한 개괄적인 개요를 찾고 있는 개발자라면 이 페이지가 도움이 될 것입니다.

Qt 애플리케이션 시작하기

네이티브 안드로이드 앱과 마찬가지로, 앱이 시작되고 액티비티가 생성될 때 Qt 메인 액티비티의 onCreate() 가 초기에 호출됩니다. 여기서 안드로이드 Qt 플랫폼 추상화 (QPA)의 초기화가 대부분 이루어집니다. 가장 중요한 부분은 다음과 같습니다:

  • Qt 및 기본 애플리케이션의 라이브러리 로드.
  • 렌더링 표면과 최상위 레이아웃을 초기화하고 입력, 디스플레이, 터치 핸들러 등 다양한 리스너를 등록하는 델리게이트를 초기화합니다.

Qt 라이브러리를 로드할 때, QtCore 이 처음 로드되는 동안 JavaVM이 캐시됩니다. 이 작업은 System.load() 호출을 사용하여 라이브러리가 로드될 때 동기적으로 호출되는 JNI_OnLoad() 함수에서 수행됩니다. 모든 Qt 모듈에는 네이티브 JNI 메서드 등록과 같은 일부 모듈별 초기화를 수행하기 위해 이 함수에 대한 구현이 있을 수 있습니다.

모든 Qt 모듈 라이브러리가 로드되면 Qt는 안드로이드 QPA 플러그인과 메인 애플리케이션 라이브러리를 로드합니다. 최상위 레벨 QtLayout 레이아웃의 콘텐츠 인플레이션이 완료되면 Qt 애플리케이션의 main() 핸들을 찾아서 호출합니다. 그러면 C++ Qt 애플리케이션이 시작되고 일반적으로 메인 이벤트 루프가 시작됩니다.

안드로이드 QPA

안드로이드 QPA는 안드로이드(Java/Kotlin) 측과 네이티브 Qt(C++) 측을 접착하는 역할을 합니다. Qt에서 안드로이드로의 다양한 이벤트 및 신호 전파를 처리합니다. 신호 처리, 터치 이벤트, UI 요소, 렌더링 등을 담당합니다. 또한 이 계층은 앱 시작 초기화와 앱 종료 또는 삭제 시 정리를 담당합니다.

스레드

안드로이드 앱용 Qt에는 보통 두 개의 스레드가 있습니다. 첫 번째는 Qt가 시작하는 QtThread 입니다. 두 번째는 안드로이드 UI 스레드입니다.

QtThread

이 스레드는 예를 들어 라이브러리를 로드하기 전에 Qt 앱에서 먼저 구현되고 시작됩니다. 이 스레드의 이름은 qtMainLoopThread 입니다. 다음 작업은 모두 이 스레드에서 실행됩니다:

  • Qt 라이브러리 로딩.
  • JNI_OnLoad() 내에서 수행되는 작업.
  • 네이티브 애플리케이션 시작.
  • main() 의 실행.

안드로이드 UI 스레드

안드로이드 앱과 마찬가지로 UI에 영향을 미치는 작업은 UI 스레드에서 실행될 것으로 예상됩니다. Qt는 UI에서 실행될 것으로 예상되는 모든 내부 호출에 대해 내부적으로 이를 수행합니다. 또한 Qt는 C++ 코드에서 이 스레드에서 작업을 실행할 수 있는 runOnAndroidMainThread() API를 제공합니다. 이 API를 사용하여 Qt는 앱이 활성화된 경우 호출이 스레드에 직접 게시되거나 앱이 일시 중지되거나 백그라운드에 있는 경우 큐에 대기하는 시기를 관리합니다.

아키텍처

"An overview Qt for Android's Architecture"

Qt 클래스

다음 섹션에서는 다양한 Qt 안드로이드 클래스와 Qt 애플리케이션에서의 기능 및 역할에 대해 설명합니다.

공용 자바 바인딩

이러한 클래스는 활동, 서비스애플리케이션과 같은 사용자 대면 클래스의 내부 구현 세부 사항을 래핑하는 공용 클래스입니다. 이러한 클래스는 Qt 안드로이드 앱에 기본적으로 사용되며 안드로이드 매니페스트 파일에서 참조됩니다. 빌드 시스템과 배포 도구는 빌드에 이러한 클래스를 포함시키는 작업을 처리합니다.

사용자는 이러한 클래스를 사용하여 기본 동작을 변경하거나 확장할 수 있습니다. 예를 들어 onCreate() 아래에 사용자 정의 사용자 정의 로직을 추가하려면 다음을 사용합니다:

public class MyActivity extends QtActivity
{
    @Override
    protected void onCreate(Bundle bundle)
    {
        // code before Qt is initialized
        super.onCreate(bundle);
        // code after Qt is initialized
    }
}

참고: 사용자 지정 활동 또는 바인딩 클래스를 사용하려면 AndroidManifest.xml 파일을 편집해야 하며, 그렇지 않으면 기본 클래스가 계속 사용됩니다.

테마 설정하기

QtActivity를 확장할 때 setTheme()를 사용하여 특정 안드로이드 테마를 설정할 수 있습니다. 그러나 이 호출은 Qt가 기본적으로 테마를 설정하기 때문에 부모 클래스의 onCreate( )를 호출하기 전에 수행해야 적용됩니다. 예를 들어 다음을 사용할 수 있습니다:

@Override
protected void onCreate(Bundle bundle)
{
    setTheme(android.R.style.Theme_DeviceDefault_DayNight);
    super.onCreate(bundle);
}

기본적으로 안드로이드 10 이상의 경우 Qt는 테마를 Theme_DeviceDefault_DayNight 스타일로, 이전 버전에서는 Theme_Holo_Light 스타일로 설정합니다.

애플리케이션 파라미터 추가하기

Java/Kotlin에서 애플리케이션의 (main()) 함수에 전달되는 인수인 추가 애플리케이션 파라미터를 추가하려면 QtActivity를 확장한 후 다음을 수행할 수 있습니다:

@Override
protected void onCreate(Bundle bundle)
{
    appendApplicationParameters("--flag value");
    super.onCreate(bundle);
}

이는 CMake 변수 QT_ANDROID_APPLICATION_ARGUMENTS를 직접 사용하는 것과 유사합니다. 두 방법을 사용하여 전달된 매개변수는 공백이나 탭을 구분 기호로 사용할 수 있으며, 애플리케이션에 전달된 최종 매개변수 목록은 QProcess::splitCommand 을 사용하여 구문 분석됩니다.

QtLoader로 Qt 라이브러리 로드하기

모든 Qt 안드로이드 앱은 해당 모듈의 기능을 호출하기 전에 모든 네이티브 Qt 또는 타사 라이브러리가 먼저 로드되었는지 확인해야 합니다. 빌드 시스템은 다양한 Qt 라이브러리 종속성, QPA 플러그인, 기본 앱 라이브러리 및 타사 라이브러리의 목록을 애플리케이션의 libs.xml 리소스 파일 아래에 보관합니다. 아래 섹션에서 언급된 모든 필수 단계가 완료되면 System.load()를 사용하여 라이브러리가 로드됩니다.

클래스 로더

클래스 로더 객체는 Qt 라이브러리를 로드하거나 델리게이트를 초기화하기 전에 QtLoader 에 의해 초기에 설정됩니다. 이는 클래스 로더가 QJniObject 에서 Java 클래스를 찾는 데 사용되며 QJniObject 으로 JNI 호출을 수행하는 데 필요하기 때문입니다.

환경 변수 및 애플리케이션 파라미터 설정

라이브러리를 로드하기 전에 Qt는 설정할 안드로이드 매니페스트에 환경 변수가 메타데이터로 전달되었는지 확인해야 합니다. 이 단계를 통해 매니페스트 메타데이터로 설정된 구성 플래그를 기반으로 일부 모듈을 초기화할 수 있습니다. 이 메타데이터 중 일부는 애플리케이션이 시작될 때 애플리케이션에 전달되는 애플리케이션 매개변수 목록에도 전파됩니다.

setActivity(), setContext() 및 setService()

다양한 Qt 모듈은 Java 측에서 액티비티나 서비스의 컨텍스트가 필요한 초기화 작업을 수행해야 할 수 있습니다. 그런 다음 해당 모듈은 액티비티, 서비스 또는 컨텍스트를 매개변수로 받는 정적 메서드를 구현합니다:

void setActivity(Activity activity)
{
    m_activity = activity;
    // Other logic
}

그런 다음 QtLoader 은 네이티브 공유 라이브러리를 로드하기 직전에 로더의 상위 컨텍스트를 사용하여 이러한 메서드를 호출합니다.

안드로이드용 Qt가 안드로이드 액티비티 라이프사이클을 처리하는 방법

안드로이드용 Qt는 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()와 같은 안드로이드 액티비티 생명 주기 콜백을 직접 처리하는 API를 제공하지 않습니다. 대신 사용자를 위해 내부에서 이러한 함수를 처리합니다. 이러한 동작은 다음 섹션에 설명되어 있습니다.

참고: 이러한 수명 주기 이벤트는 QGuiApplication::applicationStateChanged 신호로 변환됩니다.

컨텍스트 처리

QAndroidApplication 는 안드로이드 시스템과 상호 작용하는 데 필수적인 안드로이드 컨텍스트를 QJniObject 로 제공할 수 있습니다. 이 컨텍스트는 활동 또는 서비스일 수 있습니다. 활동이 있는 경우 서비스가 있는지 여부에 관계없이 가장 최근에 시작한 활동이 됩니다. 서비스만 있는 경우 가장 최근에 시작한 서비스가 됩니다.

참고: 안드로이드용 Qt는 다중 액티비티를 지원하지 않습니다.

콜백

QtActivityBase 클래스는 안드로이드용 Qt 패키지 내에서 액티비티의 다양한 기능에 대한 구현 세부 사항을 비공개로 유지하도록 설계되었습니다. 이 클래스는 안드로이드 라이프 사이클과 Qt 프레임워크 사이의 매개체로, 안드로이드 라이프 사이클 콜백을 Qt 애플리케이션이 응답할 수 있는 시그널과 연산으로 변환합니다.

onCreate()

액티비티가 생성되면 QtActivityBase는 Qt 환경을 초기화합니다. 여기에는 Qt 라이브러리 로드, QJniObject 에서 사용하는 클래스 로더 설정, 앱의 메타데이터 구문 분석, 실행을 위한 Qt 애플리케이션 준비 등이 포함됩니다. 액티비티에 필요한 모든 초기화가 처리되도록 합니다.

onStart()

안드로이드의 Activity.OnStart()를 호출합니다.

onResume()

액티비티가 포그라운드로 이동하면 QtActivityBase가 Qt 애플리케이션을 재개합니다. 일시 중지된 프로세스나 작업이 계속되고 애플리케이션이 다시 사용자 상호작용을 위한 준비가 되었는지 확인합니다. onPause()에 의해 중지된 디스플레이 관리자 리스너를 다시 등록합니다.

onPause()

다른 액티비티가 액티비티를 부분적으로 가리는 경우, QtActivityBase는 Qt 애플리케이션을 일시 중지합니다. 애플리케이션이 포그라운드에 있지 않은 동안에는 애플리케이션 상태를 저장하거나 필요하지 않은 리소스를 해제합니다.

onStop()

액티비티가 더 이상 보이지 않을 때, QtActivityBase는 Qt 애플리케이션을 중지하여 보다 광범위한 상태 저장 및 리소스 릴리스를 수행하여 애플리케이션이 잠재적으로 소멸될 수 있도록 준비합니다.

참고: 이 시점에서 QtThread는 일시 중단됩니다.

onDestroy()

액티비티가 완료되었거나 시스템에 의해 소멸되는 경우, QtActivityBase는 Qt 어플리케이션과 관련된 모든 리소스를 정리합니다. 이는 적절한 종료와 필요한 모든 정리 작업이 수행되도록 합니다.

이러한 통합을 통해 개발자는 QtActivityBase가 내부에서 이러한 복잡성을 관리하므로 안드로이드 라이프사이클의 복잡성에 대해 걱정할 필요 없이 Qt 애플리케이션 빌드에만 집중할 수 있습니다.

스플래시 화면 관리

QAndroidApplication 는 페이드 효과로 스플래시 화면을 숨길 수 있으며, 애플리케이션의 시작 시퀀스(일반적으로 onCreate() 이후)에 맞춰 타이밍을 지정할 수 있습니다.

안드로이드용 Qt에 대한 자세한 정보

2021 Qt 월드 서밋의 비디오는 안드로이드용 Qt에 대한 개요를 제공합니다.

"YouTube 동영상으로 연결되는 안건 사진"

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.