今週、まったく異なる2つの問題について、立て続けに重要な修正がリリースされました。1つ目は正しく適用されなくなっていた内蔵アイコンパックに関するもので、複数のバージョンにわたって静かに潜んでいた特に厄介な不具合でした。2つ目は左ページの歩数カウンターに関するもので、1日の最初の歩数を見逃すことがありました。
1.0.8 — アイコンパックの復旧
症状
ここ数バージョン、Solaに内蔵されたアイコンパック(Pixelarticons、Lucide、Fluent Emoji、Bootstrap、Feather、Heroicons)のいずれかを選択しても、期待通りには動作しませんでした。選択したパックのアイコンを表示する代わりに、ドックとドロワーのすべてのアイコンがSola自体のアイコンを表示してしまっていたのです。一方、Play Storeからインストールしたサードパーティ製アイコンパックは正常に動作していました。
原因
原因はAndroidのリソースシュリンカーでした。これはリリースビルドをコンパイルする際に、使われていないと判断したグラフィックリソースをAPKファイルから取り除くツールです。アプリの最終的なサイズを削減するのに便利な反面、脆弱でもあります。アプリがリソースを動的に(たとえばiconpack_google_chromeのような文字列としての名前で)読み込む場合、シュリンカーはそれが使われていると判断できません。そのため、静かに削除してしまうのです。
まさにこれが、Solaの内蔵パックを構成する558個のアイコンに起きていたことでした。ユーザーがパックを選択する際に名前で動的に読み込まれるこれらのアイコンは、ビルド時にはシュリンカーからは見えない状態だったのです。
修正内容
解決策は、iconpack_で始まる名前のリソースはすべて何があっても保持するようにシュリンカーへ明示的に指示する、res/raw/keep.xmlというファイルです。
この機会にパックセレクターも改良しました。パックをタップすると即座にライブプレビューが表示され(ドックとホーム画面が瞬時に更新されます)、選択を確定するためのフローティングボタン「適用」が表示されるようになりました。結果を見るためにメニューを閉じる必要はもうありません。ドック、ホーム画面、ドロワーは、パックを変更するたびに完全に同期された状態を保ちます。
同様の不具合が二度と紛れ込まないように、3種類の自動テストを追加しました。558個のdrawableがすべて正しく解決できることを確認する単体テスト、選択したパックがすべてのコンポーネントに正しく伝播することを確認するテスト、そしてstateのリークなしにA→B→デフォルトのサイクルをシミュレートするテストです。
1.0.9 — より堅牢な歩数カウンター
症状
左ページ(ダッシュボード)に表示される歩数カウンターは、開いた瞬間に0を表示し、その時点からしかカウントを始めないことがありました。具体的には、左ページを一度も開かずに午前中に3,000歩歩いた場合、開いた後に最初のイベントが検知されるまで、その歩数の表示が失われてしまう可能性がありました。
原因
カウンターのロジックは左ページのコンポーザブルに直接組み込まれていました。その結果、歩数センサーはこのページが表示されている間しかイベントをリッスンしていませんでした。ホーム画面やドロワーにスワイプした途端、カウンターはリッスンを停止していたのです。
Androidでは、ハードウェアの歩数センサー(TYPE_STEP_COUNTER)は端末の最後の再起動以降、累積的にカウントされます。歩数が失われることはなく、ハードウェアは24時間休みなくカウントし続けます。しかし、そのイベントを能動的にリッスンしているアプリがなければ、表示される値は更新されません。さらに、当日の歩数を計算するための基準線(ベースライン)は、最初に受信したイベント時、つまり左ページを最初に開いたときにしか設定されていませんでした。
修正内容
ロジックはシングルトンコンポーネント——StepCounterManager——として切り出され、左ページとは独立して存在するようになりました。Activity Recognitionの権限が許可されると即座に有効化され、アプリがメモリに読み込まれている間は(デフォルトランチャーとしてはほぼ常時)有効なままとなります。結果として、センサーは継続的に歩数イベントをリッスンし、ベースラインはその日の最初の一歩で(はるかに早いタイミングで)設定され、ページを開いた時点で表示される値は常に最新のものになります。
おまけとして、最後に確認された値がセッション間で永続化されるようになりました。画面上に一時的な0が表示されることはもうありません。左ページを再び開くと、最後のイベントの値が即座に復元され、センサーが新しいイベントを発するとすぐに実際の値が書き込まれます。
非常に制限の厳しいAndroidに関する注記
メモリ管理が積極的な端末(一部の中国製Xiaomi、Huawei、OnePlusなど)では、デフォルトランチャーであってもSolaのプロセスが強制終了されることがあります。このまれなケースでは、その日のベースラインが最初の再起動時に再計算され、その間に歩いた歩数が失われる可能性が残ります。Solaとは独立して24時間365日の履歴を保持するHealth Connectを利用した解決策を将来のバージョンで検討中です。これにより、このエッジケースは完全に解消されますが、Google Playへの手続きが必要となるため、それは今後対応する予定です。
アップデートの入手方法
両バージョンともPlay Store経由で段階的に配信されています。24〜48時間以内にすべてのユーザーが利用できるようになる見込みです。Play Storeアプリの「アプリとデバイスの管理」セクションから、手動で確認を促すことも可能です。
Google Playで開く