Google 이모지 글꼴 정책 지원
Google은 앱 개발자가 최신 버전의 유니코드 이모지를 지원하도록 의무화하는 'Android: Android 이모지 정책'을 도입했습니다. 이 정책은 다음과 같이 명시하고 있습니다:
타사 라이브러리를 통해 제공되는 것을 포함하여 사용자 정의 이모지 구현을 사용하는 앱은, 새로운 유니코드 이모지가 출시된 후 4개월 이내에 Android 12 이상에서 실행될 때 최신 유니코드 버전을 완벽하게 지원해야 합니다.
이 가이드에서는 이모지 글꼴을 번들로 포함하거나 Android: Google 다운로드 가능한 글꼴을 사용하여 이 정책을 지원하는 방법을 설명합니다.
이모지 폰트 번들링 대 Google 다운로드 가능한 폰트
최신 이모지를 지원하는 두 방법 모두 장단점이 있으며, 어떤 방법이 가장 적합한지는 각 앱에 따라 다릅니다. 두 방법의 장단점은 다음과 같습니다:
글꼴 번들링의 장점:
- 글꼴 로딩 속도가 빠릅니다.
- 사용자가 인터넷에 연결되어 있지 않아도 작동
- 모든 운영 체제에서 작동
- 독립적(Qt 외에는 다른 종속성이 없음)
- 더 간단한 솔루션
글꼴 번들링의 단점:
- 애플리케이션 크기가 커집니다(NotoColorEmoji는 약 10MB).
- 새로운 버전이 출시될 때마다 글꼴을 업데이트해야 함
- 구버전 앱에서는 이모지가 자동으로 업데이트되지 않음
Google 다운로드 가능한 글꼴의 장점:
- 애플리케이션 크기가 변하지 않음
- 자동으로 업데이트됩니다
- 서로 관련이 없는 여러 앱이 동일한 글꼴을 공유합니다
Google 다운로드 가능한 글꼴의 단점:
- Google 모바일 서비스에 의존함
- Android 전용
- 이전에 캐시된 적이 없으면 글꼴을 다운로드합니다
- 사전에 캐시되어 있지 않은 경우 인터넷이 없으면 작동하지 않음
- 글꼴을 번들로 포함하는 것보다 더 복잡함
글꼴 번들링 방법
글꼴을 확보하여 번들로 묶은 후, 나중에 QML이나 C++을 사용하여 불러와야 합니다.
글꼴 가져오기
이 가이드에서는 Google NotoColorEmoji 글꼴을 사용할 것입니다. NotoColorEmoji는 SIL OPEN FONT LICENSE에 따라 라이선스가 부여된 글꼴입니다.
참고: 저장소에서 다운로드하는경우 , NotoColorEmoji.ttf 대신 NotoColorEmoji_WindowsCompatible.ttf 글꼴을 다운로드하십시오. NotoColorEmoji.ttf는 내부적으로 다른 형식으로 빌드되어 Android/Chrome/Chromium OS에서만 제대로 지원됩니다. Qt는 다른 플랫폼에서도 실행되므로, Qt 글꼴 로더에는 표준 형식의 TrueType/OpenType 글꼴이 필요합니다.
글꼴 추가
글꼴을 번들로 포함하는 올바른 방법은 Qt 리소스 시스템 파일에 글꼴을 추가하는 것입니다. 예를 들어, NotoColorEmoji_WindowsCompatible.ttf를 포함하는 별도의 리소스 파일인 "font.qrc"를 만들 수 있습니다. 새로운 리소스 파일을 포함시키려면 CMakeLists.txt에서 다음 코드를 사용하십시오.
qt_add_big_resources(PROJECT_SOURCES font.qrc)C++에서 번들된 글꼴 불러오기
C++에서 글꼴을 로드하려면 ` QFontDatabase`를 사용하십시오.
// Loading NotoColorEmoji bundled using C++ QFontDatabase
QFontDatabase::addApplicationFont(QStringLiteral(":/NotoColorEmoji_WindowsCompatible.ttf"));참고: 위코드는 ` QQmlApplicationEngine `가 QML을 로드하기 전에 사용해야 합니다. 그래야 QML이 로드될 때 글꼴이 이미 존재하여 바로 사용할 수 있습니다.
QML에서 번들 폰트 불러오기
QML에서 글꼴을 로드하려면 ` FontLoader`를 사용하십시오:
// Loading NotoColorEmoji using QML FontLoader
FontLoader {
source:"NotoColorEmoji_WindowsCompatible.ttf"
}Google 다운로드 가능한 글꼴 사용:
이모지 글꼴에 Google 다운로드 가능한 글꼴을 사용하면 애플리케이션 크기를 늘리지 않고도 자동으로 업데이트되는 이모지 글꼴을 제공할 수 있습니다. '다운로드 가능한 글꼴' 기능을 사용하여 글꼴을 다운로드하는 과정에 대한 자세한 내용은 Android: 다운로드 가능한 글꼴 프로세스에서 확인할 수 있습니다.
이 가이드에서는 다음과 같은 절차를 따릅니다:
- C++ 코드 시작
- C++에서 Java 함수 호출
- Java가 GDF를 호출하여 글꼴을 가져옵니다
- Java가 폰트 URI를 엽니다
- Java가 파일 디스크립터를 C++에 반환
- C++이 다음을 사용하여 글꼴을 로드합니다 QFontDatabase
구성
Google Downloadable Fonts는 API 레벨 26(Android 8.0)부터 사용할 수 있습니다. 하지만 앱에서 AndroidX를 사용하는 경우 API 14까지 이전 버전의 API를 지원할 수 있습니다.
참고: Android문서에서는 AndroidX 대신 Android: Support Library를 언급합니다. 하지만 Support Library는 더 이상 유지 관리되지 않고 AndroidX로 대체되었으므로, Google의 권장 사항에 따라 대신 AndroidX를 사용했습니다.
Android 패키지 템플릿 사용자 정의
먼저, Android 패키지 템플릿을 사용자 정의해야 합니다. 이를 위해 Qt Creator 에서 ‘프로젝트(Projects)’ 탭으로 이동한 다음, ‘빌드 설정(Build Settings)’에서 “Build Android APK”를 검색하세요. 해당 항목은 “빌드 단계(Build Steps)” 내에 있으며, 세부 정보를 확장하면 “템플릿 생성(Create Templates)” 버튼이 나타납니다.

'템플릿 생성'을 클릭하고 마법사의 안내를 따르면, 마지막에 Android용 구성 파일이 여러 개 들어 있는 폴더가 생성됩니다. 기본적으로 이 폴더는 프로젝트 디렉터리 내에 ' android '라는 이름으로 생성됩니다.
qmake를 사용하여 Android 템플릿을 사용자 정의하는 방법에 대한 정보는 Android 패키지 템플릿을 참조하십시오.
이 가이드와 같이 CMake와 Qt 6을 사용하는 경우, QT_ANDROID_PACKAGE_SOURCE_DIR 속성을 설정해야 합니다. 예:
set_property(TARGET emojiremotefont PROPERTY
QT_ANDROID_PACKAGE_SOURCE_DIR
${CMAKE_CURRENT_SOURCE_DIR}/android)AndroidX 추가
AndroidX를 추가하려면 위에서 생성한 QT_ANDROID_PACKAGE_SOURCE_DIR 폴더 내의 build.gradle 파일을 열고, 해당 파일에 다음 종속성을 추가하십시오:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation 'androidx.appcompat:appcompat:1.4.1'
}AndroidX를 사용하려면 해당 플래그를 설정해야 합니다. 이를 위해 QT_ANDROID_PACKAGE_SOURCE_DIR 폴더 내에 gradle.properties 라는 파일을 생성하고 다음 줄을 추가하세요:
android.useAndroidX=true글꼴 제공자 인증서 추가
AndroidX를 사용하고 있으므로, Android: Font Provider Certificates를 추가하는 또 다른 구성이 필요합니다. GMS 글꼴 제공자를 사용하려면 Android: GMS Font Provider Certificates를 다운로드하십시오. 다른 글꼴 제공자를 사용하는 경우, 해당 제공자로부터 직접 인증서를 확보해야 합니다.
파일을 다운로드한 후, android 템플릿 폴더 내의 values 폴더에 복사하여 Android 리소스(Qt 리소스 시스템이 아님)에 추가하십시오. 다음 이미지는 올바른 폴더 위치를 (1)에 표시하고 있습니다:

Java 코드
자, 이제 코드를 자세히 살펴보겠습니다!
Android 템플릿에 Java/Kotlin 코드를 추가해야 합니다. 해당 코드를 android 템플릿 폴더 내의 src 폴더에 배치하세요. src 폴더와 Java 파일을 위한 폴더 구조를 직접 생성해야 할 수도 있습니다. 이 폴더 구조는 앞 섹션의 (2)에 있는 ‘Android 템플릿 폴더’ 이미지에서 확인할 수 있습니다.
C++에서 폰트를 가져오려면 Java 코드에서 다음을 수행해야 합니다:
- 글꼴 요청 생성
- 글꼴 요청을 사용하여 FontsContractCompat에서 글꼴 가져오기
- 글꼴 정보 및 글꼴 URI(콘텐츠 스키마 파일) 가져오기
- URI를 열어 파일 디스크립터를 가져옵니다
- 파일 디스크립터를 C++ 코드로 반환
글꼴 요청을 생성하려면 글꼴 제공자 정보(인증 기관, 패키지, 인증서)와 글꼴에 대한 검색 쿼리가 필요합니다. 인증서의 경우, 이전에 Android 리소스에 추가된 GMS 글꼴 제공자 인증서 파일 fonts_cert.xml 을 사용하십시오.
// GMS fonts provider data
private static final String PROVIDER_AUTHORITY = "com.google.android.gms.fonts";
private static final String PROVIDER_PACKAGE = "com.google.android.gms";
// Emoji font search query (copied from EmojiCompat source)
private static final String EMOJI_QUERY = "emojicompat-emoji-font";
// Font Certificates resources strings (from fonts_certs.xml)
private static final String FONT_CERTIFICATE_ID = "com_google_android_gms_fonts_certs";
private static final String FONT_CERTIFICATE_TYPE = "array";
(...)
// obtain id for the font_certs.xml
int certificateId = context.getResources().getIdentifier(
FONT_CERTIFICATE_ID,
FONT_CERTIFICATE_TYPE,
context.getPackageName());
// creating the request
FontRequest request = new FontRequest(
PROVIDER_AUTHORITY,
PROVIDER_PACKAGE,
EMOJI_QUERY,
certificateId);이제 방금 생성한 요청을 사용하여 글꼴을 가져옵니다:
// fetch the font
FontsContractCompat.FontFamilyResult result =
FontsContractCompat.fetchFonts(context, null, request);FontInfo 와 URI를 가져옵니다:
final FontsContractCompat.FontInfo[] fontInfos = result.getFonts();
final Uri emojiFontUri = fontInfos[0].getUri();URI를 사용하여 새로운 네이티브 파일 디스크립터를 엽니다:
final ContentResolver resolver = context.getContentResolver();
// in this case the Font URI is always a content scheme file, made
// so the app requesting it has permissions to open
final ParcelFileDescriptor fileDescriptor =
resolver.openFileDescriptor(fontInfos[0].getUri(), "r");
// the detachFd will return a native file descriptor that we must close
// later in C++ code
int fd = fileDescriptor.detachFd();
// return fd to C++참고: Java로 작성된모든 코드는 JNI를 사용하여 C++로도 구현할 수 있습니다. 이 가이드에 제시된 코드는 단순화된 것입니다. 실제 운영 환경에 적용할 코드는 예외 처리 등을 포함하여 반드시 검증해야 합니다.
C++ 코드
자바 쪽 작업은 모두 끝났습니다. 이제 C++ 쪽으로 넘어가 보겠습니다.
C++은 Java 코드를 호출하고 파일 디스크립터를 사용하여 Qt에 글꼴을 불러오는 역할을 담당합니다.
Qt 6에서 C++과 Java 간의 통신 방식에 대해 더 깊이 이해하려면 Qt for Android Notifier 예제를 확인해 보세요.
Java 코드에서 파일 디스크립터를 얻은 후, 해당 파일 디스크립터를 ` QFile ` 클래스로 래핑하고 ` QFontDatabase`를 사용하여 글꼴 파일을 로드합니다:
QFile file;
file.open(fd, QFile::OpenModeFlag::ReadOnly, QFile::FileHandleFlag::AutoCloseHandle);
QFontDatabase::addApplicationFontFromData(file->readAll());© 2026 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.