Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

기기 식별자

Android 10에서는 모든 기기 식별자가 READ_PRIVILEGED_PHONE_STATE 권한으로 보호되도록 기기 식별자 권한이 변경됩니다. Android 10 이전에는 영구 기기 식별자(IMEI/MEID, IMSI, SIM 및 빌드 일련번호)가 READ_PHONE_STATE 런타임 권한 뒤에서 보호되었습니다. READ_PRIVILEGED_PHONE_STATE 권한은 플랫폼 키로 서명된 앱과 권한이 있는 시스템 앱에만 부여됩니다.

새 권한 요구사항을 자세히 알아보려면 Javadoc 페이지의 TelephonyManager.javaBuild.java 관련 정보를 참조하세요.

이 변경사항은 다음과 같은 API에 영향을 미칩니다.

  • TelephonyManager#getDeviceId
  • TelephonyManager#getImei
  • TelephonyManager#getMeid
  • TelephonyManager#getSimSerialNumber
  • TelephonyManager#getSubscriberId
  • Build#getSerial

READ_PRIVILEGED_PHONE_STATE 권한이 없는 이동통신사 앱의 액세스

READ_PRIVILEGED_PHONE_STATE 권한을 가질 자격이 없는 미리 로드된 이동통신사 앱은 아래 표에 있는 옵션 중 하나를 구현할 수 있습니다.

옵션 설명 제한사항
UICC 이동통신사 권한 Android 플랫폼은 UICC에 저장된 인증서를 로드하고 이러한 인증서로 서명된 앱에 권한을 부여하여 특수 메서드를 호출합니다. 기존 이동통신사의 경우 SIM 이용 고객이 많아서 업데이트하기 쉽지 않습니다. 또한 새로운 SIM을 작성할 권한이 없는 이동통신사는(예: MNO에서 발행된 SIM이 있는 MVNO) SIM에 인증서를 추가하거나 업데이트할 수 없습니다.
OEM 허용 목록 OEM은 OP_READ_DEVICE_IDENTIFIER를 사용하여 허용된 이동통신사 앱에 기기 식별자를 제공할 수 있습니다. 이 해결 방법은 일부 이동통신사에만 적용됩니다.
유형 할당 코드(TAC) Android 10에 도입된 getTypeAllocationCode 메서드를 사용하여 제조업체 및 모델 정보를 반환하는 TAC를 노출합니다. TAC에 포함된 정보는 특정 기기를 식별하기에 부적절합니다.
MSISDN 이동통신사는 TelephonyManager 아래에 있는 전화번호(MSISDN) 및 PHONE 권한 그룹을 사용하여 백엔드 시스템의 IMEI를 조회할 수 있습니다. 이 작업은 이동통신사에 큰 부담이 됩니다. IMSI를 사용하여 네트워크 키를 매핑하는 이동통신사가 MSISDN으로 전환하려면 상당한 기술 리소스가 필요합니다.

모든 이동통신사 앱은 CarrierConfig.xml 파일을 이동통신사 앱의 서명 인증서 해시로 업데이트하여 기기 식별자에 액세스할 수 있습니다. 이동통신사 앱에서 권한 정보를 읽도록 메서드를 호출하면 플랫폼에서 CarrierConfig.xml 파일에 포함된 앱의 서명 인증서 해시(인증서의 SHA-1 또는 SHA-256 서명)와 일치하는 항목이 있는지 찾습니다. 일치하는 항목을 찾으면 요청한 정보가 반환됩니다. 일치하는 정보가 없다면 보안 예외가 반환됩니다.

이 솔루션을 구현하려면 이동통신사는 반드시 다음 단계를 따라야 합니다.

  1. CarrierConfig.xml을 이동통신사 앱의 서명 인증서 해시로 업데이트하고 패치를 제출합니다.
  2. OEM에 QPR1+(권장) 또는 다음 필수 플랫폼 패치와 위의 1단계에서 업데이트된 CarrierConfig.xml 파일이 포함된 패치를 사용하여 빌드를 업데이트하도록 요청합니다.

구현

독점 권한 허용 목록을 업데이트하여 기기 식별자에 액세스해야 하는 권한 있는 앱에 READ_PRIVILEGED_PHONE_STATE 권한을 부여하세요.

허용 목록 추가에 관해 자세히 알아보려면 독점 권한 허용을 참조하세요.

영향을 받은 API를 호출하려면 앱이 다음과 같은 요구사항 중 하나를 충족해야 합니다.

  • 앱이 미리 로드된 권한 있는 애플리케이션인 경우 AndroidManifest.xml에 READ_PRIVILEGED_PHONE_STATE 권한을 선언해야 합니다. 또한 앱은 이 독점 권한을 허용해야 합니다.
  • Google Play를 통해 제공되는 앱은 이동통신사 권한이 필요합니다. 이동통신사 권한 부여에 관한 자세한 내용은 UICC 이동통신사 권한 페이지를 참조하세요.
  • READ_PHONE_STATE 권한을 부여받은 기기 또는 프로필 소유자 앱이 필요합니다.

이러한 요구사항을 하나도 충족하지 않는 앱은 다음과 같이 작동합니다.

  • 앱이 Q 이전 버전을 타겟팅하고 READ_PHONE_STATE 권한을 부여받지 않았다면 SecurityException이 트리거됩니다. 이는 현재의 Q 이전 버전의 동작이며, 이러한 API를 호출하려면 이 권한이 필요하기 때문입니다.
  • 앱이 Q 이전 버전을 타겟팅하고 READ_PHONE_STATE 권한을 부여받았다면 앱은 모든 TelephonyManager API 및 Build#getSerial 메서드 관련 Build.UNKNOWN에 관해 null 값을 수신합니다.
  • 앱이 Android 10 이상을 타겟팅하고 새로운 요구사항을 하나도 충족하지 않는다면 앱이 SecurityException을 수신합니다.

검증 및 테스트

호환성 테스트 도구 모음(CTS)에는 이동통신사 권한을 보유한 앱, 기기 및 프로필 소유자, 기기 식별자에 액세스할 수 없을 것으로 예상되는 앱의 예상 기기 식별자 액세스 동작을 검증하기 위한 테스트가 포함되어 있습니다.

다음 CTS 테스트는 이러한 기능과 관련이 있습니다.

cts-tradefed run cts -m CtsCarrierApiTestCases -t
    android.carrierapi.cts.CarrierApiTest

cts-tradefed run cts -m CtsTelephonyTestCases -t
    android.telephony.cts.TelephonyManagerTest

cts-tradefed run cts -m CtsTelephony3TestCases

cts-tradefed run cts -m CtsPermissionTestCases -t
    android.permission.cts.TelephonyManagerPermissionTest

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCanGetDeviceIdentifiers

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCanGetDeviceIdentifiers

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCannotGetDeviceIdentifiersWithoutPermission

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCannotGetDeviceIdentifiersWithoutPermission