معرفات الجهاز

يقوم 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 . إذا تم العثور على تطابق، يتم إرجاع المعلومات المطلوبة. إذا لم يتم العثور على أي تطابق، فسيتم إرجاع استثناء الأمان.

لتنفيذ هذا الحل، يجب على شركات النقل اتباع الخطوات التالية:

  1. قم بتحديث CarrierConfig.xml باستخدام تجزئة شهادة التوقيع لتطبيق الناقل وأرسل تصحيحًا .
  2. اطلب من مصنعي المعدات الأصلية تحديث نسختهم باستخدام 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 ، قم بما يلي:

  1. قم بتحويل توقيع شهادة التوقيع إلى مصفوفة بايت باستخدام toByteArray .
  2. استخدم MessageDigest لتحويل صفيف البايت إلى تجزئة بنوع البايت [] .
  3. تحويل التجزئة من البايت [] إلى تنسيق سلسلة سداسية. على سبيل المثال، راجع 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()));
    }
    
  4. إذا كانت certHashes عبارة عن مصفوفة بالحجم 2 بقيمة 12345 و 54321 ، فقم بإضافة ما يلي إلى ملف تكوين الناقل.

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