يقوم Android 10 بتغيير أذونات معرفات الأجهزة بحيث أصبحت جميع معرفات الأجهزة الآن محمية بموجب إذن READ_PRIVILEGED_PHONE_STATE
. قبل إصدار Android 10، كانت معرفات الأجهزة الثابتة (IMEI/MEID وIMSI وSIM والإصدار التسلسلي) محمية بموجب إذن تشغيل READ_PHONE_STATE
. يتم منح إذن READ_PRIVILEGED_PHONE_STATE
فقط للتطبيقات الموقعة باستخدام مفتاح النظام الأساسي وتطبيقات النظام المميزة.
يمكن العثور على مزيد من المعلومات حول متطلبات الأذونات الجديدة في صفحات Javadoc الخاصة بـ TelephonyManager.java و Build.java .
يؤثر هذا التغيير على واجهات برمجة التطبيقات التالية:
- مدير الهاتف#getDeviceId
- مدير الهاتف#getImei
- مدير الهاتف#getMeid
- مدير الهاتف#getSimSerialNumber
- مدير الهاتف#getSubscriberId
- بناء # getSerial
الوصول إلى تطبيقات الناقل دون الحصول على إذن READ_PRIVILEGED_PHONE_STATE
يمكن لتطبيقات مشغل شبكة الجوال المحملة مسبقًا وغير المؤهلة للحصول على إذن READ_PRIVILEGED_PHONE_STATE
تنفيذ أحد الخيارات الواردة في الجدول أدناه.
خيار | وصف | محددات |
---|---|---|
امتيازات الناقل UICC | يقوم نظام Android الأساسي بتحميل الشهادات المخزنة على UICC ويمنح الإذن للتطبيقات الموقعة بواسطة هذه الشهادات لإجراء مكالمات إلى طرق خاصة. | تمتلك شركات الاتصالات القديمة عددًا كبيرًا من شرائح SIM الثابتة، والتي لا يمكن تحديثها بسهولة. بالإضافة إلى ذلك، لا يمكن لشركات الاتصالات التي ليس لديها حقوق تأليف لبطاقات SIM الجديدة (على سبيل المثال، مشغلو MVNO الذين لديهم بطاقات SIM صادرة من مشغلي MNO) إضافة شهادات أو تحديثها على بطاقات SIM. |
القائمة المسموح بها لتصنيع المعدات الأصلية | يمكن لمصنعي المعدات الأصلية استخدام OP_READ_DEVICE_IDENTIFIER لتوفير معرفات الأجهزة لتطبيقات مشغل شبكة الجوال المدرجة في القائمة المسموح بها. | هذا الحل غير قابل للتطوير لجميع شركات النقل. |
رمز تخصيص النوع (TAC) | استخدم طريقة getTypeAllocationCode ، المقدمة في Android 10، لكشف TAC الذي يُرجع معلومات الشركة المصنعة والطراز. | المعلومات الموجودة في TAC غير كافية لتحديد جهاز معين. |
MSISDN | يمكن لشركات الاتصالات استخدام رقم الهاتف (MSISDN)، المتوفر ضمن TelephonyManager مع مجموعة أذونات PHONE ، للبحث عن IMEI على أنظمتها الخلفية. | وهذا يتطلب استثمارات كبيرة لشركات النقل. تتطلب شركات الاتصالات التي تقوم بتعيين مفاتيح الشبكة الخاصة بها باستخدام IMSI موارد تقنية كبيرة للتبديل إلى MSISDN . |
يمكن لجميع تطبيقات شركة الجوال الوصول إلى معرفات الجهاز عن طريق تحديث ملف CarrierConfig.xml
بتجزئة شهادة التوقيع لتطبيق شركة الجوال. عندما يستدعي تطبيق شركة الاتصالات طريقة لقراءة المعلومات المميزة، يبحث النظام الأساسي عن تطابق تجزئة شهادة توقيع التطبيق (توقيع SHA-1 أو SHA-256 للشهادة) في ملف CarrierConfig.xml
. إذا تم العثور على تطابق، يتم إرجاع المعلومات المطلوبة. إذا لم يتم العثور على أي تطابق، فسيتم إرجاع استثناء الأمان.
لتنفيذ هذا الحل، يجب على شركات النقل اتباع الخطوات التالية:
- قم بتحديث
CarrierConfig.xml
باستخدام تجزئة شهادة التوقيع لتطبيق الناقل وأرسل تصحيحًا . - اطلب من مصنعي المعدات الأصلية تحديث نسختهم باستخدام QPR1+ (مستحسن) أو تصحيحات النظام الأساسي المطلوبة والتصحيح الذي يحتوي على ملف
CarrierConfig.xml
المحدث من الخطوة 1 أعلاه.
تطبيق
قم بتحديث القائمة المسموح بها للأذونات المميزة لمنح إذن READ_PRIVILEGED_PHONE_STATE
لتلك التطبيقات المميزة التي تتطلب الوصول إلى معرفات الجهاز.
لمعرفة المزيد حول القائمة المسموح بها، راجع القائمة المسموح بها للأذونات المميزة .
لاستدعاء واجهات برمجة التطبيقات المتأثرة، يجب أن يستوفي التطبيق أحد المتطلبات التالية:
- إذا كان التطبيق تطبيقًا مميزًا تم تحميله مسبقًا، فإنه يحتاج إلى إذن
READ_PRIVILEGED_PHONE_STATE
المعلن في AndroidManifest.xml. يحتاج التطبيق أيضًا إلى إدراج هذا الإذن المميز في القائمة المسموح بها. - تحتاج التطبيقات التي يتم تسليمها عبر Google Play إلى امتيازات مشغل شبكة الجوال. تعرف على المزيد حول منح امتيازات الناقل على صفحة امتيازات الناقل UICC .
- تطبيق مالك الجهاز أو الملف الشخصي الذي تم منحه إذن
READ_PHONE_STATE
.
التطبيق الذي لا يستوفي أيًا من هذه المتطلبات يكون له السلوك التالي:
- إذا كان التطبيق يستهدف مرحلة ما قبل Q ولم يكن لديه إذن
READ_PHONE_STATE
الممنوح، فسيتم تشغيلSecurityException
. هذا هو سلوك ما قبل Q الحالي حيث أن هذا الإذن مطلوب لاستدعاء واجهات برمجة التطبيقات هذه. - إذا كان التطبيق يستهدف مرحلة ما قبل Q وكان لديه إذن
READ_PHONE_STATE
، فإنه يتلقى قيمة فارغة لجميع واجهات برمجة التطبيقات TelephonyManager وBuild.UNKNOWN
للأسلوبBuild#getSerial
. - إذا كان التطبيق يستهدف نظام التشغيل 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
الأسئلة الشائعة
ما عدد التطبيقات التي يمكن إدراجها في القائمة المسموح بها في CarrierConfig.xml
لـ (MCC، MNC)؟
لا يوجد حد لعدد تجزئات الشهادة المضمنة في المصفوفة.
ما معلمات CarrierConfig في CarrierConfig.xml
التي أحتاج إلى استخدامها لإدراج التطبيق في القائمة المسموح بها؟
استخدم عنصر التكوين ذي المستوى الأعلى التالي داخل CarrierConfig.xml
المحدد من خيارات AOSP التي تقوم بتكوينها:
<string-array name="carrier_certificate_string_array" num="2"> <item value="BF02262E5EF59FDD53E57059082F1A7914F284B"/> <item value="9F3868A3E1DD19A5311D511A60CF94D975A344B"/> </string-array>
هل يوجد قالب CarrierConfig أساسي يمكنني استخدامه؟
استخدم القالب التالي. وينبغي أن يضاف هذا إلى الأصول ذات الصلة .
<?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>
هل يجب أن تكون بطاقة SIM الخاصة بشركة الاتصالات موجودة في الجهاز للوصول إلى معرفات الجهاز؟
يتم تحديد CarrierConfig.xml
المستخدم بناءً على بطاقة SIM المُدرجة حاليًا. وهذا يعني أنه إذا حاول تطبيق شركة الاتصالات X الحصول على امتيازات الوصول أثناء إدخال بطاقة SIM الخاصة بشركة الاتصالات Y، فلن يجد الجهاز تطابقًا للتجزئة وسيقوم بإرجاع استثناء أمان.
على الأجهزة متعددة شرائح SIM، يتمتع مشغل شبكة الجوال رقم 1 فقط بامتيازات الوصول لبطاقة SIM رقم 1 والعكس صحيح.
كيف تقوم شركات الاتصالات بتحويل شهادة توقيع التطبيق إلى تجزئة؟
لتحويل شهادات التوقيع إلى تجزئة قبل إضافتها إلى CarrierConfig.xml
، قم بما يلي:
- قم بتحويل توقيع شهادة التوقيع إلى مصفوفة بايت باستخدام
toByteArray
. - استخدم
MessageDigest
لتحويل صفيف البايت إلى تجزئة بنوع البايت [] . تحويل التجزئة من البايت [] إلى تنسيق سلسلة سداسية. على سبيل المثال، راجع
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
عبارة عن مصفوفة بالحجم2
بقيمة12345
و54321
، فقم بإضافة ما يلي إلى ملف تكوين الناقل.<string-array name="carrier_certificate_string_array" num="2"> <item value="12345"/> <item value="54321"/> </string-array>