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

כשמכשיר 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"
    }
    

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

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

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

  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

מעבר למצב הערכה על ידי דילוג על אשף ההגדרה, כאילו כל מסך הגדרה הודלג על ידי המשתמש באופן ידני.

אחרי שדילוגים על אשף ההגדרה, אפשר להריץ במכשיר פקודות 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 בגרסה המאוחדת user.

סטטוס הבדיקה

adb shell tradeinmode testing status

השדה הזה מציין אם הבדיקה של מצב 'החלפה תמורת זיכוי' פעילה.

הפקודה הזו פועלת רק במכשירים עם גרסאות build של userdebug,‏ eng או user. צריך להגדיר את ro=debuggable=1 בגרסה המאוחדת user.

בדיקת עצירה

adb shell tradeinmode testing stop

הפקודה מחזירה את המכשיר למצב שבו הוא היה לפני שהפעלתם את הפקודה adb shell tradeinmode testing start.

הפקודה הזו פועלת רק במכשירים עם גרסאות build של userdebug,‏ eng או user. צריך להגדיר את ro=debuggable=1 בגרסה המאוחדת user.

איפוס לצורך בדיקה

adb shell tradeinmode testing wipe

איפוס המכשיר להגדרות המקוריות.

הפקודה הזו פועלת רק במכשירים עם גרסאות build של userdebug,‏ eng או user. צריך להגדיר את ro=debuggable=1 בגרסה המאוחדת user.

wait-until-ready

adb shell tradeinmode wait-until-ready

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

אפשר להוסיף את wait-until-ready לפני פקודות אחרות במצב 'טרייד אין'. לדוגמה, כאן wait-until-ready מקושר ל-getstatus:

adb shell tradeinmode wait-until-ready getstatus