この記事は Ben Weiss による Android Developers - Medium の記事 "Using WorkManager in multi-process apps" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
📝 WorkManager 2.5.0 をリリースしました。マルチプロセス環境で簡単に使えるようになり、さらに、安定性の改善もいくつか行われています。複数のプロセスを管理するアプリでバックグラウンド作業を確実に管理する必要がある場合は、新しい WorkManager 2.5.0 をお使いください。
利用するためには、コードにいくつかの変更を加える必要がありますので、詳しくご説明します。また、本記事の最後に、今回のバージョンの WorkManager ライブラリにおけるその他の動作の変更点および最新の追加機能を記載していますので併せてご覧ください。
新しいマルチプロセス アーティファクトでは、ジョブのスケジュール管理を 1 つのプロセスに統合することで、パフォーマンスを向上させています。この機能を使うには、まずアプリに追加します。
implementation "androidx.work:work-multiprocess:2.5.0"
これで、WorkManager が WorkRequest をキューに追加するために使う専用のプロセスを選び、プロセス内スケジューラを実行できるようになります。
Configuration.Provider を使って設定する方法は次のようになります。
class MyApplication() : Application(), Configuration.Provider { override fun getWorkManagerConfiguration() = Configuration.Builder() .setProcessName("com.example:remote") .build()}
注: setProcessName のパラメータには完全修飾プロセス名を渡す必要があります。具体的には、アプリのパッケージ名にコロンを付け、その後にホストのプロセス名を指定します。例: com.example:remote
work-multiprocess を使う場合は、WorkManager の代わりに RemoteWorkManager を使って作業リクエストを管理できます。RemoteWorkManager は、常に専用プロセスにアクセスして作業をキューに格納します。これにより、呼び出し側のプロセスで誤って新しい WorkManager を初期化してしまうことはなくなります。プロセス内スケジューラも、同じ専用プロセス内で実行されます。
このように WorkManager を設定し、RemoteWorkManager を使って作業をスケジュールすることで、ジョブを高速に管理し、マルチプロセス アプリの信頼性を高めることができます。指定するプロセスで WorkManager インスタンスが 1 つだけ実行され、ファイルベースのロックを使わなくてよくなるため、SQLite 接続の数を大幅に削減できることに加え、プロセス間でジョブを調整する必要がなくなるためです。
これまでは、ActivityManager が JobService のインスタンスを作成してジョブを開始することができなかった場合、ベースとなるプラットフォームのバグの影響で、そのジョブは破棄され、何の通知も行われませんでした。今回より、WorkRequest オブジェクトとジョブを調整して Application インスタンスが作成されると、WorkManager はすべての WorkRequest についてスケジューラ ジョブが存在することを確認します。
アプリがクラッシュする原因の 1 つは、デバイスのストレージ不足であることがわかりました。これが起きるのは、主に最初からストレージ容量が少なかったデバイスです。しかし、アプリが大量の作業をスケジュールする場合、WorkManager がデバイスのストレージ不足の原因になることもありました。
完了したジョブはデフォルトで 7 日間内部 WorkManager データベースに記録されていました。今回、それが 1 日間に短縮されたので、データベースのサイズが大幅に減少します。
バッファの期間は短縮されますが、ジョブを記録する期間は keepResultsForAtLeast() API を使って制御できます。
WorkManager と ListenableFuture を併用すれば、テストがさらに簡単になります。TestListenableWorkerBuilder Kotlin 拡張機能が、ListenableWorker を拡張したすべてのクラスを受け取れるようになり、テストの柔軟性が向上しています。
今回のリリースには、新機能に加えていくつかのバグの修正も含まれています。これにより、WorkManager の安定性、信頼性、パフォーマンスが向上します。すべての変更点と修正されたバグは、リリースノートで確認できます。
WorkManager を含め、いくつかの Jetpack ライブラリは GitHub からの貢献を受け付けています。Alan Viverette が、プロセス全体について説明しているブログ記事(英語)を書いています。
2.5.0 リリースで修正されたバグのほとんどは、パブリック Issue Tracker で寄せられたものです。
修正につながる問題を登録するコツは、再現できる問題を登録することです。問題の再現に役立つように、WorkManager のサンプルを使うか、問題の説明に手順を記載して独自のサンプルコードを提供することをお勧めします。
ぜひこの機会に作業に着手し、アプリでこのライブラリのバージョンをアップデートしてください。
この記事は Florina Muntenescu による Android Developers Blog の記事 "MAD Skills Kotlin and Jetpack: wrap-up" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
今回は MAD Skills シリーズの 1 つ、Kotlin と Jetpack についての動画と記事をまとめました。Android コードの表現力と簡潔さ、安全性を向上させ、Kotlin で非同期コードを実行しやすくするさまざまな方法を取り上げています。
それぞれのエピソードから、Kotlin と Jetpack についての最新情報をご確認ください。いくつかの具体的な API を取り上げ、API の使い方だけでなく、API が内部的にどのように動作しているか解説しています。また、すべてのエピソードには対応するブログ投稿があり、そのほとんどにサンプルか Codelab へのリンクが含まれているので、実際に試してみたり、コンテンツに関する理解を深めたりできます。また、Jetpack や Kotlin のエンジニアが登場するリアルタイム Q&A も実施しました。
このエピソードでは、Jetpack KTX 拡張機能を使って、Android と Jetpack のコーディングを簡単、快適、そして Kotlin らしくする方法を取り上げました。現在のところ、20 以上のライブラリに KTX 版があり、その中から特に重要なものを紹介します。core-ktx は、Android プラットフォームに由来する API を Kotlin らしく書けるようにする機能を提供しています。また、LiveData や ViewModel などの API と組み合わせてユーザー エクスペリエンスの向上を図れるいくつかの Jetpack KTX ライブラリも紹介します。
動画またはブログ記事(英語)をご覧ください。
エピソード 2 では、コルーチンと Flow を使って API をシンプルにする方法と、suspendCancellableCoroutine API と callbackFlow API を使って独自のアダプタを作る方法について説明します。このトピックを実際に試してみたい方は、Kotlin 拡張機能ライブラリの作成 Codelab をご覧ください。
動画を視聴するか、ブログ記事(英語)でご確認ください。
このエピソードでは、実際に Room を使ってみます。その上で、Kotlin を使って Room のテーブルやデータベースを作る方法、挿入などの 1 回限りの suspend 操作を実装する方法、Flow を使った監視可能クエリーについて簡単に確認します。コルーチンと Flow を使うと、Room はすべてのデータベース操作をバックグラウンド スレッドに移してくれます。Room のクエリーの実装方法やテスト方法については、動画またはブログ記事(英語)をご覧ください。実際に試してみたい方は、ビューで Room を使う Codelab をご覧ください。
エピソード 4 では、WorkManager を使って作業を簡単にする方法について説明します。この機能を使うと、非同期タスクのスケジュールを設定して、アプリが閉じられた場合や、デバイスが再起動した場合にも実行されることが期待されるタスクを、即時実行または遅延実行できます。このエピソードでは、WorkManager の基本について説明し、CoroutineWorker などの Kotlin API についても解説しています。
こちらの動画またはこちらのブログ記事(英語)をご覧ください。また、ぜひ WorkManager Codelab で実際に体験してみてください。
エピソード 5 では、Android の Google Developer Expert の Magda Miu さんが Kotlin の基本 API と CameraX を使った経験についてお話ししています。
最後のエピソードでは、リアルタイム Q&A を実施しました。司会の Chet Haase のほか、ゲストとして Architecture Components テックリードの Yigit Boyar、Kotlin プロダクト マネージャーの David Winer、そしてデベロッパー リレーションズ エンジニアの Manuel Vivo と私が参加し、YouTube、Twitter などから寄せられた質問に回答しています。
Reviewed by Yuichi Araki - Developer Relations Team and Hidenori Fujii - Google Play Developer Marketing APAC