Cihaz tanımlayıcıları

Android 10 korunmasını sağlamak için yalnızca cihaz tanımlayıcılarını READ_PRIVILEGED_PHONE_STATE izni. Şu tarihten önce: Android 10, kalıcı cihaz tanımlayıcıları (IMEI/MEID, IMSI, SIM ve derleme serileri) READ_PHONE_STATE çalışma zamanında istenen izin. READ_PRIVILEGED_PHONE_STATE izni yalnızca platform anahtarıyla imzalanan uygulamalara ve ayrıcalıklı sistem uygulamalarına verilir.

Yeni izin şartlarıyla ilgili daha fazla bilgiyi şu adreste bulabilirsiniz: TelephonyManager.java için Javadoc sayfaları ve Build.java.

Bu değişiklik aşağıdaki API'leri etkiler:

  • Telefon Yöneticisi#getDeviceId
  • Telefon Yöneticisi#getImei
  • Telefon Yöneticisi#getMeid
  • Telefon Yöneticisi#getSimSerialNumber
  • Telefon Yöneticisi#getAboneKimliği
  • Derleme#getSerial

READ_PRIVILEGED_PHONE_STATE izni olmayan operatör uygulamalarına erişim

Şunlar için uygun olmayan önceden yüklenmiş operatör uygulamaları: READ_PRIVILEGED_PHONE_STATE izninin aşağıdaki tabloda yer alan seçeneklerden birini uygulayabileceğini lütfen unutmayın.

Seçenek Açıklama Sınırlamalar
UICC operatör ayrıcalıkları Android platformu, UICC'de depolanan sertifikaları yükler ve bu sertifikalarla imzalanan uygulamaların özel çağrı yapma izni yöntemlerine göz atın. Eski operatörlerin büyük ve yerleşik bir SIM nüfusu vardır. kolayca güncelleyebilirsiniz. Ayrıca, yeni sahiplik hakları SIM'ler (örneğin, MNO'lardan verilmiş SIM'lere sahip sanal mobil şebeke operatörleri) SIM'lerdeki sertifikaları güncelle.
OEM izin verilenler listesine ekleme OEM'ler, cihaz sağlamak için OP_READ_DEVICE_IDENTIFIER kullanabilir izin verilenler listesindeki operatör uygulamalarına tanımlayıcılar. Bu çözüm tüm operatörler için ölçeklenebilir değildir.
Tür tahsis kodu (TAC) Şunu kullanın: getTypeAllocationCode yönteminde kullanılan Android 10: Üretici ve modeli döndüren TAC'yi gösterir bilgisi. TAC'deki bilgiler, belirli bir cihazı tanımlamak için yeterli değil.
MSISDN Operatörler şu telefon numarasını (MSISDN) kullanabilir: PHONE izni olan TelephonyManager arka uç sistemlerinde IMEI'yi aramak için kullanabilirsiniz. Bu, operatörlere ciddi yatırımlar yapmayı gerektiriyor. Harita yapan operatörler IMSI kullanan ağ anahtarları için MSISDN'ye geçmek için teknik kaynaklara bakın.

Tüm operatör uygulamaları, güncelleme yaparak cihaz tanımlayıcılarına erişebilir şu imza sertifikası karmasına sahip CarrierConfig.xml dosyası: operatör uygulaması. Operatör uygulaması, ayrıcalıklı okumayı yapmak için bir yöntem çağırdığında kullanıyorsanız platform, uygulamanın imza sertifikasının bir eşleşmesini karma (SHA-1 veya SHA-256 imzası) içeren CarrierConfig.xml dosyası. Bir eşleşme bulunursa istenen bilgi döndürülür. Eşleşme bulunmazsa güvenlik istisnası geri döndü.

Operatörler bu çözümü uygulamak için aşağıdaki adımları uygulamalıdır:

  1. Güncelleme CarrierConfig.xml operatör uygulaması ve yama gönderin.
  2. OEM'lerden derlemelerini QPR1+ ile güncellemelerini isteyin (önerilir) VEYA gerekli platform yamaları ve yukarıdaki 1. adımda kopyaladığınız CarrierConfig.xml dosyasını güncelledi.

Uygulama

Şuna izin vermek için ayrıcalıklı izin izin verilenler listenizi güncelleyin: Ayrıcalıklı olanlar için READ_PRIVILEGED_PHONE_STATE izin cihaz tanımlayıcılarına erişim gerektiren uygulamalar.

İzin verilenler listesine ekleme hakkında daha fazla bilgi edinmek için Ayrıcalıklı İzin Verilenler Listesine Ekleme.

Etkilenen API'leri çağırmak için uygulamanın aşağıdakilerden birini karşılaması gerekir koşullar:

  • Uygulama önceden yüklenmiş ayrıcalıklı bir uygulamaysa Şurada READ_PRIVILEGED_PHONE_STATE izin beyan edildi: AndroidManifest.xml. Uygulamanın da izin verilenler listesine eklenmesi gerekir bu ayrıcalıklı izni iptal eder.
  • Google Play üzerinden teslim edilen uygulamalar operatör ayrıcalıklarına sahip olmalıdır. UICC Operatörü'nde operatör ayrıcalıkları verme hakkında daha fazla bilgi Ayrıcalıklar sayfasına gidin.
  • Bir cihaz veya profil sahibi uygulaması için READ_PHONE_STATE izni.

Bu şartlardan hiçbirini karşılamayan bir uygulama şu özelliklere sahiptir: davranış:

  • Uygulama, Q öncesini hedefliyorsa ve READ_PHONE_STATE izin verildi, SecurityException tetiklenir. Bu, söz konusu izin nedeniyle kaliteden önceki mevcut davranıştır API'leri çağırmak için gereklidir.
  • Uygulama, Q öncesini hedefliyorsa ve READ_PHONE_STATE izni verildi, Tüm TelephonyManager API'leri ve Build.UNKNOWN için null değer Build#getSerial yöntemi için.
  • Uygulama Android 10 veya sonraki sürümleri hedefliyorsa ve yeni gereksinimlerin hiçbirine gerekli olduğunda bir SecurityException alır.

Doğrulama ve test etme

Uyumluluk Test Paketi (CTS), beklenen cihaz tanımlayıcısını doğrulayan testleri içerir özellikleri, cihaz özellikleri ve özellikleri olan uygulamalar için profil sahipleri ve cihaza erişmesi beklenen uygulamalar tanımlayıcılar.

Aşağıdaki CTS testleri bu özelliğe özgüdür.

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

SSS

Belirli bir (MM, MNC) için CarrierConfig.xml içinde kaç uygulama izin verilenler listesine eklenebilir?

Diziye dahil edilen sertifika karmalarının sayısı için bir sınır yoktur.

Bir uygulamanın izin verilenler listesine eklenmesi için CarrierConfig.xml ürününde hangi CarrierConfig parametrelerini kullanmam gerekir?

Aşağıdaki üst düzey yapılandırma öğesini kullanın: Yapılandırmakta olduğunuz AOSP seçeneklerinden CarrierConfig.xml:

<string-array name="carrier_certificate_string_array" num="2">
    <item value="BF02262E5EF59FDD53E57059082F1A7914F284B"/>
    <item value="9F3868A3E1DD19A5311D511A60CF94D975A344B"/>
</string-array>

Kullanabileceğim temel bir CarrierConfig şablonu var mı?

Aşağıdaki şablonu kullanın. Bu, emin olun.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<carrier_config>
    <string-array name="carrier_certificate_string_array"
num="1">
        <item value="CERTIFICATE_HASH_HERE"/>
    </string-array>
</carrier_config>

Cihaz tanımlayıcılarına erişmek için cihazda operatörün SIM'inin olması gerekir mi?

Kullanılan CarrierConfig.xml, Şu anda takılı olan SIM. Bu, X operatörünün uygulamasının uygulaması Y operatörünün SIM'i takılıyken erişim ayrıcalıkları al, cihaz bulamaz karma için bir eşleşme bulunur ve bir güvenlik istisnası döndürür.

Çoklu SIM kart kullanılan cihazlarda, 1 numaralı operatör yalnızca SIM 1 ve ve bu böyle devam eder.

Operatörler bir uygulamanın imzalama sertifikasını karmaya nasıl dönüştürür?

İmzalama sertifikalarını CarrierConfig.xml, aşağıdakileri yapın:

  1. Aşağıdaki komut dosyasını kullanarak imza sertifikasının imzasını bir bayt dizisine dönüştürün: toByteArray değerleridir.
  2. kullan Bayt dizisini bir karmaya dönüştürmek için MessageDigest bayt[] olduğunu unutmayın.
  3. Bayt[] taki karmayı onaltılık dize biçimine dönüştürün. Örneğin, IccUtils.java adlı makaleyi inceleyin.

    List<String> certHashes = new ArrayList<>();
    PackageInfo pInfo; // Carrier app PackageInfo
    MessageDigest md =
    MessageDigest.getInstance("SHA-256");
    for (Signature signature : pInfo.signatures) {
        certHashes.add(bytesToHexString(md.digest(signature.toByteArray()));
    }
  4. certHashes, değeri olan 2 boyutunda bir diziyse (12345 ve 54321) aşağıdakini operatör yapılandırma dosyasını kullanın.

    <string-array name="carrier_certificate_string_array" num="2">
        <item value="12345"/>
        <item value="54321"/>
    </string-array>