2025년 3월 27일부터 AOSP를 빌드하고 기여하려면 aosp-main
대신 android-latest-release
를 사용하는 것이 좋습니다. 자세한 내용은 AOSP 변경사항을 참고하세요.
태스크 스냅샷
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
작업 스냅샷은 Android 8.0에 도입된 인프라로, 창 관리자의 저장된 표면 및 최근 미리보기 이미지 스크린샷을 결합합니다. 최근 미리보기 이미지는 최근 항목 보기에서 작업의 마지막 상태를 나타냅니다.
활동이 중지된 상태가 된 경우 이 활동이 작업의 최상위에 있는 동안에는 창 관리자가 활동의 표면을 제거하지 않았습니다. 이 활동을 다시 표시해야 했던 경우 저장된 표면을 사용할 수 있었으므로 이 활동이 첫 번째 프레임 그리기를 완료할 때까지 기다리지 않고 창 관리자가 애니메이션을 시작할 수 있었습니다.
아키텍처
최근 미리보기 이미지 및 저장된 표면이라는 두 가지 개념이 작업 스냅샷으로 통합되었습니다. 작업이 백그라운드로 전환되면 창 관리자는 이 작업의 스크린샷을 GraphicBuffer에 배치합니다. 작업의 상위 활동 앱이 메모리에 남아 있는 한 이 GraphicBuffer는 메모리에서 유지됩니다. 이제 동일한 활동이 다시 포그라운드로 전환되면 창 관리자는 시작 창 (TaskSnapshotSurface)을 만들고 메모리를 시작 창의 버퍼 큐에 복사하지 않고 GraphicBuffer를 연결합니다. 활동이 첫 프레임을 그리자마자 작업 스냅샷 시작 창이 일반적인 스플래시 화면처럼 매끄럽게 페이드 아웃됩니다.
동일한 GraphicBuffer도 바인더를 통해 SystemUI로 전송되어 최근 항목 보기의 작업 미리보기 상태를 그리는 데 사용됩니다. GraphicBuffer는 버퍼 참조일 뿐이므로 바인더를 통해 GraphicBuffer를 전송하면 리소스가 거의 소모되지 않습니다. GraphicBuffer가 SystemUI에 도착하면 하드웨어 비트맵에 래핑된 다음 그래픽 메모리에 메모리를 업로드하지 않고 화면에 그립니다.
이점
새로운 아키텍처에는 다음과 같은 세 가지 주요 이점이 있습니다.
- 작업 스냅샷을 시작 창으로 사용하면 스냅샷과 실제 콘텐츠 사이에 멋진 크로스페이드가 표시됩니다.
- SystemUI에 작업 스냅샷을 그릴 때 복사 없이 그릴 수 있습니다. 이전에는 비트맵을 Ashmem으로 복사한 다음 그래픽 메모리로 복사해야 했습니다. 이 방법은 스냅샷을 그래픽 메모리에 직접 저장하므로 복사할 필요가 없습니다.
- 최근 항목에 표시되는 상태는 항상 앱을 다시 열 때 처음 표시되는 상태와 일치합니다. 동일한 버퍼를 사용하면 많은 양의 메모리를 절약할 수 있습니다.
따라서 이제 최근 항목에 이미지를 전체 해상도로 표시할 수 있습니다.
이전에는 메모리를 절약하기 위해 64%까지 다운 샘플링되었습니다.
구현
이 기능은 Android 플랫폼에서만 온전하게 사용할 수 있습니다. 통합이 필요하지 않으며 맞춤설정이 지원되지 않습니다. 하지만 기기 제조업체는 작업 스냅샷 기능을 완전히 사용 중지할 수 있습니다.
이 기능을 사용 중지하려면 다음 함수를 수정하세요.
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
이 기능을 사용 중지하면 최근 항목 보기에 미리보기 이미지가 전혀 표시되지 않습니다.
고해상도 및 저해상도 스냅샷
작업 스냅샷은 두 가지 비율로 디스크에 기록됩니다. 디스크에서 작업 스냅샷을 복원할 때 저해상도 스냅샷을 먼저 읽고 고해상도 버전으로 바꿉니다. 이러한 최적화를 통해 이미지 로드 시간이 단축됩니다.
최적화를 하지 않으면 디스크에서 스냅샷 파일을 읽을 때 약간의 지연이 있을 수 있으며 사용자에게 이미지가 제공될 때까지 빈 작업 카드가 표시됩니다.
config_highResTaskSnapshotScale
과
config_lowResTaskSnapshotScale
을 설정하여 기기 오버레이 구성 파일
overlay/frameworks/base/core/res/res/values/config.xml
에서 비율을 구성할 수 있습니다. 기본적으로 각각 1.0과 0.5로 설정됩니다.
config_lowResTaskSnapshotScale
을 0.0으로 설정하여 저해상도 스냅샷을 사용 중지합니다.
예시 및 소스
TaskSnapshot* 파일 내에 있는 이 기능 관련 코드의 나머지 부분은 다음 위치에서 확인할 수 있습니다.
frameworks/base/+/android16-release/services/core/java/com/android/server/wm/
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(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-07-27(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```"]]