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

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

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

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

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

כדי לאסוף מידע כללי על הבריאות של המכשיר, כמו מידע על הסוללה, על תקינות האחסון ועל מספרי ה-IMEI, פועלים לפי השלבים הבאים:

  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",
      "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 מאושרת, פועלים לפי השלבים הבאים:

  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.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>
    
  2. יוצרים מקלט שידורים דומה לזה:

    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

מערכת 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