Edited at

DroidKaigi 2019 Android Textのセッションの補足


はじめに

DroidKaigi2019を見に来てくださったみなさん、LiveStreamで見てくださった皆さん、本当にありがとうございました。

アブスト:https://droidkaigi.jp/2019/timetable/67580

スライド:https://speakerdeck.com/nonanona/droidkaigi-2019-the-best-practice-for-android-text

Androidの内側の話にどれだけの方が興味を持ってくださるか不安だったのですが、蓋を開けたらすごくたくさんの方に来ていただいて、ほんとうに嬉しかったです。

緊張のため早口になってしまっていたみたいで、聞き取りにくかったりしたらごめんなさい。練習してきます!

発表の後頂いた質問や、Twitterなどでの反応から補足したほうが良いな〜と思ったことを、ここで書いてみようと思います。


Q1. パフォーマンスが可視化して見えるあのバーはどうやって出すのか?

開発者オプションの「GPUレンダリングのプロファイル作成」メニューから「バーとして画面に表示」を選ぶと表示されます。

https://developer.android.com/studio/profile/inspect-gpu-rendering

アプリが何をしたときに処理がかかっているのかがわかるので、便利ですが、常に出してるとうざいので注意ですw


Q2. TextViewってこんなに重いのか!

私が脅しすぎたのかもしれません(笑)。 テキストは軽くないという認識は持っていただきたいですが、TextViewは超激重だから、文字を減らそうみたいなアクションはする必要はありません。そんなことする人はいないと思いますが念の為(笑)。 UIのコンポーネントの中ではずば抜けて重いコンポーネントですが、普通のユースケースでは十分な速度を出していると思います(信じていますw)。

ものすごく低コストでパフォーマンスの向上が図れる場合(ハイフネーションをオフにするだけ、の様な)や、今のデザインと相性が良い(RecyclerViewのPrefetchなど)場合はぜひ今日のセッションの内容を導入していただきたいと思っています。ですが、逆に今のデザインとはあまり相性が良くないので、アプリのデザインから書き換える!のような大規模な改修が必要な場合、本当にテキストのパフォーマンスが遅くてUXが悪くなっている、というような状況でもない限りはオススメしません。

特に、最近の日本で売られているようなハイエンドデバイスでは、CPUリソースが潤沢にあるため、テキストが極端に重いとは感じないかもしれません。一方で、世界にはもっと安いデバイスが売られていて、そこに乗っているCPUやGPUは大量のテキストを表示させようとすると、カクついてしまうかもしれません。

今回の内容は、もしアプリをインドの様な比較的ローエンドデバイスが主流の国でも、軽快に動いてくれるようにするための手法、もしくは基礎的なライブラリを作る場合に組み込んでもらって、特にUIを書く人が意識せずとも最高のパフォーマンスが出る、そんな状況になるための手助けになれたらなと思ってます。


Q3. TextViewってこんなに重いのか!Ver2.

セッション中に私が「Pixel2にAOSPのイメージを焼いて実験しました」と言いましたが、実は上記と同じ理由で、Pixel2のCPUは速すぎるため、いくらリッチなテキストを持ってきても、カクつかずに表示されます(されてしまいます?)。ですので、今回の実験をするに当たって、CPUのクロックを意図的に下げたり、安定化するために高温になったらCPUのクロックを下げる安全装置を解除したり、いろいろな細工をしています。ですので、今回例えば、「TextViewのレイアウトに39msもかかっている!」と大騒ぎしたのは、ある種縛りプレイをしていたようなものなので、足かせを全部取っ払った最高の状態だと、もっと短くなっています。デバイスをパフォーマンスを取るための状態にするためのスクリプトはこの辺に転がっておりますが、これを使うためには、


  1. AOSPをチェックアウトして、手順に従ってシステムイメージを作る。

  2. Google Phone (Pixel2とか)を買ってくる。

  3. 買ってきた電話をおもむろにOEMアンロックして、作ったイメージを焼く

  4. Rootになって上のスクリプトを走らせる。

ってやらないといけません。当然ですが、保証対象外になりますし、最悪文鎮化します。もしやる場合は必ずご自身の自己責任のもとお願いします。

私も過去に何個か文鎮を作っているので、上記をやるのは本当に文鎮化のリスクを含むのでご注意ください。


Q4. 日本語でもあのキャッシュ効くの? 日本語の場合単語ってどうやって切ってるの?

A.日本語でもキャッシュ効きます。

日本語では英語のように単語で分割するのではなく、(厳密には違いますがほぼ)一文字づつ分割してキャッシュに入れています。これは再利用しやすい単位が漢字単位だからです。