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)، این مراحل را دنبال کنید:
مطمئن شوید که دستگاه شما پیششرطهای حالت معاوضه را دارد.
دستگاه را به یک ایستگاه کاری وصل کنید.
از ایستگاه کاری، دستور زیر را اجرا کنید:
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در اندروید ۱۷ یا بالاتر وجود دارند.
شناسایی وضعیت سیستم عامل اندروید
برای جمعآوری اطلاعات در مورد وضعیت سیستم عامل اندروید، مانند اینکه آیا نسخه نهایی آن تایید شده است یا خیر، این مراحل را دنبال کنید:
- دستگاه را به یک ایستگاه کاری وصل کنید.
- مطمئن شوید که دستگاه به اینترنت متصل است.
از ایستگاه کاری، دستور زیر را اجرا کنید:
adb shell tradeinmode getstatus --challenge CHALLENGEعبارت CHALLENGE یک رشتهی الفبایی-عددی تصادفی مانند
p4tRsuHjWBاست. این دستور یک JSON شامل یک فیلد گواهی که حاوی یک رکورد گواهی base64 است را برمیگرداند.این دستور یک اطلاعات تاییدیه را به اطلاعات برگردانده شده توسط دستور
getstatusاضافه میکند. اطلاعات تاییدیه به شکل زیر است:"attestation": { "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw ... }دستگاههایی که با اندروید ۱۶ یا بالاتر راهاندازی میشوند، برای ایجاد سابقهی تأیید، نیاز به اتصال به اینترنت دارند. تأیید باید در حالت ارزیابی و پس از پیکربندی اتصال انجام شود، زیرا اگر در ویزارد راهاندازی انجام شود، با شکست مواجه میشود.
اطلاعات گواهی را با استفاده از یکی از روشهای زیر تجزیه و تحلیل کنید:
- از ابزار
parse_tim_attestationکه هنگام ساخت AOSP ساخته میشود، استفاده کنید. - از یک کتابخانه تأیید کلید اندروید استفاده کنید.
برای مثال، برای استفاده از ابزار
parse_tim_attestation، دستور زیر را اجرا کنید:parse_tim_attestation --challenge CHALLENGE output_fileCHALLENGE باید همان چالشی باشد که برای به دست آوردن اطلاعات گواهی استفاده کردهاید.
اگر خروجی مرحله ۲ را در یک 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 جعلی نیست.توجه داشته باشید که برای انجام احراز هویت، اتصال به اینترنت، هم روی دستگاه و هم روی میزبان، مورد نیاز است.
- از ابزار
حالت معاوضه را امتحان کنید
در طول توسعه، باید دستگاه خود را آزمایش کنید تا مطمئن شوید که به درستی وارد حالت معاوضه میشود و وجود دارد. برای آزمایش توانایی دستگاه خود در ورود و خروج از حالت معاوضه، این مراحل را دنبال کنید:
دستگاه را به یک ایستگاه کاری وصل کنید.
از روی کامپیوتر، دستگاه را در حالت تعویض (trade-in mode) ریبوت کنید:
adb shell tradeinmode testing startدستگاه ریبوت شده و وارد حالت معامله میشود. پس از ورود به حالت معامله، میتوانید از هر دستور
adb shell tradeinاستفاده کنید.مطمئن شوید که حالت معامله فعال است:
adb shell tradeinmode testing statusدستگاه تشخیص میدهد که حالت تست تعویض فعال است.
از حالت معامله خارج شوید و دسترسی کامل به adb را بازیابی کنید:
adb shell tradeinmode testing stop
ادغام جادوگر راه اندازی سفارشی
دستور evaluate روی دستگاههایی که دارای ویزاردهای راهاندازی سفارشی هستند کار نمیکند، مگر اینکه یک گیرنده پخش اضافه شود. برای افزودن یک گیرنده پخش به برنامه ویزارد راهاندازی سفارشی:
یک گیرنده در مانیفست برنامهها تعریف کنید:
<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>یک گیرنده پخش مشابه زیر ایجاد کنید:
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. } }
گیرنده باید اقدامات زیر را به ترتیب انجام دهد.
- بررسی کنید که
persist.adb.tradeinmode2باشد. - بررسی کنید که هیچ گونه قفل ضد سرقت یا محافظت از تنظیم مجدد کارخانه وجود نداشته باشد.
- دستگاه را آماده کنید و مطمئن شوید که
Settings.Secure.USER_SETUP_COMPLETEوSettings.Global.DEVICE_PROVISIONED1هستند. - فعالیت جادوگر راهاندازی را غیرفعال کنید تا دستگاه در صفحه اصلی باشد.
مرجع معاوضه
این بخش تمام دستورات حالت مبادله را توضیح میدهد.
ارزیابی کردن
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