alpha Lounge

20%の技術記事とオタクネタ

【Flutter】(2023年12月時点) AndroidのImpeller対応状況を確認する

この記事はFlutter Advent Calendar 2023のシリーズ3 24日目の記事です。

今年5月にリリースされたFlutter 3.10で、iOSのデフォルトの描画エンジンがImpellerに切り替わった、という発表がありました。1 Androidも対応するかな?と思いつつ気づけば年末になってしまいましたね。
今回はImpellerについて軽くまとめつつ、AndroidにおけるImpeller対応状況を調べてみます。

Impellerについて

ImpellerはFlutterの新しい描画エンジンです。

docs.flutter.dev

元々FlutterではSkiaという描画エンジンを採用していたのですが、このエンジンの欠点として、初回のアニメーション表示がカクつくという問題があります。2 これは、実行時にコンパイルを行うことによって引き起こされる問題です。事前にコンパイルを行うためのSkSL warmup手法も用意されているのですが、ビルド毎、リリース毎に書き出しを行う必要があり手間がかかります。

Impellerはビルド時にコンパイルすることでパフォーマンスへの影響を抑えています。3

各プラットフォームの対応状況

iOS

表題で述べた通り、iOSではFlutter 3.10からデフォルトの描画エンジンがImpellerに移行しています。

MacOS

MacOSは現状プレビュー版です。以下をInfo.plistに追加すると有効化できます。ここも気になる部分ですが割愛します。

  <key>FLTEnableImpeller</key>
  <true />

Android

さて、本題であるAndroidの対応状況です。

執筆時点での最新版であるFlutter 3.16ではプレビューとして、VulkanがサポートされているAndroid端末で利用可能と書かれています。

As of Flutter 3.16, Impeller is available behind a flag on Android devices that support Vulkan

...あれ?Vulkanがサポートされていない端末では使用できないのか?と疑問になるかと思いますので、確認していきます。

バックエンド処理について

AndroidのImpellerの処理は以下で書かれています。

https://github.com/flutter/engine/blob/main/impeller/docs/android.md

VulkanがサポートされていないAndroid端末ではOpenGL ESで動作するようになっています。さらによく見ると、「Android 10(API 29)以上で、Vulkanのバージョンが1.1、かつExtensionsがサポートされている場合」にVulkanを使用するようです。

公式としては、古いVulkanのサポートはコストがかかるため対応せず、OpenGL ESの処理を改善するようですね。この辺りの安定度の向上のためプレビュー期間が長くなるという想定もされています。4 5

Android端末のVulkanのサポート確認

Android端末のVulkanのバージョン確認方法はいくつかあります。

手っ取り早いのは、vulkan.gpuinfo.orgで検索することです。
Pixelで検索すると以下のバージョンが出てきます。API Versionが対応しているバージョンになります。

バイス名がわからない場合、実機がある場合は以下のアプリでも確認ができます。ただしAndroid 12以上という要件があるため使えない機種も多そうです。

https://play.google.com/store/apps/details?id=de.saschawillems.vulkancapsviewer

Pixel 6aで起動した場合

また、以下のissueのログを見ると、実行時にVulkan非対応時にエラーが出るようですね。実際に私が持っているいくつかの古いスマホでも、試したところ同じログが表示されていました。

[Impeller] Android device that successfully falls back to GLES renderer will print several warning messages · Issue #136059 · flutter/flutter · GitHub

有効化方法

実行時に--enable-impellerオプションで有効化もできますが、以下のようにAndroidManifest.xmlに記述すると有効にできるため、こちらが楽かと思います。

<meta-data
    android:name="io.flutter.embedding.android.EnableImpeller"
    android:value="true" />

終わりに

今回はAndroidのImpeller対応状況をまとめました。現在は既知のバグも多く、まだまだ対応中という印象ですが、今後の動向に注目したいところです。気になる方は有効にして動作を確認してみたり、バグ報告してみるといいかもしれませんね👍

参考

Impeller rendering engine | Flutter

engine/impeller/docs/android.md at main · flutter/engine · GitHub

What’s new in Flutter 3.10. Seamless web and mobile integration… | by Kevin Chisholm | Flutter | Medium

What’s new in Flutter 3.16. Material 3 by default, Impeller preview… | by Kevin Chisholm | Flutter | Nov, 2023 | Medium

Flutterの課題、Early-onset jankとは何か

Impeller engine: is it good enough for Flutter? | Medium