Android11의 Privacy 관련 변경사항에 대해서 정리하였습니다.
Scoped Storage
Scoped Storage는 Android 10에서 공개되었습니다. Android11에서 더욱 강화되어 사용자의 개인정보를 보호합니다.
Scoped Storage의 기본적인 내용은 새로운 저장소 정책, Scoped Storage 알아보기를 참고해주세요.
개선 및 변경사항은 다음과 같습니다.
- API Level 29를 타겟으로 하는 앱은 여전히 Legacy Storage 정책을 사용할 수 있습니다.
- API Level 30을 타겟으로 하는 앱은 Scoped Storage 정책만 사용해야 합니다.
- Android10에서는 File API를 사용할 수 없었지만, Android11에서는 File API를 사용할 수 있습니다. 3rd party library의 호환성을 위해 변경되었습니다.
MANGED_EXTERNAL_STORAGE
권한을 제공하며, 앱은 이 권한으로 모든 파일에 대한 접근 권한을 얻을 수 있습니다.- 이제
ACTION_OPEN_DOCUMENT_TREE
으로 Interal Storage, SD card,/Download
의 전체 접근 권한을 얻을 수 없습니다. - 이제
ACTION_OPEN_DOCUMENT_TREE
,ACTION_OPEN_DOCUMENT
으로/data
,/obb
의 전체 디렉토리에 대한 접근 권한을 얻을 수 없습니다. - 사용자에게 파일을 즐겨찾기, 휴지통에 보관, 완전히 삭제 등의 요청을 할 수 있는 기능이 있습니다.
Legacy Storage 정책은
READ/WRITE_EXTERNAL_STORAGE
권한으로 모든 Storage의 접근 권한을 얻는 방식을 말합니다.
One-time permissions
Android11에서는 App이 Location, Camera, Microphone 권한을 요청할 때, 팝업에 Only this time
이라는 옵션을 제공합니다. 이 옵션으로 권한을 허용하면 App을 사용할 때만 권한이 허용되며, 앱을 더 이상 사용하지 않는다고 생각되면 시스템이 권한을 제한합니다.
다음과 같은 경우, 시스템은 사용자가 App을 사용중이라고 생각하며 권한은 유지됩니다.
- App의 Activity가 보일 때
- Activity가 보일 때 Foreground service를 실행했고 그 뒤에 사용자가 App을 종료한 경우, Foreground service가 종료될 때 까지 권한은 유지됩니다.
다음과 같은 경우, 시스템은 권한을 제한합니다.
- App이 Background로 전환되었을 때, App의 권한은 제한됩니다. 하지만 App의 작업이 완전히 끝나지 않았을 수 있기 때문에 일정 시간(약 1분)이 지난 뒤에 권한은 제한됩니다.
Auto-reset permissions
Android 11 이상에서는 몇달간 사용되지 않은 앱의 민감한 퍼미션은 자동으로 회수(제한, denied)됩니다. 따라서, App은 App이 실행되었을 때 항상 권한이 있는지 확인하고 없다면 사용자에게 요청하도록 구현이 되어야 합니다.
Package visibility
App이 디바이스에 설치된 다른 App들의 정보를 찾거나 얻는 방식이 변경되었습니다.
Android 10 이하에서 App은 디바이스에 설치된 다른 앱의 정보를 얻고, 그 App을 실행할 수 있었습니다.
Android 11에서는 App은 다른 앱의 정보를 얻을 수 없습니다. 만약 정보를 얻고 싶다면 AndroidManifest에 <queries>
라는 TAG로 다른 App의 package name이나 Intent를 정의해야 합니다.
또는 QUERY_ALL_PACKAGES
퍼미션을 Manifest에 추가하면 Android 10처럼 제한 없이 모든 패키지에 대한 정보를 얻고 실행할 수 있습니다.
Package visibility에 대한 자세한 정보는 Package visibility 변경사항 소개를 참고해주세요.
Data access auditing
App은 자신의 App이나, App이 사용하고 있는 3rd party library가 사용자의 private data에 접근하는 경우가 있는지 분석할 수 있습니다.
Android11에서 AppOpsManager는 OnOpNotedCallback을 제공합니다. AppOps는 App이 private data에 접근하였을 때 App에게 Callback으로 알려줍니다.
App은 다음과 같은 private data에 접근하는지 알 수 있습니다.
- Runtime permission에 보호되는 내용
- 민감한 데이터(사진에 태깅된 위치정보 등)
Foreground services
Android 11에서 Foreground service의 Location, Camera, Microphone 정보의 접근을 부분적으로 제한합니다.
Android 10에서 Foreground service는 이런 정보에 접근을 할 수 있었습니다.
하지만 Android 11에서는 Foreground service가 Background로 부터 실행되었다면 이런 권한이 제한됩니다. Foreground에서 실행된 Foreground service라면 제한이 없습니다.
접근 권한이 없는 Service는 다음과 같은 상태를 의미합니다.
- UI가 없는 상태에서 동작하는 서비스
- 실행 중인 Foreground service가 없는 상태에서 동작하는 서비스
- Broadcast receiver, AlarmManager, WorkManager, JobScheduler는 Background service로 동작
접근 권한이 있는 Foreground Service는 다음과 같은 서비스를 의미합니다.
- Foreground service에서 실행된 Foreground service
- System으로 부터 실행된 Foreground service
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력