Google 이모티콘 글꼴 정책 지원
Google은 앱 개발자가 최신 버전의 유니코드 이모티콘을 지원하도록 하는 Android: 안드로이드 이모티콘 정책을 도입하여 앱 개발자가 최신 버전의 유니코드 이모티콘을 지원하도록 강제하고 있습니다. 정책은 다음과 같이 명시하고 있습니다:
타사 라이브러리에서 제공하는 것을 포함하여 사용자 지정 이모티콘을 구현한 앱은 새로운 유니코드 이모티콘이 출시된 후 4개월 이내에 Android 12 이상에서 실행될 때 최신 유니코드 버전을 완벽하게 지원해야 합니다.
이 가이드에서는 이모티콘 글꼴을 번들로 제공하거나 안드로이드를 사용하여 이 정책을 지원하는 방법을 설명합니다: Google 다운로드 가능한 글꼴.
이모티콘 폰트 번들링과 Google 다운로드 가능한 폰트 비교하기
최신 이모티콘을 지원하기 위한 두 가지 방법의 장단점은 각 앱에 따라 다릅니다. 다음은 두 가지 방법의 몇 가지 장단점입니다:
글꼴 번들링의 장점:
- 글꼴의 빠른 로딩
- 사용자가 인터넷에 연결되어 있지 않을 때 작동
- 모든 운영 체제에서 작동
- 독립적(Qt 이외의 다른 종속성 없음)
- 더 간단한 솔루션
글꼴 번들링의 단점:
- 애플리케이션 크기가 증가합니다(NotoColorEmoji는 ~10MB).
- 최신 릴리스에서 글꼴 업데이트 필요
- 이전 앱은 이모티콘을 자동으로 업데이트하지 않습니다.
구글 다운로드 글꼴의 장점:
- 애플리케이션 크기를 변경하지 않음
- 자동으로 업데이트됨
- 관계가 없는 여러 앱이 동일한 글꼴을 공유
Google 다운로드 가능한 글꼴의 단점:
- Google 모바일 서비스에 따라 다름
- 안드로이드 전용
- 이전에 캐시되지 않은 경우 글꼴을 다운로드합니다.
- 이전에 캐시되지 않은 경우 인터넷이 없으면 작동하지 않음
- 글꼴 번들링보다 더 복잡함
글꼴을 번들링하는 방법
글꼴을 가져와 번들로 묶은 다음 나중에 QML 또는 C++를 사용하여 로드해야 합니다.
글꼴 가져오기
이 가이드에서는 Google NotoColorEmoji 글꼴을 사용하겠습니다. NotoColorEmoji는 SIL 오픈 폰트 라이선스 라이선스를 받은 글꼴입니다.
참고: 리포지토리에서 다운로드하는 경우 NotoColorEmoji.ttf 대신 NotoColorEmoji_WindowsCompatible.ttf 글꼴을 다운로드하세요. NotoColorEmoji.ttf는 내부적으로 다른 포맷으로 빌드되어 있으며 안드로이드/크롬/크로미움 OS에서만 잘 지원됩니다. Qt는 다른 플랫폼에서 실행되기 때문에 Qt 폰트 로더에는 표준 형식의 트루타입/오픈타입 폰트가 필요합니다.
폰트 추가하기
폰트를 번들링하는 올바른 방법은 Qt 리소스 시스템 파일에 추가하는 것입니다. 예를 들어, 글꼴에 대한 별도의 리소스 파일인 "font.qrc"를 NotoColorEmoji_WindowsCompatible.ttf와 함께 만들 수 있습니다. 새 리소스 파일을 임베드하려면 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 다운로드 가능한 글꼴은 API 레벨 26(Android 8.0)에서 사용할 수 있습니다. 그러나 앱이 AndroidX를 사용하는 경우 API 14까지 이전 API를 지원할 수 있습니다.
참고: Android 문서는 Android : 지원 라이브러리를 참조합니다. 그러나 지원 라이브러리는 더 이상 유지 관리되지 않고 AndroidX로 대체되었으므로 Google의 권장 사항을 따라 AndroidX를 대신 사용했습니다.
Android 패키지 템플릿 사용자 지정하기
먼저 Android 패키지 템플릿을 사용자 지정해야 합니다. 이를 위해 Qt Creator 에서 프로젝트 탭으로 이동한 다음 빌드 설정에서 "안드로이드 APK 빌드"를 검색합니다. "빌드 단계" 안에 있어야 하며 세부 정보를 확장하면 "템플릿 만들기"라는 버튼이 나타납니다.
"템플릿 만들기"를 클릭하고 마법사를 따라가면 마지막에 Android용 구성 파일이 여러 개 있는 폴더가 생성됩니다. 기본적으로 프로젝트 디렉토리 내에 android
폴더가 생성됩니다.
qmake를 사용하여 안드로이드 템플릿을 사용자 지정하는 방법에 대한 정보는 안드로이드 패키지 템플릿을 참조하세요.
이 가이드에서와 같이 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를 추가하는 것입니다: 글꼴 공급자 인증서를 추가해야 합니다. GMS 글꼴 제공업체를 사용하려면 Android: GMS 글꼴 공급자 인증서를 다운로드하세요. 다른 글꼴 제공업체를 사용하는 경우 제공업체 자체에서 인증서를 받아야 합니다.
파일을 다운로드한 후 안드로이드 템플릿 폴더의 values
폴더에 복사하여 안드로이드 리소스(Qt 리소스 시스템이 아닌)에 추가합니다. 다음 이미지는 (1)의 올바른 폴더를 보여줍니다:
Java Code
자, 이제 코드를 살펴봅시다!
Android 템플릿에 Java/Kotlin 코드를 추가해야 합니다. 안드로이드 템플릿 폴더의 src
폴더 아래에 코드를 넣습니다. src
폴더와 자바 파일의 폴더 구조를 만들어야 할 수도 있습니다. 이 폴더 구조는 이전 섹션의 (2)의 안드로이드 템플릿 폴더 이미지에서 확인할 수 있습니다.
C++에서 글꼴을 얻으려면 자바 코드가 필요합니다:
- 글꼴 요청을 생성합니다.
- 폰트 요청을 사용하여 FontsContractCompat에서 폰트를 가져옵니다.
- 글꼴 정보 및 글꼴 URI(콘텐츠 체계 파일)를 가져옵니다.
- URI를 열고 파일 설명자를 가져옵니다.
- 파일 설명자를 C++ 코드로 반환합니다.
글꼴 요청을 생성하려면 글꼴 공급자 정보(권한, 패키지 및 인증서)와 글꼴에 대한 검색 쿼리가 필요합니다. 인증서의 경우 앞서 안드로이드 리소스에 추가한 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++ 코드
Java 쪽에서는 모두 완료되었습니다. C++ 측면으로 넘어가 보겠습니다.
C++는 Java 코드를 호출하고 파일 기술자를 사용하여 글꼴을 Qt로 로드하는 역할을 합니다.
Qt 6에서 C++와 Java 간의 통신이 어떻게 작동하는지 더 깊이 이해하려면 Qt 안드로이드 알림 예제를 확인하십시오.
Java 코드에서 파일 기술자를 얻은 후 파일 기술자를 QFile 클래스로 래핑하고 QFontDatabase 을 사용하여 폰트 파일을 로드합니다:
QFile file; file.open(fd, QFile::OpenModeFlag::ReadOnly, QFile::FileHandleFlag::AutoCloseHandle); QFontDatabase::addApplicationFontFromData(file->readAll());
© 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.