작업 스냅샷

작업 스냅샷은 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_highResTaskSnapshotScaleconfig_lowResTaskSnapshotScale을 설정하여 기기 오버레이 구성 파일 overlay/frameworks/base/core/res/res/values/config.xml에서 비율을 구성할 수 있습니다. 기본적으로 각각 1.0과 0.5로 설정됩니다. config_lowResTaskSnapshotScale을 0.0으로 설정하여 저해상도 스냅샷을 사용 중지합니다.

예시 및 소스

TaskSnapshot* 파일 내에 있는 이 기능 관련 코드의 나머지 부분은 다음 위치에서 확인할 수 있습니다.

frameworks/base/+/master/services/core/java/com/android/server/wm/