2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
タスク スナップショット
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
タスク スナップショットは、Android 8.0 で導入されたインフラストラクチャで、Recents Thumbnails のスクリーンショットと、Window Manager の Saved Surfaces を組み合わせたものです。Recents Thumbnails は、[最近] ビュー内のタスクの最後の状態を表します。
アクティビティが停止状態になったとき、そのアクティビティがタスクの一番上に配置されている限り、Window Manager はアクティビティのサーフェスを破棄しません。このアクティビティを再度表示する必要がある場合、Window Manager は、この Saved Surfaces を使用できるため、最初のフレームの描画が完了するのを待たずにアニメーションを開始できます。
アーキテクチャ
Recents Thumbnails と Saved Surfaces という 2 つのコンセプトは、タスク スナップショットに統合されています。タスクがバックグラウンドに移行すると、Window Manager はこのタスクのスクリーンショットを GraphicBuffer に配置します。タスクの一番上のアクティビティのアプリがメモリに残っている限り、この GraphicBuffer はメモリに保持されます。同じアクティビティがフォアグラウンドに戻ると、Window Manager は開始ウィンドウ(TaskSnapshotSurface)を作成し、開始ウィンドウのバッファキューにメモリをコピーせずに GraphicBuffer をアタッチします。アクティビティが最初のフレームを描画するとすぐに、タスク スナップショットの開始ウィンドウが通常のスプラッシュ画面のようにスムーズにフェードアウトします。
また、同じ GraphicsBuffer がバインダを介して SystemUI にも送信され、Recents ビューにタスクのプレビュー状態を描画するために使用されます。これはあくまでバッファへの参照であるため、Binder 経由で送信すると、一部のリソースが消費されます。GraphicBuffer が SystemUI に届くと、ハードウェア ビットマップにラップされ、グラフィック メモリにメモリをアップロードせずに画面に描画されます。
メリット
この新しいアーキテクチャには主に 3 つのメリットがあります。
- タスク スナップショットが開始ウィンドウとして使用される場合は、スナップショットと実際のコンテンツの間に効果的なクロスフェードが生じます。
- タスク スナップショットを SystemUI で描画する場合は、コピーせずに実行できます。以前は、ビットマップを Ashmem にコピーし、次にグラフィック メモリにコピーしなければなりませんでした。このメソッドではスナップショットをグラフィック メモリに直接保存するため、コピーは必要ありません。
- [最近] の状態は、アプリを再起動すると最初に表示される状態と常に一致します。同じバッファがあることで多くのメモリを節約できます。
そのため、[最近] ビューでは画像をフル解像度で表示できます。
以前は、メモリを節約するために画素数が 64% 間引きされていました。
実装
この機能は Android プラットフォーム全体に組み込まれています。統合は不要で、カスタマイズはサポートされていません。ただし、デバイス メーカーはタスク スナップショット機能を完全に無効にできます。
この機能を無効にするには、次の関数を変更します。
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
なお、この機能を無効にすると、[最近] ビューにサムネイルが表示されなくなります。
高解像度と低解像度のスナップショット
タスク スナップショットは、2 つのスケールでディスクに書き込まれます。ディスクからタスク スナップショットを復元すると、低解像度のスナップショットが読み取られ、その後対応する高解像度のスナップショットに置換されます。この最適化によって画像の読み込み時間を短縮できます。
そうしないと、ディスクからスナップショット ファイルを読み取るときに少し時間がかかることがあります。また、画像が使用可能になるまでユーザーに空白のタスクカードが表示されることもあります。
デバイス オーバーレイ構成ファイル
overlay/frameworks/base/core/res/res/values/config.xml
で
config_highResTaskSnapshotScale
と
config_lowResTaskSnapshotScale
を設定することで、スケーリングを構成できます。デフォルトでは、1.0 と 0.5 にそれぞれ設定されています。低解像度のスナップショットを無効にするには、
config_lowResTaskSnapshotScale
を 0.0 に設定します。
例とソース
この機能に関する他のコードは、次の場所にある TaskSnapshot* ファイル内で検索してください。
frameworks/base/+/main/services/core/java/com/android/server/wm/
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-03-26 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-03-26 UTC。"],[],[],null,["# Task snapshots\n\n*Task Snapshots* is infrastructure introduced in Android 8.0 that combines\nscreenshots for *Recents Thumbnails* as well as *Saved Surfaces*\nfrom Window Manager. Recents Thumbnails represent the last state of a task in\nthe Recents view.\n\n\nWhen an activity went into a stopped state, Window Manager didn't destroy the\nsurfaces of the activity as long as that activity was on the top of the task. If\nthis activity had to be shown again, Window Manager was able to start the\nanimation without waiting for the activity to finish drawing its first frame, as\nit was able to use this Saved Surface.\n\nArchitecture\n------------\n\n\nThe two concepts of Recents Thumbnails and Saved Surfaces are unified with Task\nSnapshots. When a task goes into background, Window Manager places a screenshot\nof this task into a GraphicBuffer. As long as the app of the top\nactivity of the task stays in memory, this GraphicBuffer will be retained in\nmemory. Now, when the same activity is brought to the front again, Window\nManager will create a starting window (TaskSnapshotSurface), and attach the\nGraphicBuffer without copying any memory to the buffer queue of the starting\nwindow. As soon as the activity has drawn its first frame, the Task Snapshot\nstarting window will fade out smoothly like regular splash screens.\n\n\nThe same GraphicBuffer is also sent over Binder to SystemUI to be used to draw\nthe preview state of a task in the Recents view. Since this is just a reference\nto a buffer, sending it over binder expends few resources. When the\nGraphicBuffer arrives at SystemUI, it is wrapped into a hardware Bitmap and then\ndrawn onto the screen without any memory uploading to the graphics memory.\n\nBenefits\n--------\n\n\nThere are three main benefits to this new architecture:\n\n- If the task snapshot is used as a starting window, there is a nice crossfade between the snapshot and the real content.\n- When the task snapshot is drawn in SystemUI, it can be done so without any copying. Previously the bitmap had to be copied into Ashmem, then into graphics memory. Since this method stores the snapshot directly in graphics memory, no copying is needed.\n- The state you see in Recents always matches the state you'll first see when reopening the app. Having the same buffer here also saves a lot of memory. That's why Recents is now able to show these images at full resolution. Previously, it was down sampled by 64% to save memory.\n\nImplementation\n--------------\n\n\nThis feature exists entirely in the Android platform. No integration is\nrequired, and customization isn't supported. However, device manufacturers can\ndisable the Task Snapshots feature entirely.\n\n\nTo disable this feature, modify this function: \n\n```text\nframeworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215\n```\n\n\nNote that if the feature is disabled, the Recents view will not show any\nthumbnails whatsoever.\n\nHigh-res and low-res snapshots\n------------------------------\n\nTask snapshots are written to the disk at two scales. When restoring a task snapshot from the disk, low-res snapshots are read first, and then replaced by their high-res counterpart. This optimization improves image load times. Otherwise, there could be a slight delay when reading the snapshot file from the disk, and the user would see a blank task card until the image was available. You can configure the scales in the device overlay config file `overlay/frameworks/base/core/res/res/values/config.xml` by setting `config_highResTaskSnapshotScale` and `config_lowResTaskSnapshotScale`. By default, these are set to 1.0 and 0.5 respectively. Disable low-res snapshots by setting `config_lowResTaskSnapshotScale` to 0.0.\n\nExamples and source\n-------------------\n\n\nFind the rest of the code for this feature within the TaskSnapshot\\* files in: \n\n```text\nframeworks/base/+/android16-release/services/core/java/com/android/server/wm/\n```"]]