الحصول على معلومات عن حالة النظام

عند تشغيل جهاز Android 16 (أو إصدار أحدث)، يتم وضعه في وضع إعادة البيع، ما يتيح لك الاتصال بالجهاز باستخدام adb واستخدام أمر للحصول على معلومات عنه. يجب استيفاء الشروط المسبقة التالية لكي يدخل الجهاز في وضع إعادة البيع:

  • يجب إعادة ضبط الجهاز على الإعدادات الأصلية.
  • يجب ألا تتوفّر خدمة شبكة الجوّال على الجهاز.
  • يجب ألا يكون الجهاز متصلاً بالإنترنت أو أن يكون حسابًا قد تم إنشاؤه عليه.
  • يجب أن يعمل الجهاز بإصدار غير قابل للتصحيح.

يتيح لك وضع إعادة البيع طلب معلومات التشخيص الأساسية أو الدخول إلى وضع التقييم، ما يتيح لك تنفيذ مجموعة كاملة من أوامر adb وإجراء عمليات تشخيص إضافية على الجهاز.

جمع معلومات عامة عن حالة الجهاز

لجمع معلومات عامة عن حالة جهازك، مثل معلومات عن البطارية وحالة التخزين وأرقام الهوية الدولية للأجهزة الجوّالة (IMEI)، اتّبِع الخطوات التالية:

  1. تأكَّد من استيفاء جهازك للشروط المسبقة لوضع إعادة البيع.

  2. وصِّل الجهاز بمحطة عمل.

  3. من محطة العمل، نفِّذ الأمر التالي:

    adb shell tradeinmode getstatus

    يعرض هذا الأمر عنصر JSON يتضمّن معلومات عن الجهاز. في ما يلي مثال على الناتج من جهاز Pixel 7:

    {
      "battery": {
        "cycle_count": 16,
        "health": 100,
        "state": 2,
        "manufacturing_date": 1653004800,
        "first_usage_date": 0
      },
      "storage": {
        "useful_lifetime_remaining": 99,
        "capacity_bytes": "128000000000"
      },
      "launch_level": 33,
      "locks": {
        "factory_reset_protection": false
      },
      "product": {
        "brand": "google",
        "device": "panther",
        "manufacturer": "Google",
        "model": "Pixel 7",
        "name": "panther"
      },
      "imeis": [
        "353644930127905",
        "353644930127913"
      ],
      "serial": "26061FDH2000AP",
      "cameras": [
        {
          "num_physical": 3,
          "lens_facing": "back"
        },
        {
          "num_physical": 2,
          "lens_facing": "front"
        }
      ],
      "uiccs": [
        {
          "eid": "89033023427100000000007982221521",
          "removable": false,
          "physical_slot_index": 0
        },
        {
          "removable": true,
          "physical_slot_index": 1
        }
      ]
    }
    

    إذا تم ضبط factory_reset_protection على true، يكون الجهاز آمنًا ولا يمكن إعادة ضبطه. إذا تعذّرت إعادة ضبط الجهاز، لا يمكن تقييمه.

    يظهر الحقلان cameras وuiccs في الإصدار 17 من Android أو الإصدارات الأحدث.

تحديد حالة نظام التشغيل Android

لجمع معلومات عن حالة نظام التشغيل Android، مثل ما إذا كان إصدارًا معتمَدًا، اتّبِع الخطوات التالية:

  1. وصِّل الجهاز بمحطة عمل.
  2. تأكَّد من أنّ الجهاز متصل بالإنترنت.
  3. من محطة العمل، نفِّذ الأمر التالي:

    adb shell tradeinmode getstatus --challenge CHALLENGE

    CHALLENGE هي سلسلة أبجدية رقمية تم إنشاؤها عشوائيًا، مثل p4tRsuHjWB. يعرض هذا الأمر ملف JSON يتضمّن حقل إثبات، يحتوي على سجلّ إثبات base64.

    يُلحق هذا الأمر معلومات الإثبات بالمعلومات التي يعرضها الأمر getstatus. تبدو معلومات الإثبات على النحو التالي:

    "attestation": {
      "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n
        EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n
        MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n
        KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw
        ...
    }
    

    تتطلّب الأجهزة التي تعمل بالإصدار 16 من Android أو الإصدارات الأحدث الاتصال بالإنترنت لإنشاء سجلّ إثبات. يجب إجراء الإثبات في وضع التقييم، بعد ضبط الاتصال، لأنّه سيتعذّر إذا تم إجراؤه في معالج الإعداد.

  4. يمكنك تحليل معلومات الإثبات باستخدام إحدى الطريقتَين التاليتَين:

    على سبيل المثال، لاستخدام أداة parse_tim_attestation ، نفِّذ ما يلي:

    parse_tim_attestation --challenge CHALLENGE output_file

    يجب أن يكون CHALLENGE هو التحدي نفسه الذي استخدمته للحصول على معلومات الإثبات.

    إذا حفظت الناتج من الخطوة 2 في output_file، يمكنك تقديم اسم الملف هذا. وإلا، تتم قراءة معلومات الإثبات من الإدخال العادي.

    يتم عرض عنصر JSON يتضمّن معلومات نظام التشغيل Android:

    "record": {
      "keymaster_version": "400",
      "keymaster_security_level": "TRUSTED_ENVIRONMENT",
      "attributes": {
        "imeis": [
          "353644930125669",
          "353644930125677"
        ],
        "vendor_patch_level": 20250305,
        "serial": "26161FDH2000NV",
        "os_version": 160000,
        "source": "hardware",
        "boot_patch_level": 20250305
      },
      "bootloader_locked": false,
      "verified_boot": false,
      "security_level": "TRUSTED_ENVIRONMENT"
    },
    "certificate": "verified",
    "trustworthy": "verified boot disabled"
    

    إذا كانت قيمة trustworthy تساوي yes، يُعتبر نظام التشغيل موثوقًا به، ويتم توقيع الإصدار ولا يتم تزوير رقم IMEI.

    يُرجى العِلم أنّه يجب الاتصال بالإنترنت لإجراء الإثبات، على الجهاز والمضيف على حد سواء.

اختبار وضع إعادة البيع

أثناء التطوير، عليك اختبار جهازك للتأكّد من أنّه يدخل إلى وضع إعادة البيع ويخرج منه بشكلٍ صحيح. اتّبِع الخطوات التالية لاختبار قدرة جهازك على الدخول إلى وضع إعادة البيع والخروج منه:

  1. وصِّل الجهاز بمحطة عمل.

  2. من محطة العمل، أعِد تشغيل الجهاز في وضع إعادة البيع:

    adb shell tradeinmode testing start

    تتم إعادة تشغيل الجهاز ويدخل في وضع إعادة البيع. بعد الدخول إلى وضع إعادة البيع، يمكنك استخدام أي أمر adb shell tradein.

  3. تأكَّد من أنّ وضع إعادة البيع نشِط:

    adb shell tradeinmode testing status

    يحدّد الجهاز أنّ اختبار وضع إعادة البيع نشِط.

  4. اخرج من وضع إعادة البيع واستعِد إمكانية الوصول الكامل إلى adb:

    adb shell tradeinmode testing stop

دمج معالج الإعداد المخصّص

لن يعمل الأمر evaluate على الأجهزة التي تتضمّن معالجات إعداد مخصّصة ما لم تتم إضافة جهاز استقبال البث. لإضافة جهاز استقبال البث إلى تطبيق معالج الإعداد المخصّص:

  1. أعلِن عن جهاز استقبال في بيان التطبيقات:

    <receiver android:name=".EnterEvaluationModeReceiver"
              android:exported="true"
              android:permission="android.permission.ENTER_TRADE_IN_MODE">
      <intent-filter>
        <action android:name="com.google.android.setupwizard.ENTER_TRADE_IN_MODE" />
        <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
    </receiver>
    
  2. أنشئ جهاز استقبال البث على النحو التالي:

    public class EnterEvaluationModeReceiver extends BroadcastReceiver {
      private static final String TRADE_IN_MODE_PROPERTY = "persist.adb.tradeinmode";
      private static final int TIM_EVALUATION_MODE = 2;
    
      @Override
      public void onReceive(Context context, Intent intent) {
        if (SystemProperties.getInt(TRADE_IN_MODE_PROPERTY, 0) != TIM_EVALUATION_MODE) {
          return;
        }
    
        // Check if any factory reset protection is enabled.
        // Provision the device.
        // End the setup wizard activity.
     }
    }
    

يجب أن ينفّذ جهاز الاستقبال الإجراءات التالية بالترتيب.

  1. تأكَّد من أنّ persist.adb.tradeinmode تساوي 2.
  2. تأكَّد من عدم توفّر أي أقفال لحماية الجهاز بعد إعادة ضبطه على الإعدادات الأصلية أو أقفال لمكافحة السرقة.
  3. اضبط الجهاز، مع التأكّد من أنّ Settings.Secure.USER_SETUP_COMPLETE وSettings.Global.DEVICE_PROVISIONED تساويان 1.
  4. ارفُض نشاط معالج الإعداد حتى يظهر الجهاز على الشاشة الرئيسية.

مرجع وضع إعادة البيع

يوضّح هذا القسم جميع أوامر وضع إعادة البيع.

evaluate

adb shell tradeinmode evaluate

يدخل إلى وضع التقييم من خلال تخطّي معالج الإعداد كما لو أنّ المستخدم قد تخطّى كل شاشة إعداد يدويًا.

بعد تخطّي معالج الإعداد، يمكنك تنفيذ أوامر ADB إضافية أو اختبارات وظيفية على الجهاز.

بعد الخروج من وضع التقييم، يتم إجراء إعادة ضبط على الإعدادات الأصلية لضمان عدم نقل أي بيانات من الاختبارات إلى أي عملاء عن طريق الخطأ.

getstatus

adb shell tradeinmode getstatus [--challenge CHALLENGE]

يعرض سلسلة JSON تتضمّن معلومات النظام، بما في ذلك معلومات عن حالة البطارية وحالة التخزين، للجهاز.

أضِف المَعلمة --challenge متبوعة بمفتاح تحدٍّ أبجدي رقمي تم إنشاؤه عشوائيًا لعرض حقل إثبات إضافي. يمكنك تحليل هذه الاستجابة لتحديد معلومات أساسية عن نظام التشغيل، مثل حالة أداة تحميل التشغيل (مقفلة أو غير مقفلة) وصلاحية الأرقام التسلسلية لأرقام IMEI.

poweroff

adb shell tradeinmode poweroff

يُوقف تشغيل الجهاز. استخدِم هذا الأمر لمنع استنزاف البطارية أثناء عدم اختبار الجهاز أو تقييمه بنشاط.

reboot

adb shell tradeinmode reboot

يُعيد تشغيل الجهاز.

testing start

adb shell tradeinmode testing start

يُعيد تشغيل الجهاز في وضع إعادة البيع. لا يعمل هذا الأمر إلا داخل معالج الإعداد. عند تنفيذ هذا الأمر، يتم تخطّي التفويض ولا تعمل إلا أوامر وضع إعادة البيع.

لا يعمل هذا الأمر إلا على الأجهزة التي تتضمّن userdebug أو eng أو user. يجب ضبط ro=debuggable=1 في إصدار user.

testing status

adb shell tradeinmode testing status

يحدّد ما إذا كان اختبار وضع إعادة البيع نشِطًا.

لا يعمل هذا الأمر إلا على الأجهزة التي تتضمّن userdebug أو eng أو user. يجب ضبط ro=debuggable=1 في إصدار user.

testing stop

adb shell tradeinmode testing stop

يُعيد الجهاز إلى الوضع الذي كان عليه قبل تنفيذ الأمر adb shell tradeinmode testing start.

لا يعمل هذا الأمر إلا على الأجهزة التي تتضمّن userdebug أو eng أو user. يجب ضبط ro=debuggable=1 في إصدار user.

testing wipe

adb shell tradeinmode testing wipe

يُعيد ضبط الجهاز على الإعدادات الأصلية.

لا يعمل هذا الأمر إلا على الأجهزة التي تتضمّن userdebug أو eng أو user. يجب ضبط ro=debuggable=1 في إصدار user.

wait-until-ready

adb shell tradeinmode wait-until-ready

ينتظر إلى أن تصبح خدمات النظام جاهزة لكي يعمل وضع إعادة البيع بشكلٍ كامل. استخدِم هذا الأمر ضمن عملية التشغيل الآلي لضمان نجاح أوامر وضع إعادة البيع.

يمكنك إضافة wait-until-ready قبل أوامر وضع إعادة البيع الأخرى. على سبيل المثال، إليك wait-until-ready مرتبطًا بـ getstatus:

adb shell tradeinmode wait-until-ready getstatus