Android 10, tüm cihaz tanımlayıcılarının artık READ_PRIVILEGED_PHONE_STATE
izniyle korunmasını sağlamak için cihaz tanımlayıcıların izinlerini değiştirir. Android 10'dan önce, kalıcı cihaz tanımlayıcıları (IMEI / MEID, IMSI, SIM ve seri oluşturma) READ_PHONE_STATE
çalışma zamanı izniyle korunuyordu. READ_PRIVILEGED_PHONE_STATE
izni yalnızca platform anahtarı ve ayrıcalıklı sistem uygulamaları ile imzalanmış uygulamalara verilir.
Yeni izin gereksinimleri için daha fazla bilgi TelephonyManager.java ve Build.java için Javadoc sayfalarında bulunabilir .
Bu değişiklik aşağıdaki API'leri etkiler:
- TelephonyManager # getDeviceId
- TelephonyManager # getImei
- TelephonyManager # getMeid
- TelephonyManager # getSimSerialNumber
- TelephonyManager # getSubscriberId
- Build # getSerial
READ_PRIVILEGED_PHONE_STATE izni olmadan operatör uygulamalarına erişim
READ_PRIVILEGED_PHONE_STATE
izni için uygun olmayan önceden yüklenmiş taşıyıcı uygulamaları, aşağıdaki tablodaki seçeneklerden birini uygulayabilir.
Opsiyon | Açıklama | Sınırlamalar |
---|---|---|
UICC taşıyıcı ayrıcalıkları | Android platformu, UICC'de depolanan sertifikaları yükler ve bu sertifikalarla imzalanan uygulamalara özel yöntemlere çağrı yapmak için izin verir. | Eski operatörler, kolayca güncellenemeyen büyük, yerleşik bir SIM popülasyonuna sahiptir. Ayrıca, yeni SIM'lere yazma haklarına sahip olmayan taşıyıcılar (örneğin, MNO'lardan verilen SIM'leri olan MVNO'lar) SIM'lere sertifika ekleyemez veya bunları güncelleyemez. |
OEM beyaz listesi | OEM'ler, beyaz listedeki operatör uygulamalarına cihaz tanımlayıcıları sağlamak için OP_READ_DEVICE_IDENTIFIER kullanabilir. | Bu çözüm tüm operatörler için ölçeklenebilir değildir. |
Tip tahsis kodu (TAC) | Üretici ve model bilgilerini döndüren getTypeAllocationCode ortaya çıkarmak için Android 10'da sunulan getTypeAllocationCode yöntemini kullanın. | TAC'deki bilgiler, belirli bir cihazı tanımlamak için yetersizdir. |
MSISDN | Taşıyıcılar, arka uç sistemlerinde IMEI'yi aramak için PHONE izin grubu ile TelephonyManager altında bulunan telefon numarasını (MSISDN) kullanabilir. | Bu, taşıyıcılar için önemli bir yatırım gerektirir. IMSI kullanarak ağ anahtarlarını eşleyen taşıyıcılar, MSISDN'ye geçmek için önemli teknik kaynaklara ihtiyaç duyar. |
Tüm operatör uygulamaları, CarrierConfig.xml
dosyasını taşıyıcı uygulamasının imzalama sertifikası karmasıyla güncelleyerek cihaz tanımlayıcılarına erişebilir. Taşıyıcı uygulaması ayrıcalıklı bilgileri okumak için bir yöntemi çağırdığında, platform CarrierConfig.xml
dosyasında uygulamanın imzalama sertifikası karmasının (sertifikanın SHA-1 veya SHA-256 imzası) eşleşmesini arar. Bir eşleşme bulunursa, istenen bilgiler döndürülür. Eşleşme bulunmazsa, bir güvenlik istisnası döndürülür.
Bu çözümü uygulamak için, taşıyıcıların şu adımları izlemesi GEREKİR:
-
CarrierConfig.xml
, taşıyıcı uygulamasının imza sertifikası karmasıyla güncelleyin ve bir yama gönderin . - OEM'lerden yapılarını QPR1 + (önerilen) ile güncellemelerini veya bu gerekli platform yamalarını ve yukarıdaki 1. adımdan güncellenmiş
CarrierConfig.xml
dosyasını içeren yamayı güncellemeleriniCarrierConfig.xml
.
Uygulama
Cihaz tanımlayıcılarına erişim gerektiren ayrıcalıklı uygulamalara READ_PRIVILEGED_PHONE_STATE
izni vermek için ayrıcalıklı izin beyaz listenizi güncelleyin.
Beyaz listeye ekleme hakkında daha fazla bilgi edinmek için Ayrıcalıklı İzni Beyaz Listeye Ekleme konusuna bakın.
Etkilenen API'leri çağırmak için bir uygulamanın aşağıdaki gereksinimlerden birini karşılaması gerekir:
- Uygulama önceden yüklenmiş, ayrıcalıklı bir uygulama ise, AndroidManifest.xml'de belirtilen
READ_PRIVILEGED_PHONE_STATE
iznine ihtiyacı vardır. Uygulamanın ayrıca bu ayrıcalıklı izni beyaz listeye alması gerekir. - Google Play üzerinden sunulan uygulamaların operatör ayrıcalıklarına ihtiyacı vardır. UICC Taşıyıcı Ayrıcalıkları sayfasından taşıyıcı ayrıcalıkları verme hakkında daha fazla bilgi edinin.
-
READ_PHONE_STATE
izni verilmiş bir cihaz veya profil sahibi uygulaması.
Bu gereksinimlerin hiçbirini karşılamayan bir uygulama aşağıdaki davranışa sahiptir:
- Uygulama Q öncesi hedefliyse ve verilen
READ_PHONE_STATE
iznine sahip değilse,SecurityException
tetiklenir. Bu, bu API'leri çağırmak için bu izin gerekli olduğundan, bu mevcut Q öncesi davranıştır. - Uygulamanın öncesi Q hedefleyen ve varsa yoksa
READ_PHONE_STATE
izni verilmiş, bu TelephonyManager API'leri ve tümü için boş bir değer alırBuild.UNKNOWN
içinBuild#getSerial
yöntemiyle. - Uygulama Android 10 veya üstünü hedefliyorsa ve yeni gereksinimlerden herhangi birini karşılamıyorsa, bir SecurityException alır.
Doğrulama ve test etme
Uyumluluk Test Paketi (CTS) , operatör ayrıcalıklarına sahip uygulamalar, cihaz ve profil sahipleri ve cihaz tanımlayıcılarına erişimi olmaması beklenen uygulamalar için beklenen cihaz tanımlayıcı erişim davranışını doğrulamaya yönelik testleri içerir.
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
Sıkça Sorulan Sorular
Belirli bir (MCC, MNC) için CarrierConfig.xml
kaç uygulama beyaz listeye alınabilir?
Diziye dahil edilen sertifika karmalarının sayısında bir sınır yoktur.
Bir uygulamanın beyaz listeye alınması için CarrierConfig.xml
hangi CarrierConfig parametrelerini kullanmam gerekir?
Yapılandırmakta olduğunuz AOSP seçeneklerinden belirli CarrierConfig.xml
içindeki aşağıdaki üst düzey yapılandırma öğesini kullanın:
<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, ilgili varlığa eklenmelidir.
<?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 operatör SIM'in cihazda olması gerekir mi?
Kullanılan CarrierConfig.xml
, o anda takılı olan SIM'e göre belirlenir. Bu, taşıyıcı X'in uygulaması, taşıyıcı Y'nin SIM'i takılıyken erişim ayrıcalıkları almaya çalışırsa, cihazın karma için bir eşleşme bulamayacağı ve bir güvenlik istisnası döndürdüğü anlamına gelir.
Çoklu SIM cihazlarda, operatör # 1 yalnızca SIM # 1 için erişim ayrıcalıklarına sahiptir ve bunun tersi de geçerlidir.
Taşıyıcılar bir uygulamanın imzalama sertifikasını karmaya nasıl dönüştürür?
İmzalama sertifikalarını CarrierConfig.xml
eklemeden önce bir karmaya dönüştürmek için aşağıdakileri yapın:
- İmzalama sertifikasının imzasını
toByteArray
kullanarak bir bayt dizisinetoByteArray
. - Bayt dizisini bayt [] türünde bir karmaya dönüştürmek için
MessageDigest
kullanın. Karma değerini [] baytından onaltılık dizge biçimine dönüştürün. Bir örnek için bkz.
IccUtils.java
.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())); }
certHashes
,12345
ve54321
değerine sahip2
boyutlu bircertHashes
, taşıyıcı yapılandırma dosyasına aşağıdakileri ekleyin.<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>