권한이 있는 앱은 시스템 이미지 파티션의 priv-app
디렉터리에 위치한 시스템 앱입니다. Android 출시에 사용되는 파티션은 다음과 같습니다.
- Android 9 이상:
/system, /product, /vendor
- Android 8.1 이하:
/system
지금까지 기기 제조업체에는 어떤 signature | privileged 권한을 권한 있는 앱에 부여할 수 있는지를 제어하는 권한이 부족했습니다. Android 8.0부터는 제조업체가 /etc/permissions
디렉터리의 시스템 구성 XML 파일에서 독점 권한을 명시적으로 부여할 수 있습니다. Android 9부터는 구현자가 모든 독점 권한을 명시적으로 부여하거나 거부할 수 있습니다. 독점 권한이 부여되지 않으면 기기가 부팅되지 않습니다.
privapp-permissions.xml
파일은 동일한 파티션의 권한 있는 앱에만 권한을 부여하거나 거부할 수 있습니다. 예를 들어 /product
파티션의 앱이 독점 권한을 요청하면 요청은 /product
의 privapp-permissions.xml
파일에 의해서만 승인 또는 거부될 수 있습니다.
허용 목록 추가
앱의 권한 허용 목록은 다음과 같이 frameworks/base/etc/permissions
디렉터리에 있는 단일 XML 또는 여러 XML 파일에 나열할 수 있습니다.
/etc/permissions/privapp-permissions-OEM_NAME.xml
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
콘텐츠 구성 방법에는 엄격한 규칙이 적용되지 않습니다. /system/priv-app
의 모든 앱이 허용 목록에 있는 한 기기 구현자는 콘텐츠 구조를 파악할 수 있습니다. 예를 들어 Google에서는 권한이 있는 모든 앱의 단일 허용 목록을 개발했습니다.
다음 구성이 권장됩니다.
- Android 오픈소스 프로젝트(AOSP) 트리에 이미 포함된 앱의 권한이
/etc/permissions/privapp-permissions-platform.xml
에 나열됩니다. - 다른 앱에서는
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
형식의 파일을 사용합니다.
허용 목록 맞춤설정
AOSP에는 필요에 따라 맞춤설정 가능한 허용 목록 구현이 포함되어 있습니다.
권한을 거부해야 하는 경우 permission
태그가 아닌 deny-permission
태그를 사용하도록 XML을 수정합니다. 예:
<!-- This XML file declares which signature|privileged permissions to grant to privileged apps that come with the platform --> <permissions> <privapp-permissions package="com.android.backupconfirm"> <permission name="android.permission.BACKUP"/> <permission name="android.permission.CRYPT_KEEPER"/> </privapp-permissions> <privapp-permissions package="com.android.cellbroadcastreceiver"> <!-- Don't allow the application to interact across users --> <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/> <permission name="android.permission.MANAGE_USERS"/> <permission name="android.permission.MODIFY_PHONE_STATE"/> <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/> </privapp-permissions> ...
누락된 권한 찾기
새 기기를 시작할 때 누락된 권한을 찾으려면 다음과 같이 전환 로그 모드를 사용 설정합니다.
ro.control_privapp_permissions=log
위반사항은 로그 파일에서 보고됩니다. 독점이 아닌 권한이 부여됩니다. 이렇게 하면 계속 위반 목록을 제공하면서 기기가 작동 상태를 유지합니다. 오류 메시지 형식은 다음과 같습니다.
PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist
모든 위반은 누락된 권한을 적절한 허용 목록에 추가하는 방식으로 해결해야 합니다. 다음에 유의하세요.
- Android 9 이상에서는 독점 권한을 위반하면 기기가 시작되지 않습니다. 대신 모든 독점 권한을 명시적으로 허용하거나 거부해야 합니다.
- Android 8.0 이하에서는
priv-app
경로에 있어도 영향을 받는 앱에 누락된 권한이 부여되지 않습니다.
허용 목록 적용
허용 목록을 만든 후에는 빌드 속성 ro.control_privapp_permissions=enforce
를 설정하여 런타임 적용을 사용 설정합니다.
허용 목록은 package="android"
가 포함된 앱에서 선언한 권한에만 필요합니다. ro.control_privapp_permissions
속성 상태는 호환성 정의 문서(CDD)의 섹션 9.1 권한을 준수해야 합니다.