אחזור מידע על בריאות המערכת

כשמפעילים מכשיר Android 16 (או גרסה מתקדמת יותר), הוא עובר למצב טרייד-אין, שמאפשר להתחבר למכשיר באמצעות adb ולהשתמש בפקודה כדי לקבל מידע על המכשיר. כדי שהמכשיר יעבור למצב טרייד-אין, צריכים להתקיים התנאים המוקדמים הבאים:

  • צריך לאפס את המכשיר להגדרות המקוריות.
  • למכשיר אסור להיות מחובר לרשת סלולרית.
  • המכשיר לא יכול להיות מחובר לאינטרנט או להיות מוגדר בו חשבון.
  • במכשיר חייב לפעול build שלא ניתן לניפוי באגים.

במצב טרייד-אין אפשר לשלוח שאילתות לגבי מידע אבחוני בסיסי, או להיכנס למצב הערכה, שמאפשר להריץ מגוון מלא של פקודות adb ולהריץ אבחון נוסף במכשיר.

איסוף מידע כללי על הבריאות

כדי לאסוף מידע כללי על הבריאות של המכשיר, כמו מידע על הסוללה, על תקינות האחסון ועל מספרי ה-IMEI‏ (International Mobile Equipment Identity), צריך לבצע את השלבים הבאים:

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

    אם factory_reset_protection מוגדר לערך true, המכשיר מאובטח ואי אפשר לאפס אותו. אם אי אפשר לאפס את המכשיר, אי אפשר להעריך אותו.

זיהוי המצב של Android OS

כדי לאסוף מידע על מצב מערכת ההפעלה Android, למשל אם זו גרסת build מאושרת, פועלים לפי השלבים הבאים:

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

    במכשירים שמותקנת בהם מערכת ההפעלה Android בגרסה 16 ואילך, נדרש חיבור לאינטרנט כדי ליצור רשומה של אימות. צריך לבצע אימות במצב בדיקה, אחרי שמגדירים חיבור, כי אם מבצעים אותו באשף ההגדרה הוא נכשל.

  4. מנתחים את פרטי האישור באמצעות אחת מהשיטות הבאות:

    לדוגמה, כדי להשתמש בכלי 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 לא מזויף.

    שימו לב שנדרש חיבור לאינטרנט כדי לבצע אימות, גם במכשיר וגם במארח.

בדיקת מצב טרייד-אין

במהלך הפיתוח, צריך לבדוק את המכשיר כדי לוודא שהוא נכנס למצב טרייד-אין ויוצא ממנו בצורה תקינה. כדי לבדוק אם אפשר להעביר את המכשיר למצב טרייד-אין ולצאת ממנו, פועלים לפי השלבים הבאים:

  1. מחברים את המכשיר לתחנת עבודה.

  2. מפעילים מחדש את המכשיר בתחנת העבודה במצב טרייד-אין:

    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.permis>sio<n.ENTER_TRADE>_IN_M<ODE"
      intent-filter
        action android:name="com.google.android>.setu<pwizard.ENTER_TRADE_IN_MODE" /
        category android:>nam<e="androi>d<.intent.c>ategory.DEFAULT" /
      /intent-filter
    /receiver
    
  2. יוצרים 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.
     }
    }
    

המקבל צריך לבצע את הפעולות הבאות לפי הסדר.

  1. בודקים ש-persist.adb.tradeinmode הוא 2.
  2. בודקים שאין הגנה מפני איפוס להגדרות המקוריות או נעילות נגד גניבה.
  3. מקצים את המכשיר ומוודאים שSettings.Secure.USER_SETUP_COMPLETE ו-Settings.Global.DEVICE_PROVISIONED הם 1.
  4. סוגרים את הפעילות של אשף ההגדרה כדי שהמכשיר יחזור למסך הבית.

מידע על מצב טרייד-אין

בקטע הזה מוסברות כל הפקודות של מצב הטרייד-אין.

הערכה

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