دریافت اطلاعات سلامت سیستم

وقتی دستگاه 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 در Android 17 یا بالاتر وجود دارند.

شناسایی وضعیت سیستم‌عامل 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
        ...
    }
    

    دستگاه‌هایی که با Android 16 یا نسخه‌های بالاتر راه‌اندازی می‌شوند برای ایجاد گزارش گواهی به اتصال اینترنت نیاز دارند. تصدیق باید در حالت ارزیابی و پس‌از پیکربندی اتصال انجام شود، زیرا اگر در دستیار راه‌اندازی انجام شود ناموفق خواهد بود.

  4. اطلاعات گواهی را بااستفاده از یکی از روش‌های زیر تجزیه کنید:

    برای مثال، برای استفاده از ابزار parse_tim_attestation، این دستور را اجرا کنید:

    parse_tim_attestation --challenge CHALLENGE output_file

    ‫CHALLENGE باید همان چالشی باشد که برای دریافت اطلاعات گواهی استفاده کرده‌اید.

    اگر برونداد مرحله ۲ را در output_file ذخیره کرده‌اید، می‌توانید آن نام فایل را ارائه دهید. درغیراین‌صورت، اطلاعات گواهی از stdin خوانده می‌شود.

    یک شیء 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. فعالیت دستیار راه‌اندازی را ببندید تا دستگاه در صفحه اصلی قرار گیرد.

مرجع حالت مبادله

این بخش همه فرمان‌های حالت مبادله را توضیح می‌دهد.

ارزیابی کردن

adb shell tradeinmode evaluate

با رد کردن دستیار راه‌اندازی، وارد حالت ارزیابی می‌شود، انگار کاربر همه صفحه‌های راه‌اندازی را به‌صورت دستی رد کرده است.

پس‌از رد کردن دستیار راه‌اندازی، می‌توانید دستورات ADB اضافی یا آزمایش‌های عملکردی را روی دستگاه اجرا کنید.

پس‌از خروج از حالت ارزیابی، بازنشانی کارخانه انجام می‌شود تا مطمئن شویم هیچ‌یک از آثار آزمایشی به‌طور تصادفی به مشتریان منتقل نمی‌شود.

getstatus

adb shell tradeinmode getstatus [--challenge CHALLENGE]

رشته JSON را با اطلاعات سیستم، ازجمله اطلاعات سلامت باتری و فضای ذخیره‌سازی، برای دستگاه برمی‌گرداند.

پارامتر --challenge را به‌همراه کلید چالش الفبانمایی که به‌طور تصادفی تولید شده است اضافه کنید تا فیلد گواهی دیگری برگردانده شود. این پاسخ را تجزیه کنید تا اطلاعات کلیدی سیستم‌عامل، مثل وضعیت راه‌انداز سیستم (قفل یا باز) و اعتبار شماره سریال IMEI را شناسایی کنید.

خاموش کردن

adb shell tradeinmode poweroff

دستگاه را خاموش می‌کند. از این فرمان برای جلوگیری از خالی شدن باتری درحالی‌که دستگاه به‌طور فعال آزمایش یا ارزیابی نمی‌شود استفاده کنید.

بازراه‌اندازی

adb shell tradeinmode reboot

دستگاه را بازراه‌اندازی می‌کند.

شروع آزمایش

adb shell tradeinmode testing start

دستگاه را در حالت تعویض بازراه‌اندازی می‌کند. این فرمان فقط در دستیار راه‌اندازی کار می‌کند. پس‌از صدور این فرمان، مجوز دور زده می‌شود و فقط فرمان‌های حالت معاوضه کار می‌کند.

این فرمان فقط در دستگاه‌های دارای ساختار userdebug،‏ eng، یا user کار می‌کند. ساختمان user باید ro=debuggable=1 تنظیم شده داشته باشد.

وضعیت آزمایش

adb shell tradeinmode testing status

مشخص می‌کند که آیا آزمایش حالت معاوضه فعال است یا نه.

این فرمان فقط در دستگاه‌های دارای ساختار userdebug،‏ eng، یا user کار می‌کند. ساختمان user باید ro=debuggable=1 تنظیم شده داشته باشد.

توقف آزمایش

adb shell tradeinmode testing stop

دستگاه را به هر حالتی که قبل‌از صدور فرمان adb shell tradeinmode testing start در آن بوده است برمی‌گرداند.

این فرمان فقط در دستگاه‌های دارای ساختار userdebug،‏ eng، یا user کار می‌کند. ساختمان user باید ro=debuggable=1 تنظیم شده داشته باشد.

آزمایش محو کردن

adb shell tradeinmode testing wipe

دستگاه را بازنشانی کارخانه‌ای می‌کند.

این فرمان فقط در دستگاه‌های دارای ساخت‌های userdebug،‏ eng، یا user کار می‌کند. ساخت user باید ro=debuggable=1 را تنظیم کرده باشد.

انتظار تا آماده شدن

adb shell tradeinmode wait-until-ready

منتظر می‌ماند تا خدمات سیستم آماده شود تا حالت معاوضه بتواند به‌طور کامل عمل کند. از این فرمان در خودکارسازی‌تان استفاده کنید تا مطمئن شوید فرمان‌های حالت معاوضه موفقیت‌آمیز هستند.

می‌توانید wait-until-ready را قبل‌از دستورات دیگر حالت مبادله اضافه کنید. برای مثال، در اینجا wait-until-ready به getstatus زنجیر شده است:

adb shell tradeinmode wait-until-ready getstatus