وقتی دستگاه Android 16 (یا بالاتر) راهاندازی میشود، در حالت معاوضه قرار میگیرد که به شما امکان میدهد بااستفاده از adb به دستگاه متصل شوید و از فرمان برای دریافت اطلاعات درباره دستگاه استفاده کنید. پیششرطهای زیر باید وجود داشته باشد تا دستگاه وارد حالت مبادله شود:
- دستگاه باید بازنشانی کارخانهای شود.
- دستگاه نباید سرویس شبکه سلولی داشته باشد.
- دستگاه نباید اتصالپذیری یا حساب ایجادشده داشته باشد.
- دستگاه باید ساخت غیرقابلاشکالزدایی را اجرا کند.
حالت «معاوضه» به شما امکان میدهد اطلاعات تشخیصی پایه را پُرسمان کنید یا وارد حالت ارزیابی شوید که به شما امکان میدهد طیف کاملی از دستورات 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در Android 17 یا بالاتر وجود دارند.
شناسایی وضعیت سیستمعامل Android
برای جمعآوری اطلاعات درباره وضعیت سیستمعامل Android، مثلاً اینکه ساخت تأییدشده است یا نه، این مراحل را دنبال کنید:
- دستگاه را به ایستگاه کاری وصل کنید.
- مطمئن شوید دستگاه اتصال اینترنت داشته باشد.
از ایستگاه کاری، فرمان زیر را اجرا کنید:
adb shell tradeinmode getstatus --challenge CHALLENGECHALLENGE یک رشته الفباعددی تصادفی تولیدشده است، مثل
p4tRsuHjWB. این فرمان JSON را برمیگرداند که شامل فیلد گواهی حاوی گزارش گواهی base64 است.این فرمان اطلاعات گواهی را به اطلاعاتی که فرمان
getstatusبرمیگرداند اضافه میکند. اطلاعات گواهی بهاین شکل است:"attestation": { "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw ... }دستگاههایی که با Android 16 یا نسخههای بالاتر راهاندازی میشوند برای ایجاد گزارش گواهی به اتصال اینترنت نیاز دارند. تصدیق باید در حالت ارزیابی و پساز پیکربندی اتصال انجام شود، زیرا اگر در دستیار راهاندازی انجام شود ناموفق خواهد بود.
اطلاعات گواهی را بااستفاده از یکی از روشهای زیر تجزیه کنید:
- از ابزار
parse_tim_attestationکه هنگام ساختن AOSP ساخته میشود استفاده کنید. - از کتابخانه گواهی کلید Android استفاده کنید.
برای مثال، برای استفاده از ابزار
parse_tim_attestation، این دستور را اجرا کنید:parse_tim_attestation --challenge CHALLENGE output_fileCHALLENGE باید همان چالشی باشد که برای دریافت اطلاعات گواهی استفاده کردهاید.
اگر برونداد مرحله ۲ را در 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 جعل نشده است.توجه داشته باشید که برای انجام گواهی، هم در دستگاه و هم در میزبان، به اتصال اینترنت نیاز است.
- از ابزار
آزمایش حالت مبادله
درطول توسعه، باید دستگاهتان را آزمایش کنید تا مطمئن شوید دستگاهتان بهدرستی وارد حالت مبادله میشود و از آن خارج میشود. برای آزمایش کردن توانایی دستگاهتان در ورود و خروج از حالت معاوضه، این مراحل را دنبال کنید:
دستگاه را به ایستگاه کاری وصل کنید.
از ایستگاه کاری، دستگاه را در حالت مبادله بازراهاندازی کنید:
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 اضافی یا آزمایشهای عملکردی را روی دستگاه اجرا کنید.
پساز خروج از حالت ارزیابی، بازنشانی کارخانه انجام میشود تا مطمئن شویم هیچیک از آثار آزمایشی بهطور تصادفی به مشتریان منتقل نمیشود.
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