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

يغيّر نظام التشغيل Android 10 أذونات معرّفات الأجهزة، بحيث تصبح جميع معرّفات الأجهزة محمية الآن بموجب الإذن READ_PRIVILEGED_PHONE_STATE. قبل الإصدار 10 من نظام التشغيل Android، كانت معرّفات الأجهزة الدائمة (IMEI/MEID وIMSI وشريحة SIM والرقم التسلسلي للإصدار) محمية بموجب إذن وقت التشغيل READ_PHONE_STATE. لا يتم منح إذن READ_PRIVILEGED_PHONE_STATE إلا للتطبيقات الموقَّعة باستخدام مفتاح النظام الأساسي وتطبيقات النظام ذات الامتيازات.

يمكنك الاطّلاع على مزيد من المعلومات حول متطلبات الأذونات الجديدة في صفحات Javadoc الخاصة بـ TelephonyManager.java وBuild.java.

يؤثّر هذا التغيير في واجهات برمجة التطبيقات التالية:

  • 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 جديدة (على سبيل المثال، مشغّلو شبكات الجوّال الافتراضية الذين لديهم شرائح SIM صادرة من مشغّلي شبكات الجوّال) إضافة شهادات أو تعديلها على شرائح SIM.
قائمة السماح للمصنّع الأصلي للجهاز يمكن لمصنّعي المعدات الأصلية استخدام OP_READ_DEVICE_IDENTIFIER لتوفير معرّفات الأجهزة لتطبيقات مشغّلي شبكات الجوّال المدرَجة في القائمة المسموح بها. هذا الحلّ غير قابل للتوسّع لجميع مشغّلي شبكات الجوّال.
رمز تخصيص النوع (TAC) استخدِم طريقة getTypeAllocationCode التي تم طرحها في Android 10 لعرض رمز TAC الذي يعرض معلومات الشركة المصنّعة وطراز الجهاز. المعلومات الواردة في رمز TAC غير كافية لتحديد جهاز معيّن.
رقم MSISDN يمكن لمشغّلي شبكة الجوّال استخدام رقم الهاتف (MSISDN) المتاح ضمن مجموعة أذونات TelephonyManager مع إذن PHONE للبحث عن رقم IMEI في أنظمتهم الخلفية. ويتطلّب ذلك استثمارًا كبيرًا من شركات النقل. يتطلّب التبديل إلى MSISDN من مشغّلي شبكات الجوّال الذين يربطون مفاتيح شبكاتهم باستخدام IMSI توفير موارد فنية كبيرة.

يمكن لجميع تطبيقات مشغّلي شبكات الجوّال الوصول إلى معرّفات الأجهزة من خلال تعديل ملف 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، لأنّ هذا الإذن مطلوب لاستخدام واجهات برمجة التطبيقات هذه.
  • إذا كان التطبيق يستهدف إصدارًا أقدم من Android Q وتم منح إذن READ_PHONE_STATE، سيتلقّى قيمة فارغة لجميع واجهات برمجة التطبيقات TelephonyManager والقيمة Build.UNKNOWN للطريقة Build#getSerial.
  • إذا كان التطبيق يستهدف الإصدار 10 من نظام التشغيل Android أو الإصدارات الأحدث ولا يستوفي أيًا من المتطلبات الجديدة، سيتم تلقّي 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 لتحويل مصفوفة البايت إلى قيمة تجزئة من النوع byte[].
  3. حوِّل قيمة التجزئة من byte[] إلى تنسيق سلسلة سداسية عشرية. للاطّلاع على مثال، راجِع 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>