「Android 絵文字ポリシー」のためにAndroidアプリに実装しないといけないもの

## はじめに

先日、Google Playのアプリ開発者に向けて「Android 絵文字ポリシー」の追加が発表されました。
これにより、今後のAndroidアプリは常に最新のカラー絵文字フォントを利用する必要が出てきました。
Androidアプリ開発者がしなければならないことについて簡単に記事を書きました。

お知らせの詳細は「[デベロッパー プログラム ポリシー: 2021 年 10 月 27 日のお知らせ](https://support.google.com/googleplay/android-developer/answer/11190649#emoji_preview)」をご確認ください。

かなり多くのアプリに影響があります。
アプリの文字列リソースに絵文字は使っていない＆ユーザー名などユーザーが任意にテキストを入力できる場所はない＆アプリに配信されるテキストに絵文字が含まれることはない、というアプリはこれを避けることができます。
なのでSNSのようなテキストコミュニケーション主体のアプリだけではなく、ゲームアプリなどにも影響のある話になっています。

発効は2022/2/2となっており、しばらく先なのでまだ慌てる必要はありません。しかしAndroid標準のUIフレームワーク以外の構成のアプリでは場合によって大きな開発が必要となると思われます。
このポリシーの追加でAndroidアプリ開発者がアプリに何を実装しないといけないのかを知っておく必要があるかなと思い、久しぶりに記事を書いています。

## Android 絵文字ポリシー とは
以下は https://support.google.com/googleplay/android-developer/answer/11190649#emoji_preview からの引用です。
> Google の絵文字ポリシーは、Google プラットフォーム全体を通じて、一貫したインクルーシブなユーザー エクスペリエンスを促進できるように設計されています。

> Android 12 以上で動作するアプリは、最新の Unicode バージョンが一般公開されてから 4 か月以内に準拠する必要があります。

> 最新の Unicode バージョンに準拠するためには、以下のいずれかの方法を選択して実施しなければなりません。

> - すでに AppCompat を使用している場合は、絵文字が有効になっていることを確認します。
- アプリ内のすべてのサーフェスで、既存の EmojiCompat ライブラリを使用します。これにより、StaticLayout を直接使用するカスタム ビューに対応できます。
- 絵文字の取り扱い、フォント、画像を、Unicode の最新バージョンに基づいて更新します。

### 簡単な解説
iOSやAndroidの新しいOSが出るたびに新しい絵文字が追加されているな、と多くの方がお気づきかなと思います。
これはUnicodeのバージョン改訂に合わせて、新しいEmojiが追加収録されているためです。
こうした新しいEmojiがスマホに表示されるためには文字描画システムが新しいEmojiについての情報を知った上で、端末に搭載されているフォントにその新しいEmojiが収録されている必要があります。
文字描画システムかフォントのどちらかが対応していないEmojiはいわゆる「豆腐」で表示されたり1つの文字のはずが複数の文字になってバラバラに表示されるというった事態になっていました。
DroidKaigi 2019で「[ゼロから実装する縦書きTextViewとその周辺技術](https://speakerdeck.com/cc4966/vertical-textview-from-scratch-and-related-technologies)」という発表でその辺りの発表をしたので興味があればどうぞ。

このように、これまで文字描画システムは基本的にOSに近いところにありましたし、フォントも基本的には端末にインストールされているものを使用するというのが一般的でした。

つまりこれまで絵文字の表示は端末側（OS）の責務とされていました。
それが今回のAndroid絵文字ポリシーが策定されたことによってその責務がアプリ側に変わりました。

これからは、端末によらず最新のEmojiが表示されるようにアプリ側に実装が入っている必要があります。

## Androidアプリでやらないといけないこと
ここでは上で説明した「Android 絵文字ポリシー」が発効された際に、Androidアプリ開発者がしなければならないことをまとめてみます。

### WebViewアプリ編
現状、私の方ではWebViewでの絵文字対応がどうなるのかわかっていません。
ただ、WebView自体もGoogle Play上のアプリなので対応されるんじゃないかと勝手に思います（希望的観測、何か情報ありましたらお知らせください）
https://play.google.com/store/apps/details?id=com.google.android.webview

### ネイティブアプリ編
ここでのネイティブアプリとは画面構成にActivity+Fragment+Viewなど、Android OS標準のUIに載っているアプリを指しています。
この場合、アプリは基本的に以下の2つのどちらかを選択することになると思います。

- AppCompat 1.4.0以上を導入する（2021/11/05時点で1.4.0-rc01が出ている）
    - AppCompat 1.4.0以上は自動でEmojiCompatが適用されます
- EmojiCompatを明示的に導入しTextViewを継承するクラスをEmojiTextViewなどに変更する

多くの場合は前者を採用するかと思いますが、もしそれが不可能な場合に後者が選択肢になると思います。
いずれにしても公式が素晴らしいソリューションを用意してくれているので、最新のライブラリに追従できていれば対応はさほど大変なものではありません。

EmojiCompatについてはDroidKaigi 2019で発表されていた「Androidエンジニアが抑えておくべきUnicode Emojiの知識」などがおすすめです。

### 非ネイティブアプリ編
内部的にAndroidのViewを利用している場合は上記に合致するような変更を加えると良いでしょう。

問題はUnityなど、独自の文字描画システムを使っているケースです。
この場合、Android開発チームから提供されているEmojiCompatなどの恩恵に直接的には与ることができないケースが多々あるかと思います。
つまり利用しているテキスト描画系のライブラリなどが最新のEmojiを利用できるようになっている必要があります。
ポリシーでは以下に相当します。
> 絵文字の取り扱い、フォント、画像を、Unicode の最新バージョンに基づいて更新します。

この対応にはライブラリの追加開発が必要かしれませんしもしかするとライブラリを変更する必要があるかもしれません。さらにその後も定期的にメンテ、更新が必要になります。

個人的には `androidx.emoji2:emoji2-bundled` をdependenciesに入れるとその時最新の`NotoColorEmojiCompat.ttf`がアプリのAssetsに入るので、一度頑張ってここから最新の絵文字情報は取り出す仕組みを作れば、安定して運用できそうかなあと思ってます。
以下参考情報です（もっと詳しい情報が必要であればTwitterとかで聞いてください）

- emoji2 (EmojiCompatの仕組み)
    - https://developer.android.com/guide/topics/ui/look-and-feel/emoji2
- createfont.py (NotoColorEmojiCompat.ttfの仕組み)
    - https://android.googlesource.com/platform/external/noto-fonts/+/refs/heads/master/emoji-compat/createfont.py

## おわりに
ポリシーの是非はさておき、私たちAndroidアプリ開発者が技術的に対応しなければならないこととその問題について簡単に書きました。
ちなみに私は趣味で縦書きのテキストエディタを作っているので、文字描画システムは自前です（今回のポリシーで工数的に大打撃を被る予定です）

そしてこのポリシーはアップデートのみに適用されるのかなど、細かいことがまだわからないので「これはどうなってるんだろう？」と思った方は[Google Play デベロッパー ポリシー ウェビナー 2021 年 11 月](https://developersonair.withgoogle.com/events/policy2021-3)に事前の質問を投稿の上で参加するのが良さそうです。
多くのAndroidアプリ（特にゲーム系アプリ）への影響が予想されるので、みんなで力を合わせてポリシーに対応していきましょう！