Samsung Galaxy A06を対象とした修正は2日間で2回目です。昨日リリースされたバージョン1.0.10は、この端末での起動時クラッシュを修正するものでした。1.0.10がインストールされてから数時間後、Google Play Consoleを通じて新しい別の問題が報告されました。今回はANR(アプリが数秒間フリーズする)です。詳細なレポートのおかげで迅速な修正が可能になり、このバージョンではアプリドロワーでアイコンのネオン効果が表示されない不具合も修正しています。
1.0.11 — Samsung Galaxy A06起動時のANR
症状
Samsung Galaxy A06(Android 16)では、インストール後にSolaを初めて起動すると、Androidが「Solaが応答していません — 待機/強制終了」というダイアログを表示するまでの5〜6秒間、アプリがフリーズしていました。1.0.10のクラッシュとは異なり、アプリが突然終了することはなく、数秒間使用不能な状態が続くだけでした。
技術的には、Play Consoleが報告したトレースは「Input dispatching timed out」タイプのANRを示していました。Androidはメインスレッドが入力イベント(タップ、スワイプ)を5秒以内に処理しているかを監視しています。それを超えると、システムはアプリをブロックされたと判断し、ユーザーに終了を提案します。
原因
Samsung Galaxy A06はエントリーレベルのプロセッサ(Unisoc T606、4コア1.6GHz)と控えめなGPUを搭載しています。Solaが通常テストされている端末(Pixel 8 Pro、Pixel Tablet)と比べて数倍遅いのです。
ホーム画面の起動時、Solaはグリッド上に配置されたすべてのアプリアイコン(通常15〜25個、フォルダ内のものを含む)を一度にまとめて読み込みます。各アイコンはPackageManager.getApplicationIcon()を経由します。これはAndroidのメソッドで、対象のAPKを開き、アダプティブアイコンのXML定義を読み取ってから、2枚のビットマップ画像(前景レイヤーと背景)をデコードします。
Pixel 8 Proでは、各デコードに約10ミリ秒かかります。20個のアイコンは300ミリ秒未満で表示され、まったく目に見えません。A06では、同じデコードにアイコン1個あたり200〜500ミリ秒かかります。20個のアイコン×300ミリ秒=6秒間のブロックです。この読み込みはメインスレッド(ユーザーのタップを処理するスレッド)で行われていたため、ANRを引き起こしていました。
修正内容
ホーム画面のグリッドにデータを供給するフローは、flowOn(Dispatchers.IO)によって入出力用スレッドプールに限定されるようになりました。具体的には、アイコンのデコード処理はすべて専用スレッド上で並行して実行されます。最終的なリスト(20個のアイコンがデコードされた後)だけがメインスレッドに渡され、表示されます。メインスレッドは、重い読み込み処理中でも常に応答性を保ちます。
同じ問題を抱えていた、フォルダとそのアプリを一覧表示するフローにも同じ修正を適用しました。
Galaxy A06の仕様(720×1600、260dpi、Android 16、遅さをシミュレートするためのソフトウェアGPU)を再現したエミュレーターで検証したところ、ホーム画面は即座に表示され、ANRは一切発生しませんでした。
アプリドロワーでアイコンのネオン効果が表示されない
症状
内蔵アイコンパック(Pixelarticons、Lucide、Game-Icons…)を選択し、「ネオン効果」オプションを有効にすると、ホーム画面、フォルダ、ドックではアイコンに発光ハローが正しく表示されていました。しかしアプリドロワーでは、ハローが消えてしまい、アイコンはネオン効果のないフラットな色で表示されていました。
原因
ネオン効果は、元のアイコンを包み込み、描画時にハローを追加するdrawable-wrapperを通じて実装されています。アプリのアイコンを読み込むコードパスは2つあります。1つはホーム画面とフォルダ用、もう1つはドロワー用(インストール済みのすべてのアプリを一度に一覧表示する)です。
ホーム画面が使用するパスには、このラッパーを保持するための特定の例外処理がすでに存在していました。一方、ドロワーが使用するパスにはその例外処理がなく、常にconstantState.newDrawable()を呼び出してdrawableの新しいインスタンスを作成していました。これには副作用として、ネオンラッパーが解除され、その下にあるフラットなアイコンだけが残るという問題がありました。
修正内容
NeonDrawableの例外処理をドロワーのパスにも移植しました。読み込まれたアイコンがネオンラッパーである場合、クローンを作成せずそのまま保持するようにしました。これにより、ハロー効果は他の場所と同様にドロワーでも保持されるようになりました。
両方のパス(ホーム画面とドロワー)を固定するための単体テストを3つ追加し、逆のケース(通常のdrawableはパック変更時の副作用を避けるため正しくクローンされる必要がある)も検証しています。今後同種の不具合が発生した場合も、事前に検出できるようになります。
アップデートの入手方法
1.0.11はPlayストアを通じて段階的に配信されています(ユーザーの20%から開始し、24〜48時間かけて100%まで徐々に拡大)。2日以内に全員が利用できるようになる見込みです。Playストアアプリの「アプリとデバイスの管理」セクションから確認を強制することもできます。
Google Playで開く