범위 지정 저장소

범위 지정 저장소는 앱의 외부 저장소 액세스를 제한합니다. Android 11 이상에서 API 30 이상을 타겟팅하는 앱은 범위 지정 저장소를 사용해야 합니다. 이전에는 Android 10에서 앱이 범위 지정 저장소를 선택 해제할 수 있었습니다.

앱 액세스 제한

범위 지정 저장소의 목표는 앱 및 사용자 데이터의 개인 정보를 보호하는 것입니다. 여기에는 사용자 정보(예: 사진 메타데이터)를 보호하고, 앱이 명시적 권한 없이 사용자 파일을 수정 또는 삭제하지 못하도록 방지하며, 다운로드 또는 기타 폴더에 다운로드한 민감한 사용자 문서를 보호하는 것이 포함됩니다.

범위 지정 저장소를 사용하는 앱은 다음과 같은 액세스 수준을 보유할 수 있습니다(실제 액세스는 구현에 따라 다름).

  • 권한 없이 자체 파일에 관한 읽기쓰기 액세스
  • READ_EXTERNAL_STORAGE 권한으로 다른 앱의 미디어 파일에 관한 읽기 액세스
  • 다른 앱의 미디어 파일에 관한 쓰기 액세스는 직접적인 사용자 동의를 통해서만 허용됨(모든 파일 액세스가 가능한 앱 및 시스템 갤러리에는 예외 허용)
  • 다른 앱의 외부 앱 데이터 디렉터리에 관한 읽기 또는 쓰기 액세스 권한 없음

FUSE와 함께 범위 지정 저장소 사용

Android 11 이상에서는 FUSE(Filesystem in Userspace)를 지원합니다. 이를 통해 MediaProvider 모듈은 사용자 공간의 파일 작업을 검사하고 액세스를 허용, 거부 또는 수정하는 정책에 따라 파일에 관한 액세스를 통제할 수 있습니다. FUSE를 사용하는 범위 지정 저장소의 앱은 범위 지정 저장소의 개인정보 보호 기능 및 직접 파일 경로를 사용하여 파일에 액세스할 수 있는 기능(앱에서 File API가 작동하도록 유지)을 활용할 수 있습니다.

Android 10에서는 MediaProvider의 파일 액세스에 범위 지정 저장소 규칙을 적용했지만 커널 호출을 가로채는 데 필요한 작업으로 인해 직접 파일 경로 액세스(예: File API 및 NDK API 사용)에는 적용하지 않았습니다. 따라서 범위 지정 저장소의 앱은 직접 파일 경로를 사용하여 파일에 액세스할 수 없습니다. 이러한 제한은 앱 개발자의 적응 능력에 영향을 주었습니다. File API의 MediaProvider API 액세스를 다시 작성하려면 상당한 코드 변경이 필요하기 때문입니다.

FUSE 및 SDCardFS

Android 11의 FUSE 지원은 SDCardFS 지원 중단과 관련이 없지만, 이전에 SDCardFS를 사용하던 기기를 위해 미디어 저장소 대안을 제공합니다. 기기에 다음 사항이 적용됩니다.

  • 커널 5.4 이상을 사용하는 Android 11 이상으로 출시되는 기기는 SDCardFS를 사용할 수 없습니다.
  • Android 11 이상으로 업그레이드하는 기기는 SDCardFS 위에 FUSE를 호스팅하여 파일 작업을 가로채고 개인정보 보호 목표를 달성할 수 있습니다.

FUSE 성능 미세 조정

이전에 Android는 외부 저장소가 FUSE로 마운트된 Android 7 이하에서 FUSE를 지원했습니다. FUSE 구현과 관련된 성능 및 교착 상태 문제로 인해 Android 8에서는 SDCardFS를 도입했습니다. Android 11에서는 향상되고 더 적절히 테스트된 libfuse 구현(Android 7 이하에서의 성능 문제를 해결하도록 미세 조정할 수 있음)을 사용하여 FUSE에 대한 지원을 다시 도입합니다.

FUSE 미세 조정에는 다음과 같은 변경이 포함됩니다.

  • Android/dataAndroid/obb 디렉터리의 FUSE를 우회하여 이러한 디렉터리를 사용하는 게임 앱의 성능 향상
  • 읽기 성능 및 미디어 재생이 원활하도록 유지하기 위한 최적화(예: FUSE 파일 시스템의 미리 읽기 및 더티 비율 미세 조정)
  • FUSE WB(Write-Back) 캐시 사용
  • 시스템 서버에 대한 IPC를 줄이기 위한 권한 캐싱
  • 일괄 작업을 더 빠르게 하기 위해 모든 파일 액세스 권한이 있는 앱에 대한 최적화

위의 미세 조정을 통해 FUSE 기기와 비 FUSE 기기가 비슷한 성능을 낼 수 있습니다. 예를 들어 FUSE를 사용하며 미세 조정된 Pixel 2와 미디어 저장소를 사용하는 Pixel 2를 테스트한 결과, 파일 경로 액세스와 미디어 저장소의 순차 읽기 성능(예: 동영상 재생)이 비슷한 것으로 나타났습니다. 그러나 순차 쓰기는 FUSE에서 약간 더 나빴으며 임의 읽기 및 쓰기는 최대 두 배까지 느려질 수 있었습니다.

성능 측정값은 기기마다 그리고 구체적인 사용 사례 간에 달라질 수 있습니다. MediaProvider API는 가장 일관된 성능을 제공하므로 성능에 관심이 있는 앱 개발자는 앱에 MediaProvider API를 사용해야 합니다.

FUSE 성능 영향 완화

FUSE 성능 영향은 외부 공유 저장소에 저장된 파일의 과도한 사용자로만 제한됩니다. android/dataandroid/obb 디렉터리를 포함하는 외부 비공개 저장소는 FUSE에 의해 우회되지만 내부 저장소(예: 많은 앱이 데이터를 저장하여 암호화하고 안전하게 유지하는 /data/data)에는 FUSE가 마운트되지 않습니다.

  • 공유 외부 저장소를 자주 사용하지 않는 앱은 대개 그리 많지 않은 파일 집합(일반적으로 100개 미만의 파일)과 상호작용합니다. 이러한 앱은 일반적인 읽기 및 쓰기 작업의 기존 최적화 이점을 누릴 수 있으며, Android 11에서 FUSE 관련 성능 영향을 확인하지 못합니다.

  • 공유 외부 저장소를 자주 사용하는 앱은 일반적으로 1,000개의 파일이 있는 디렉터리를 나열 또는 삭제하거나 파일 시스템에 백만 개의 파일이 있는 디렉터리를 생성 또는 삭제하는 등 일괄 파일 작업을 실행합니다. 일괄 파일 작업은 Android 11에서 FUSE의 영향을 받을 수 있지만 이러한 앱이 MANAGE_EXTERNAL_STORAGE 권한을 사용할 수 있는 경우 2020년 10월 업데이트에 포함된 성능 최적화의 이점을 누릴 수 있습니다.

FUSE 성능 오버헤드를 방지하기 위해 앱은 외부 비공개 저장소에 데이터를 저장하거나 ContentProvider 클래스의 일괄 API를 사용하여 FUSE를 우회하고 성능 최적화 경로를 얻을 수 있습니다. 또한 MediaProvider 시스템 구성요소에 관한 2020년 10월 업데이트에는 MANAGE_EXTERNAL_STORAGE 권한을 보유한 파일 관리자 및 이와 유사한 앱(예: 백업/복원, 바이러스 백신)의 성능 최적화가 포함되어 있습니다.

성능보다 개인 정보 보호 우선

FUSE에 맞게 미세 조정된 기기에서 대부분의 중요한 사용자 여정은 성능 면에서 Android 10과 Android 11 간에 동일합니다. 그러나 파일 작업 세트에 대한 업계 기준치 테스트 시 Android 11은 Android 10보다 성능이 떨어질 수 있습니다. Android 11에서 더 나쁜 성능을 보이는 파일 액세스 패턴(예: 임의 읽기 또는 쓰기)의 경우 MediaProvider API를 사용하여 앱에 비 FUSE 액세스 모드를 제공하는 것이 좋습니다. 이는 가장 우수하고 일관된 성능을 보여주는 옵션입니다.

MediaProvider 및 FUSE 업데이트

MediaProvider 시스템 구성요소 동작은 Android 출시마다 다릅니다.

  • Android 10 이하에서 SDCardFS는 파일 시스템이었으며 MediaProvider는 파일 컬렉션(예: 이미지, 동영상, 음악 파일 등)에 대한 인터페이스를 제공했습니다. 앱은 File API를 사용하여 파일을 생성할 때 MediaProvider에 파일을 검색하여 데이터베이스에 기록하도록 요청할 수 있었습니다.

  • Android 11 이상에서는 SDCardFS가 지원 중단되고 MediaProvider는 외부 저장소의 파일 시스템 핸들러(FUSE용)가 되며, 이를 통해 외부 저장소의 파일 시스템과 MediaProvider 데이터베이스가 일관성을 유지합니다. FUSE 파일 시스템의 사용자 공간 핸들러로서 MediaProvider는 커널 호출을 가로채고 파일 작업이 개인정보를 보호하는지 확인할 수 있습니다.

Android 11 이상에서 MediaProvider는 Android 출시 외부에서 업데이트할 수 있는 모듈식 시스템 구성요소(메인라인 모듈)이기도 합니다. 즉, MediaProvider에서 발견된 성능, 개인정보 보호 또는 보안 문제의 경우 Google Play 스토어 또는 기타 파트너 제공 메커니즘의 무선 업데이트(OTA)를 통해 수정 및 전송할 수 있습니다. FUSE 핸들러에서 예상되는 범위의 모든 항목도 업데이트 가능하므로 업데이트를 통해 FUSE 성능 회귀 및 버그를 수정할 수 있습니다.