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

يغيّر Android 10 أذونات معرّفات الأجهزة بحيث تصبح جميع معرّفات الأجهزة محمية الآن من خلال إذن READ_PRIVILEGED_PHONE_STATE. قبل الإصدار Android 10، كانت معرّفات الأجهزة الدائمة (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 في أنظمة الخلفية الخاصة بهم. ويتطلّب ذلك استثمارًا كبيرًا من شركات النقل. يتطلّب مشغّلو شبكات الجوّال الذين يربطون مفاتيح شبكاتهم باستخدام معرّف المشترك الدولي في شبكة الجوّال (IMSI) موارد فنية كبيرة للتبديل إلى رقم نظام خدمات الهاتف الجوّال المتكامل (MSISDN).

يمكن لجميع تطبيقات مشغّلي شبكات الجوّال الوصول إلى معرّفات الأجهزة من خلال تعديل ملف CarrierConfig.xml باستخدام تجزئة شهادة التوقيع الخاصة ب تطبيق مشغّل شبكة الجوّال. وعندما يستدعي تطبيق مشغّل شبكة الجوّال طريقة لقراءة المعلومات ذات الامتيازات، تبحث المنصة عن تطابق بين تجزئة شهادة التوقيع الخاصة بالتطبيق (توقيع SHA-1 أو SHA-256 للشهادة) في ملف CarrierConfig.xml. في حال العثور على مطابقة، يتم عرض المعلومات المطلوبة. في حال عدم العثور على أي تطابق، يتم عرض استثناء أمان.

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

  1. عدِّل CarrierConfig.xml باستخدام تجزئة شهادة التوقيع لتطبيق مشغّل شبكة الجوّال و أرسِل رمز تصحيح.
  2. اطلب من الشركات المصنّعة للأجهزة الأصلية تحديث الإصدار باستخدام QPR-1 أو إصدار أحدث (يُنصح بذلك) أو تصحيحات النظام الأساسي المطلوبة والتصحيح الذي يحتوي على ملف 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>