כשמפעילים מכשיר Android 16 (או גרסה מתקדמת יותר), הוא עובר למצב טרייד-אין, שמאפשר להתחבר למכשיר באמצעות adb ולהשתמש בפקודה כדי לקבל מידע על המכשיר. כדי שהמכשיר יעבור למצב טרייד-אין, צריכים להתקיים התנאים המוקדמים הבאים:
- צריך לאפס את המכשיר להגדרות המקוריות.
- למכשיר אסור להיות מחובר לרשת סלולרית.
- המכשיר לא יכול להיות מחובר לאינטרנט או להיות מוגדר בו חשבון.
- במכשיר חייב לפעול build שלא ניתן לניפוי באגים.
במצב טרייד-אין אפשר לשלוח שאילתות לגבי מידע אבחוני בסיסי, או להיכנס למצב הערכה, שמאפשר להריץ מגוון מלא של פקודות adb ולהריץ אבחון נוסף במכשיר.
איסוף מידע כללי על הבריאות
כדי לאסוף מידע כללי על הבריאות של המכשיר, כמו מידע על הסוללה, על תקינות האחסון ועל מספרי ה-IMEI (International Mobile Equipment Identity), צריך לבצע את השלבים הבאים:
מוודאים שהמכשיר עומד בתנאים המוקדמים למצב טרייד-אין.
מחברים את המכשיר לתחנת עבודה.
בתחנת העבודה, מריצים את הפקודה הבאה:
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" }אם
factory_reset_protectionמוגדר לערךtrue, המכשיר מאובטח ואי אפשר לאפס אותו. אם אי אפשר לאפס את המכשיר, אי אפשר להעריך אותו.
זיהוי המצב של Android OS
כדי לאסוף מידע על מצב מערכת ההפעלה Android, למשל אם זו גרסת build מאושרת, פועלים לפי השלבים הבאים:
- מחברים את המכשיר לתחנת עבודה.
- מוודאים שהמכשיר מחובר לאינטרנט.
בתחנת העבודה, מריצים את הפקודה הבאה:
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שנוצר כשמבצעים build של 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>יוצרים BroadcastReceiver דומה לזה:
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הכניסה למצב הערכה מתבצעת על ידי דילוג על אשף ההגדרה, כאילו המשתמש דילג באופן ידני על כל מסך הגדרה.
אחרי שמדלגים על אשף ההגדרה, אפשר להריץ פקודות 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