Library / SDK
vanniktech/Emoji avatar
vanniktech/Emoji

vanniktech/Emoji for Android and JVM emoji handling

A library to add Emoji support to your Android / iOS / JVM Application

1,643 stars294 forksKotlinApache-2.0

At a glance

What is it?
vanniktech/Emoji is a Kotlin Multiplatform library for rendering, selecting, parsing and searching emojis in Android and JVM applications. It provides Android Views and several visual providers, but its JVM functionality is narrower than its Android integration.
Who is it for?
Android teams that want a configurable emoji picker or emoji-aware Views can adopt vanniktech/Emoji after checking their required display components, provider assets and runtime font policy. JVM-only teams should inspect the sample module first and should not expect the Android picker controls to transfer directly.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 3 days ago.
What is it written in?
Mainly Kotlin, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 20, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Where vanniktech/Emoji fits in an application

vanniktech/Emoji addresses two related but different problems. On Android, it supplies an emoji picker and View subclasses that render emoji content instead of leaving the application to build those pieces around the platform keyboard. On the JVM, it provides text parsing and searching support through a sample module. This makes the project relevant to Kotlin application teams that need emoji recognition across Android input and display boundaries, plus backend code that has to interpret emoji in stored text.

The Android library is not limited to one input widget. `EmojiPopup` overlays a soft keyboard with a `PopupWindow`, while `EmojiView` can act independently as a categorized selector. Display-oriented classes include `EmojiEditText`, `EmojiTextView`, `EmojiButton`, `EmojiCheckbox`, `EmojiAutoCompleteTextView` and `EmojiMultiAutoCompleteTextView`. `EmojiLayoutFactory` is another convenience layer for adding emoji behavior to ordinary Android Views such as `TextView` and `Checkbox`.

That breadth makes the library closer to an application UI toolkit for emoji than a simple text encoder. It is most useful when an Android product needs both selection and consistent rendering. A JVM service that only needs to identify or search emoji characters has a much smaller surface area, so adopting the complete UI library would not be justified by the parsing feature alone.

Provider architecture and emoji asset loading

The central design choice is the separate emoji provider module. The repository includes `emoji-ios`, `emoji-google`, `emoji-facebook`, `emoji-twitter`, `emoji-google-compat` and `emoji-material`. The README documents installable examples for iOS, Google, Facebook and Twitter styling. A provider determines which emoji artwork the Android UI uses rather than forcing every application to share one visual presentation.

For the iOS, Google, Facebook and Twitter providers, the README states that emojis are packaged as pictures and loaded at runtime. This gives applications a choice of familiar visual styles, but it also means the selected provider contributes packaged image assets to the application. The README does not document image compression, cache eviction, memory behavior or behavior under extreme asset pressure, so teams with strict package-size or memory targets should inspect the chosen module before settling on it.

Google Compat follows a different route. It uses AndroidX Emoji2 and obtains `Noto Color Emoji Compat` as a font downloaded at runtime. According to the README, this produces a much smaller library than picture-based providers because the font is not bundled in the same way. The trade-off is explicit dependence on a runtime font download and Google Play services certificate resources. The README does not document an offline guarantee or a fallback for a failed font request.

Installing the iOS provider and first Android setup

The shortest documented setup uses the iOS provider. Add the released provider dependency to the Android module's Gradle configuration. The README uses version `0.24.1`, which matches the latest listed release.

groovy
implementation("com.vanniktech:emoji-ios:0.24.1")

After resolving the dependency, register `IosEmojiProvider` with `EmojiManager` from the application class. The README does not specify a complete `Application` class in this snippet, so the initialization should be placed in the class already used by the application rather than in a new component without project context.

kotlin
import com.vanniktech.emoji.EmojiManager
import com.vanniktech.emoji.ios.IosEmojiProvider

EmojiManager.install(IosEmojiProvider())

That provider installation is only the first layer. A usable picker still requires placing `EmojiPopup` or `EmojiView` in the application UI and connecting the selected emoji to the relevant input field. The README names the components but does not include a complete layout XML or event-handler tutorial. Consequently, it confirms the initialization path without documenting exact view IDs, listener signatures or lifecycle handling. Those implementation details must be checked in repository examples or source before treating the three-line provider registration as a complete feature.

Choosing image providers versus Google Compat

The picture providers offer four named styles, but selecting a style is not the same as selecting an emoji standard. The README names iOS, Google, Facebook and Twitter modules, and the repository layout also includes `emoji-material`. It does not provide a table explaining Unicode coverage, version synchronization or naming differences between them. Visual screenshots can establish appearance, but they cannot confirm which Unicode sequences every provider recognizes.

Google Compat is the exception with a different loading model. Its provider is initialized with an AndroidX `EmojiCompat` configuration created from a `FontRequest`.

kotlin
import androidx.core.provider.FontRequest
import androidx.emoji.text.EmojiCompat
import androidx.emoji.text.FontRequestEmojiCompatConfig
import com.vanniktech.emoji.EmojiManager
import com.vanniktech.emoji.googlecompat.GoogleCompatEmojiProvider

The README also requires an XML array named `com_google_android_gms_fonts_certs`, with development and production certificate arrays. The displayed certificate resource is truncated, so it cannot be reproduced safely as a complete resource file here. This is a real setup constraint rather than a minor omission: provider initialization also depends on Android resources and a downloadable font.

Picture-based providers avoid that documented runtime font path, but they add packaged artwork. Google Compat reduces that packaging cost while introducing network and platform configuration concerns. Neither route can be selected solely from appearance screenshots.

Android widgets versus AndroidX Emoji2

vanniktech/Emoji can be seen as an alternative to relying only on AndroidX Emoji2. The README offers AndroidX Emoji2 support and documents a Google Compat provider built around `EmojiCompat`, `FontRequestEmojiCompatConfig` and `Noto Color Emoji Compat`. That route focuses on emoji font rendering through the AndroidX emoji stack.

The native vanniktech providers add a different layer. They include categorized selection with `EmojiView`, keyboard-overlay behavior with `EmojiPopup`, recent-emoji interfaces shown in the README screenshots, and application-specific View subclasses. AndroidX Emoji2 is therefore the closer comparison when the requirement is font-based rendering. vanniktech/Emoji is more relevant when the application also needs its own selection UI or controls that display emoji consistently.

That comparison has a boundary. The README does not provide a direct feature matrix between vanniktech/Emoji and AndroidX Emoji2, and it does not state that every picker component is interchangeable with AndroidX configuration. An Android team already standardized on Emoji2 may prefer Google Compat to avoid a second rendering stack, but a team needing picker components still has to evaluate whether AndroidX alone covers that requirement.

JVM parsing limits and backend use

The JVM portion should not be mistaken for a second emoji picker implementation. The README directs developers to the sample JVM module for text parsing and searching functionality. Based on the repository layout, the JVM code is separate from Android UI modules such as `emoji-android`, `emoji-ios` and `emoji-google`. The `jvm` entry and the main `emoji` module indicate a shared or related Kotlin codebase, but the README does not enumerate the public JVM API.

This distinction matters for backend evaluation. Parsing and searching can be relevant when processing user-authored messages, indexing content or validating text. The README does not document normalization, grapheme segmentation, variation selectors, skin-tone handling, malformed surrogate behavior or thread safety. None of those guarantees should be inferred from the word `Kotlin` or from Android picker behavior.

A JVM team should inspect `jvm` directly and run its sample against representative text before adoption. If the requirement is merely to retain Unicode emoji as ordinary Kotlin strings, a dedicated parser may be unnecessary. If it is to parse or search emoji according to specific recognition rules, the undocumented API and test coverage become the first acceptance criteria.

Maintenance, upgrades and Apache-2.0 obligations

The repository is not archived. Its last push was on 2026-10-13, and the release history includes `0.24.1` dated 2026-03-23, `0.23.0` dated 2025-11-28 and `0.22.0` dated 2025-09-08. These facts show recent repository activity and published versions, but the README does not define a support window for older releases or promise compatibility with future Android, Kotlin or AndroidX changes.

Upgrade work is not fully documented in the README. The repository contains `UPDATING.md` and `CHANGELOG.md`, so migration notes and release-specific changes are the appropriate files to inspect for an upgrade. No version can be called a long-term-support release from the release list alone. Applications should also account for provider-specific dependency changes, including the AndroidX configuration required by Google Compat.

The project uses the Apache-2.0 license. That license includes copyright and license notices, license text and stated conditions, but this review does not interpret whether a particular distribution meets every obligation. The `LICENSE` file and the chosen modules' dependency metadata are the project-specific files to verify before shipping a build.

Editorial conclusion

Android teams that want a configurable emoji picker or emoji-aware Views can adopt vanniktech/Emoji after checking their required display components, provider assets and runtime font policy. JVM-only teams should inspect the sample module first and should not expect the Android picker controls to transfer directly. Before selecting a provider, verify that its image style matches the application and that the project accepts the runtime resource-loading model described in the README.

Frequently asked questions

How do I add iOS-style emojis to an Android app using vanniktech/Emoji?

Add `com.vanniktech:emoji-ios:0.24.1`, then call `EmojiManager.install(IosEmojiProvider())` from the application class. The README also requires a picker or emoji-aware View to use the provider in the UI.

Does vanniktech/Emoji load Google emojis from a font?

It depends on the provider. The standard Google provider packages emojis as pictures, while `emoji-google-compat` uses AndroidX Emoji2 and downloads the `Noto Color Emoji Compat` font at runtime.

Can vanniktech/Emoji parse and search emoji in a JVM application?

The README points JVM users to the sample `jvm` module for text parsing and searching. It does not document the public JVM API or supported parsing edge cases, so the module must be inspected before integration.

Official sources

  1. Issues
  2. License: Apache-2.0
  3. README
  4. Releases
  5. vanniktech/Emoji on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/vanniktech-emoji.svg)](https://hysenlabs.com/projects/vanniktech-emoji)

Was this useful?