범위 지정 저장소는 외부 저장소에 대한 앱 액세스를 제한합니다. Android 11 이상에서 API 30 이상을 대상으로 하는 앱은 범위 지정 저장소를 사용해야 합니다. 이전에 Android 10에서는 앱이 범위 지정 저장소를 선택 해제할 수 있었습니다.
앱 액세스 제한
범위 지정 저장소의 목표는 앱 및 사용자 데이터의 개인 정보를 보호하는 것입니다. 여기에는 사용자 정보(예: 사진 메타데이터) 보호, 앱이 명시적 허가 없이 사용자 파일을 수정하거나 삭제하지 못하도록 방지, 다운로드 또는 기타 폴더에 다운로드한 민감한 사용자 문서 보호가 포함됩니다.
범위 지정 저장소를 사용하는 앱은 다음과 같은 액세스 수준을 가질 수 있습니다(실제 액세스는 구현에 따라 다름).
- 권한 없이 자신의 파일에 대한 읽기 및 쓰기 액세스
-
READ_EXTERNAL_STORAGE
권한으로 다른 앱의 미디어 파일에 대한 읽기 액세스 권한 - 다른 앱의 미디어 파일에 대한 쓰기 액세스는 사용자의 직접적인 동의가 있는 경우에만 허용됩니다(시스템 갤러리 및 모든 파일 액세스에 적합한 앱은 예외).
- 다른 앱의 외부 앱 데이터 디렉토리에 대한 읽기 또는 쓰기 액세스 권한이 없습니다.
FUSE와 함께 범위 지정 저장소 사용
Android 11 이상은 사용자 공간의 파일 시스템(FUSE)을 지원하므로 MediaProvider 모듈이 사용자 공간에서 파일 작업을 검사하고 액세스를 허용 , 거부 또는 수정하는 정책에 따라 파일에 대한 액세스를 차단할 수 있습니다. FUSE를 사용하는 범위 지정 저장소의 앱은 범위 지정 저장소의 개인 정보 보호 기능과 직접 파일 경로를 사용하여 파일에 액세스하는 기능(앱에서 파일 API 작동 유지)을 얻습니다.
Android 10은 MediaProvider의 파일 액세스에 범위 지정 저장소 규칙을 적용했지만 커널 호출을 가로채는 데 필요한 노력으로 인해 직접적인 파일 경로 액세스(예: File API 및 NDK API 사용)에는 적용되지 않았습니다. 결과적으로 범위가 지정된 저장소의 앱은 직접 파일 경로를 사용하여 파일에 액세스할 수 없습니다. 이 제한은 MediaProvider API에 대한 File API 액세스를 다시 작성하기 위해 상당한 코드 변경이 필요했기 때문에 앱 개발자의 적응 능력에 영향을 미쳤습니다.
퓨즈 및 SDCardFS
FUSE에 대한 Android 11 지원 은 SDCardFS 지원 중단 과 관련이 없지만 이전에 SDCardFS를 사용한 기기에 대해 Media Store에 대한 대안을 제공합니다. 장치:
- 커널 5.4 이상을 사용하여 Android 11 이상으로 실행하면 SDCardFS를 사용할 수 없습니다.
- Android 11 이상으로 업그레이드하면 SDCardFS 위에 FUSE를 호스팅하여 파일 작업을 가로채고 개인 정보 보호 목표를 충족할 수 있습니다.
FUSE 성능 튜닝
Android는 이전에 외부 저장소가 FUSE로 탑재된 Android 7 이하에서 FUSE를 지원했습니다. 해당 FUSE 구현의 성능 및 교착 상태 문제로 인해 Android 8에는 SDCardFS가 도입되었습니다. Android 11은 Android 7 이하의 성능 문제를 해결하기 위해 조정할 수 있는 libfuse
의 개선되고 더 잘 테스트된 구현을 사용하여 FUSE에 대한 지원을 다시 도입합니다.
FUSE 튜닝에는 다음과 같은 조정이 포함됩니다.
-
Android/data
및Android/obb
디렉터리에 대해 FUSE를 우회하여 이러한 디렉터리에 의존하는 게임 앱의 성능을 개선합니다. - 읽기 성능을 유지하고 미디어 재생을 원활하게 유지하기 위한 최적화(예: FUSE 파일 시스템의 미리 읽기 및 더티 비율 조정)
- FUSE 후기입 캐시 사용.
- 시스템 서버에 대한 IPC를 줄이기 위한 캐싱 권한.
- 일괄 작업을 더 빠르게 수행할 수 있도록 모든 파일 액세스 권한이 있는 앱에 대한 최적화.
위의 조정 조정은 FUSE와 비 FUSE 장치 간에 비슷한 성능을 생성할 수 있습니다. 예를 들어, FUSE를 사용하여 조정된 Pixel 2와 Media Store를 사용하여 Pixel 2를 테스트한 결과 파일 경로 액세스와 Media Store 간에 유사한 순차 읽기 성능(예: 비디오 재생)이 발견되었습니다. 그러나 순차 쓰기는 FUSE에서 약간 더 나빴고 임의 읽기 및 쓰기는 최대 두 배까지 느릴 수 있습니다.
성능 측정은 장치마다 그리고 특정 사용 사례 간에 변경될 수 있습니다. MediaProvider API가 가장 일관된 성능을 제공하기 때문에 성능을 염려하는 앱 개발자는 앱에 MediaProvider API를 사용해야 합니다.
FUSE 성능 영향 완화
FUSE 성능 영향은 외부 공유 저장소에 저장된 파일을 많이 사용하는 사용자에게만 제한됩니다. 외부 개인 저장소( android/data
및 android/obb
디렉토리 포함)는 FUSE에 의해 우회되지만 내부 저장소(예: /data/data
, 많은 앱에서 데이터를 암호화하고 안전하게 유지하기 위해 데이터를 저장함)는 FUSE 탑재되지 않습니다.
공유 외부 저장소의 라이트 사용자인 앱은 종종 제한된 파일 집합(일반적으로 100개 미만의 파일)과 상호 작용합니다. 이러한 앱은 일반적인 읽기 및 쓰기 작업의 기존 최적화를 활용하며 Android 11에서 FUSE 관련 성능 영향을 볼 수 없습니다.
공유 외부 저장소를 많이 사용하는 앱은 일반적으로 1000개 파일이 있는 디렉토리 나열 또는 제거, 파일 시스템에 백만 개의 파일이 있는 디렉토리 생성 또는 삭제와 같은 대량 파일 작업을 수행합니다. 대량 파일 작업은 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는 파일 컬렉션(예: 이미지, 비디오, 음악 파일 등)에 대한 인터페이스를 제공했습니다. 앱이 파일 API를 사용하여 파일을 생성할 때 MediaProvider에 파일을 스캔하고 데이터베이스에 기록하도록 요청할 수 있습니다.
Android 11 이상에서 SDCardFS 는 더 이상 사용되지 않으며 MediaProvider는 외부 저장소의 파일 시스템 핸들러(FUSE용)가 되어 외부 저장소의 파일 시스템과 MediaProvider 데이터베이스의 일관성을 유지합니다. FUSE 파일 시스템에 대한 사용자 공간 핸들러로서 MediaProvider는 커널 호출을 가로채고 파일 작업이 개인 정보 보호에 안전한지 확인할 수 있습니다.
Android 11 이상에서 MediaProvider는 Android 릴리스 외부에서 업데이트할 수 있는 모듈 식 시스템 구성요소 (Mainline 모듈)이기도 합니다. 즉, MediaProvider에서 발견된 성능, 개인 정보 또는 보안 문제를 수정하고 Google Play 스토어 또는 기타 파트너 제공 메커니즘을 통해 무선으로 전달할 수 있습니다. FUSE 처리기에서 예상되는 범위의 모든 항목도 업데이트할 수 있으므로 업데이트를 통해 FUSE 성능 회귀 및 버그를 수정할 수 있습니다.