저장소

Android 외부 저장소 HAL 아이콘

Android는 광범위한 저장소 기기 유형 및 기능을 지원할 수 있도록 점차적으로 발전하고 있습니다. 모든 Android 버전은 휴대용 저장소와 에뮬레이션된 저장소를 비롯한 기존 저장소가 포함된 기기를 지원합니다. 일시적인 데이터 전송/파일 저장을 위한 SD 카드나 USB와 같은 물리적 매체는 휴대용 저장소로 기능할 수 있습니다. 물리적 매체는 장시간 동안 기기와 연결 상태를 유지할 수 있지만 기기에 귀속되지 않으며 삭제가 가능합니다. SD 카드는 Android 1.0부터 휴대용 저장소로 사용되었으며, Android 6.0에서는 USB 지원이 추가되었습니다. 에뮬레이션된 저장소는 에뮬레이션 레이어를 통해 내부 저장소의 일부를 노출하는 방식으로 제공되며 Android 3.0부터 사용할 수 있게 되었습니다.

Android 6.0부터 Android는 채택 가능한 저장소를 지원합니다. 이 저장소는 SD 카드나 USB와 같은 물리적 매체에 의해 제공되며 내부 저장소처럼 작동하도록 암호화되고 형식이 지정됩니다. 채택 가능한 저장소에는 모든 유형의 애플리케이션 데이터를 저장할 수 있습니다.

권한

외부 저장소 액세스는 다양한 Android 권한에 의해 보호됩니다. Android 1.0부터는 쓰기 액세스가 WRITE_EXTERNAL_STORAGE 권한으로 보호됩니다. Android 4.1부터는 읽기 액세스가 READ_EXTERNAL_STORAGE 권한으로 보호됩니다.

Android 4.4부터는 외부 저장소 기기 파일의 소유자, 그룹 및 모드가 디렉터리 구조에 따라 합성됩니다. 이 방법을 통해, 앱에서 광범위한 WRITE_EXTERNAL_STORAGE 권한을 보유하도록 요구하지 않고도 외부 저장소의 패키지 관련 디렉터리를 관리할 수 있습니다. 예를 들어 패키지 이름이 com.example.foo인 앱은 이제 권한이 없는 외부 저장소 기기의 Android/data/com.example.foo/에 자유롭게 액세스할 수 있습니다. 이렇게 합성된 권한은 FUSE 데몬에서 원시 저장소 기기를 래핑하는 방식으로 달성됩니다.

Android 10부터는 Android 9 이하를 타겟팅하는 앱이 레거시 저장소로 기본 설정되며 격리된 저장소를 선택할 수 있습니다. Android 10을 타겟팅하고 격리된 저장소로 기본 설정되는 앱은 일시적인 선택 취소할 수 있습니다. 저장소 모델을 제어하는 매니페스트 속성 requestLegacyExternalStorage를 사용하여 기본 상태를 변경하세요.

READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 권한 모두 유연하게 제한됩니다. 따라서 설치 프로그램에서 앱을 허용 목록에 추가하지 않은 경우 청각 및 시각적 컬렉션을 향한 액세스만 권한에 의해 제어되며, SD 카드 액세스 권한은 주어지지 않습니다. 이는 앱이 레거시 저장소를 요청하는 경우에도 적용됩니다. 엄격한 제한 및 유연한 제한에 관한 자세한 내용은 Android 10의 엄격한 제한 및 유연한 제한을 참고하세요.

설치 프로그램이 권한을 허용 목록에 추가한 경우 레거시 모드에서 실행되는 앱에서는 격리되지 않은 권한 동작이 발생합니다. 권한은 SD 카드 액세스 및 청각적, 시각적 컬렉션을 제어합니다. 이는 앱이 Android 9 이하를 타겟팅하고 격리된 저장소를 선택하지 않거나 Android 10을 타겟팅하고 선택을 취소하는 경우에 발생합니다.

허용 상태는 설치 시점에만 지정할 수 있으며 앱이 설치될 때까지 변경할 수 없습니다.

READ_EXTERNAL_STORAGE 권한 설정에 관한 자세한 내용은 PackageInstaller.SessionParams 클래스의 setWhitelistedRestrictedPermissions()를 참고하세요.

런타임 권한

Android 6.0에는 앱 런타임 시점에 필요한 경우 앱이 기능을 요청하는 새로운 런타임 권한 모델이 도입됩니다. 새 모델에는 READ/WRITE_EXTERNAL_STORAGE 권한이 포함되므로 플랫폼에서 이미 실행 중인 앱을 중지하거나 다시 시작하지 않고 동적으로 저장소 액세스를 부여해야 합니다. 이때 마운트된 모든 저장소 기기에 관해 별개의 세 개 뷰를 유지하는 방법을 사용합니다.

  • /mnt/runtime/default는 특별한 저장소 권한 없이 앱에 표시되며 adbd 및 기타 시스템 구성요소가 상주하는 루트 네임스페이스에도 표시됩니다.
  • /mnt/runtime/readREAD_EXTERNAL_STORAGE가 포함된 앱에 표시됩니다(Android 10의 경우 LEGACY_STORAGE를 설정함).
  • /mnt/runtime/writeWRITE_EXTERNAL_STORAGE가 포함된 앱에 표시됩니다.

Zygote 포크 시간에는 실행 중인 각 앱의 마운트 네임스페이스가 생성되며, 바인드는 적절한 초기 화면을 위치에 마운트합니다. 나중에 런타임 권한이 부여되면 vold가 이미 실행 중인 앱의 마운트 네임스페이스로 점프하며, 바인드는 업그레이드된 화면을 위치에 마운트합니다. 권한 다운그레이드는 항상 앱 중지의 결과로 이어집니다.

이 기능을 구현하는 데 사용된 setns() 함수에는 Linux 3.8 이상이 필요하지만, 패치가 Lunux 3.4로 백포팅되었습니다. PermissionsHostTest CTS 테스트는 올바른 커널 동작을 확인하는 데 사용할 수 있습니다.