כשמכשיר עם Android 16 (או גרסה מתקדמת יותר) מופעל, הוא עובר למצב טרייד-אין, שמאפשר להתחבר למכשיר באמצעות adb ולהשתמש בפקודה כדי לקבל מידע על המכשיר. כדי שהמכשיר ייכנס למצב טרייד-אין, צריכים להתקיים התנאים המוקדמים הבאים:
- צריך לאפס את המכשיר להגדרות המקוריות.
- למכשיר אסור להיות מחובר לשירות סלולרי.
- המכשיר לא יכול להיות מחובר או להיות בעל חשבון.
- במכשיר חייב לפעול build שלא ניתן לניפוי באגים.
במצב טרייד-אין אפשר לשלוח שאילתות לגבי מידע בסיסי לצורך אבחון, או להיכנס למצב הערכה, שמאפשר להריץ מגוון מלא של פקודות 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 OS
כדי לאסוף מידע על מצב מערכת ההפעלה Android, למשל אם זו גרסת build מאושרת, פועלים לפי השלבים הבאים:
- מחברים את המכשיר לתחנת עבודה.
- מוודאים שהמכשיר מחובר לאינטרנט.
בתחנת העבודה, מריצים את הפקודה הבאה:
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 ואילך, נדרש חיבור לאינטרנט כדי ליצור רשומה של אימות. צריך לבצע אימות במצב בדיקה, אחרי שמגדירים חיבור, כי אם מבצעים אותו באשף ההגדרה הוא נכשל.
מנתחים את פרטי האישור באמצעות אחת מהשיטות הבאות:
- משתמשים בכלי
parse_tim_attestationשנבנה כשבונים את AOSP. - משתמשים בספריית אימות מפתחות של Android.
לדוגמה, כדי להשתמש בכלי
parse_tim_attestation, מריצים את הפקודה:parse_tim_attestation --challenge CHALLENGE output_fileה-CHALLENGE צריך להיות אותו אתגר שבו השתמשתם כדי לקבל את פרטי האימות.
אם שמרתם את הפלט של שלב 2 ב-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.tradeinmodeהוא2. - בודקים שאין הגנה למכשיר אחרי איפוס או נעילות נגד גניבה.
- מקצים הרשאות למכשיר ומוודאים ש
Settings.Secure.USER_SETUP_COMPLETEו-Settings.Global.DEVICE_PROVISIONEDהם1. - סוגרים את הפעילות של אשף ההגדרה כדי שהמכשיר יחזור למסך הבית.
מידע על מצב טרייד-אין
בקטע הזה מוסברות כל הפקודות של מצב הטרייד-אין.
להעריך
adb shell tradeinmode evaluateמערכת Analytics עוברת למצב הערכה על ידי דילוג על אשף ההגדרה, כאילו המשתמש דילג ידנית על כל מסך הגדרה.
אחרי שמדלגים על אשף ההגדרה, אפשר להריץ פקודות ADB נוספות או בדיקות פונקציונליות במכשיר.
אחרי שיוצאים ממצב הערכה, מתבצע איפוס להגדרות המקוריות כדי לוודא שאף ארטיפקט מהבדיקה לא מועבר בטעות ללקוחות.
getstatus
adb shell tradeinmode getstatus [--challenge CHALLENGE]מחזירה מחרוזת JSON עם פרטי המערכת, כולל מידע על תקינות הסוללה והאחסון של המכשיר.
כדי להחזיר שדה אימות נוסף, צריך לכלול את הפרמטר --challenge ואחריו מפתח אתגר אלפאנומרי שנוצר באופן אקראי. תנתח את התגובה הזו כדי לזהות מידע מרכזי על מערכת ההפעלה, כמו הסטטוס של טוען האתחול (נעול או לא נעול) והתוקף של מספרי ה-IMEI.
poweroff
adb shell tradeinmode poweroffהמכשיר יכובה. משתמשים בפקודה הזו כדי למנוע התרוקנות הסוללה בזמן שהמכשיר לא נבדק או מוערך באופן פעיל.
הפעל מחדש
adb shell tradeinmode rebootמפעיל מחדש את המכשיר.
התחלת הבדיקה
adb shell tradeinmode testing startהמכשיר יופעל מחדש במצב טרייד-אין. הפקודה הזו פועלת רק באשף ההגדרה. אחרי שמפעילים את הפקודה הזו, המערכת מדלגת על ההרשאה ורק פקודות של מצב טרייד-אין פועלות.
הפקודה הזו פועלת רק במכשירים עם גרסאות build של userdebug, eng או user. צריך להגדיר את ro=debuggable=1 בגרסת ה-build של user.
סטטוס הבדיקה
adb shell tradeinmode testing statusמציין אם בדיקת מצב הטרייד-אין פעילה.
הפקודה הזו פועלת רק במכשירים עם גרסאות build של userdebug, eng או user. צריך להגדיר את ro=debuggable=1 בגרסת ה-build של user.
הפסקת הבדיקה
adb shell tradeinmode testing stopהפקודה מחזירה את המכשיר למצב שבו הוא היה לפני שהוצאה הפקודה adb shell tradeinmode testing start.
הפקודה הזו פועלת רק במכשירים עם גרסאות build של userdebug, eng או user. צריך להגדיר את ro=debuggable=1 בגרסת ה-build של user.
מחיקה לצורך בדיקה
adb shell tradeinmode testing wipeהמכשיר יאופס להגדרות המקוריות.
הפקודה הזו פועלת רק במכשירים עם גרסאות build של userdebug, eng או user. צריך להגדיר את ro=debuggable=1 בגרסת ה-build של user.
wait-until-ready
adb shell tradeinmode wait-until-readyההמתנה היא עד ששירותי המערכת יהיו מוכנים, כדי שמצב הטרייד-אין יוכל לפעול באופן מלא. כדי לוודא שהפקודות של מצב הטרייד-אין יפעלו בהצלחה, צריך להשתמש בפקודה הזו באוטומציה.
אפשר להוסיף wait-until-ready לפני פקודות אחרות של מצב טרייד-אין. לדוגמה, wait-until-ready משורשר ל-getstatus:
adb shell tradeinmode wait-until-ready getstatus