اطلاعات سلامت سیستم را بدست آورید

When an Android 16 (or higher) device boots, it's put in trade-in mode , which lets you connect to the device using adb and use a command to obtain information about the device. The following preconditions must exist for the device to enter trade-in mode:

  • دستگاه باید به تنظیمات کارخانه برگردانده شود.
  • دستگاه نباید سرویس تلفن همراه داشته باشد.
  • دستگاه نباید اتصال داشته باشد یا حسابی ایجاد شده باشد.
  • دستگاه باید یک نسخه غیر قابل اشکال‌زدایی (nondebuggable) را اجرا کند.

حالت معاوضه به شما امکان می‌دهد اطلاعات تشخیصی اولیه را جستجو کنید، یا وارد حالت ارزیابی شوید، که به شما امکان می‌دهد طیف کاملی از دستورات 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 در اندروید ۱۷ یا بالاتر وجود دارند.

شناسایی وضعیت سیستم عامل اندروید

برای جمع‌آوری اطلاعات در مورد وضعیت سیستم عامل اندروید، مانند اینکه آیا نسخه نهایی آن تایید شده است یا خیر، این مراحل را دنبال کنید:

  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
        ...
    }
    

    دستگاه‌هایی که با اندروید ۱۶ یا بالاتر راه‌اندازی می‌شوند، برای ایجاد سابقه‌ی تأیید، نیاز به اتصال به اینترنت دارند. تأیید باید در حالت ارزیابی و پس از پیکربندی اتصال انجام شود، زیرا اگر در ویزارد راه‌اندازی انجام شود، با شکست مواجه می‌شود.

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

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

    parse_tim_attestation --challenge CHALLENGE output_file

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

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

    یک شیء JSON با اطلاعات سیستم عامل اندروید بازگردانده می‌شود:

    "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. از روی کامپیوتر، دستگاه را در حالت تعویض (trade-in mode) ریبوت کنید:

    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 اضافی یا آزمایش‌های عملکردی را روی دستگاه اجرا کنید.

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

وضعیت را دریافت کنید

adb shell tradeinmode getstatus [--challenge CHALLENGE]

یک رشته JSON حاوی اطلاعات سیستم، شامل اطلاعات مربوط به باتری و سلامت حافظه، برای دستگاه برمی‌گرداند.

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

خاموش کردن

adb shell tradeinmode poweroff

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

راه اندازی مجدد

adb shell tradeinmode reboot

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

شروع آزمایش

adb shell tradeinmode testing start

دستگاه را در حالت تعویض دستگاه (trade-in mode) ریبوت می‌کند. این دستور فقط در ویزارد راه‌اندازی (setup wizard) کار می‌کند. با صدور این دستور، مجوزها نادیده گرفته می‌شوند و فقط دستورات حالت تعویض دستگاه (trade-in mode) کار می‌کنند.

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

وضعیت آزمایش

adb shell tradeinmode testing status

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

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

توقف آزمایش

adb shell tradeinmode testing stop

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

This command works only on devices with userdebug , eng , or user builds. The user build must have ro=debuggable=1 set.

تست پاک کردن

adb shell tradeinmode testing wipe

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

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

صبر کردن تا آماده شدن

adb shell tradeinmode wait-until-ready

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

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

adb shell tradeinmode wait-until-ready getstatus