Thu thập thông tin về tình trạng hệ thống

Khi khởi động, thiết bị Android 16 (trở lên) sẽ được đưa vào chế độ bán đổi. Chế độ này cho phép bạn kết nối với thiết bị bằng adb và sử dụng lệnh để lấy thông tin về thiết bị. Thiết bị phải đáp ứng các điều kiện tiên quyết sau đây thì mới có thể chuyển sang chế độ đổi cũ lấy mới:

  • Bạn phải đặt lại thiết bị về trạng thái ban đầu.
  • Thiết bị không được có dịch vụ di động.
  • Thiết bị không được có kết nối hoặc tài khoản đã được thiết lập.
  • Thiết bị phải đang chạy một bản dựng không thể gỡ lỗi.

Sau khi bạn điều hướng qua trình hướng dẫn thiết lập, thiết bị sẽ được đặt ở chế độ đánh giá, cho phép bạn thực hiện đầy đủ các lệnh adb và chạy các quy trình chẩn đoán bổ sung trên thiết bị.

Thu thập thông tin chung về sức khoẻ

Để thu thập thông tin chung về tình trạng của thiết bị, chẳng hạn như thông tin về pin, tình trạng bộ nhớ và số nhận dạng thiết bị di động quốc tế (IMEI), hãy làm theo các bước sau:

  1. Đảm bảo thiết bị của bạn đáp ứng các điều kiện tiên quyết để sử dụng chế độ đổi trả.

  2. Cắm thiết bị vào máy trạm.

  3. Trên máy trạm, hãy chạy lệnh sau:

    adb shell tradeinmode getstatus

    Lệnh này trả về một đối tượng JSON chứa thông tin về thiết bị. Sau đây là ví dụ về kết quả từ 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"
    }
    

    Nếu factory_reset_protection được đặt thành true, thiết bị sẽ an toàn và không thể đặt lại. Nếu không thể đặt lại thiết bị, thì bạn sẽ không thể đánh giá thiết bị đó.

Xác định trạng thái của hệ điều hành Android

Để thu thập thông tin về trạng thái của hệ điều hành Android, chẳng hạn như liệu đó có phải là bản dựng đã được phê duyệt hay không, hãy làm theo các bước sau:

  1. Cắm thiết bị vào máy trạm.
  2. Đảm bảo thiết bị có kết nối Internet.
  3. Trên máy trạm, hãy chạy lệnh sau:

    adb shell tradeinmode getstatus --challenge CHALLENGE

    CHALLENGE là một chuỗi chữ và số được tạo ngẫu nhiên, chẳng hạn như p4tRsuHjWB. Lệnh này trả về JSON bao gồm một trường chứng thực chứa bản ghi chứng thực base64.

    Lệnh này sẽ thêm thông tin chứng thực vào thông tin do lệnh getstatus trả về. Thông tin chứng thực có dạng như sau:

    "attestation": {
      "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n
        EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n
        MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n
        KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw
        ...
    }
    

    Thiết bị chạy Android 16 trở lên cần có kết nối Internet để tạo bản ghi chứng thực. Bạn nên thực hiện quy trình chứng thực ở chế độ đánh giá, sau khi định cấu hình kết nối, vì quy trình này sẽ không thành công nếu được thực hiện trong trình hướng dẫn thiết lập.

  4. Phân tích cú pháp thông tin chứng thực bằng một trong các phương thức sau:

    Ví dụ: để sử dụng công cụ parse_tim_attestation, hãy chạy:

    parse_tim_attestation --challenge CHALLENGE output_file

    CHALLENGE phải là cùng một thử thách mà bạn đã sử dụng để lấy thông tin chứng thực.

    Nếu đã lưu kết quả của bước 2 vào output_file, bạn có thể cung cấp tên tệp đó. Nếu không, thông tin chứng thực sẽ được đọc từ stdin.

    Một đối tượng JSON chứa thông tin về hệ điều hành Android sẽ được trả về:

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

    Nếu trustworthy bằng yes, thì hệ điều hành được coi là đáng tin cậy; bản dựng được ký và IMEI không bị giả mạo.

    Xin lưu ý rằng bạn cần có kết nối Internet để thực hiện chứng thực, cả trên thiết bị và trên máy chủ.

Kiểm thử chế độ đổi cũ lấy mới

Trong quá trình phát triển, bạn nên kiểm thử thiết bị để đảm bảo rằng thiết bị của bạn vào và thoát chế độ bán đổi đúng cách. Hãy làm theo các bước sau để kiểm tra khả năng thiết bị của bạn chuyển sang và thoát khỏi chế độ bán đổi:

  1. Cắm thiết bị vào máy trạm.

  2. Trên máy trạm, hãy khởi động lại thiết bị sang chế độ đổi trả:

    adb shell tradeinmode testing start

    Thiết bị sẽ khởi động lại và chuyển sang chế độ đổi cũ lấy mới. Sau khi chuyển sang chế độ mua đổi, bạn có thể sử dụng bất kỳ lệnh adb shell tradein nào.

  3. Đảm bảo chế độ đổi trả đang hoạt động:

    adb shell tradeinmode testing status

    Thiết bị xác định rằng quy trình kiểm thử chế độ bán đổi đang hoạt động.

  4. Thoát chế độ đổi cũ lấy mới và khôi phục quyền truy cập đầy đủ vào adb:

    adb shell tradeinmode testing stop

Tích hợp trình hướng dẫn thiết lập tuỳ chỉnh

Lệnh evaluate sẽ không hoạt động trên các thiết bị có trình hướng dẫn thiết lập tuỳ chỉnh, trừ phi bạn thêm một broadcast receiver. Cách thêm broadcast receiver vào ứng dụng trình hướng dẫn thiết lập tuỳ chỉnh:

  1. Khai báo trình nhận trong tệp kê khai ứng dụng:

    <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. Tạo broadcast receiver tương tự như:

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

Trình nhận phải thực hiện các thao tác sau theo thứ tự.

  1. Kiểm tra để đảm bảo rằng persist.adb.tradeinmode2.
  2. Kiểm tra để đảm bảo không có tính năng bảo vệ khi đặt lại về trạng thái ban đầu hoặc khoá chống trộm.
  3. Cấp phép thiết bị, đảm bảo rằng Settings.Secure.USER_SETUP_COMPLETESettings.Global.DEVICE_PROVISIONED1.
  4. Đóng hoạt động của trình hướng dẫn thiết lập để thiết bị chuyển đến màn hình chính.

Tài liệu tham khảo về chế độ đổi cũ lấy mới

Phần này giải thích tất cả các lệnh ở chế độ bán đổi.

đánh giá

adb shell tradeinmode evaluate

Chuyển sang chế độ đánh giá bằng cách bỏ qua trình hướng dẫn thiết lập như thể người dùng đã bỏ qua mọi màn hình thiết lập theo cách thủ công.

Sau khi bỏ qua trình hướng dẫn thiết lập, bạn có thể chạy thêm các lệnh ADB hoặc kiểm thử chức năng trên thiết bị.

Sau khi bạn rời khỏi chế độ đánh giá, quá trình đặt lại về trạng thái ban đầu sẽ diễn ra để đảm bảo rằng không có cấu phần phần mềm nào từ quá trình kiểm thử bị vô tình chuyển sang bất kỳ khách hàng nào.

getstatus

adb shell tradeinmode getstatus [--challenge CHALLENGE]

Trả về một chuỗi JSON chứa thông tin hệ thống, bao gồm cả thông tin về tình trạng pin và bộ nhớ cho thiết bị.

Thêm tham số --challenge, theo sau là khoá thử thách gồm chữ và số được tạo ngẫu nhiên để trả về một trường chứng thực bổ sung. Phân tích cú pháp phản hồi này để xác định thông tin chính về hệ điều hành, chẳng hạn như trạng thái của trình tải khởi động (đã khoá hoặc chưa khoá) và tính hợp lệ của số sê-ri IMEI.

tắt nguồn

adb shell tradeinmode poweroff

Tắt nguồn thiết bị. Sử dụng lệnh này để ngăn pin bị tiêu hao trong khi thiết bị không được kiểm thử hoặc đánh giá tích cực.

khởi động lại

adb shell tradeinmode reboot

Khởi động lại thiết bị.

bắt đầu kiểm thử

adb shell tradeinmode testing start

Khởi động lại thiết bị ở chế độ đổi cũ lấy mới. Lệnh này chỉ hoạt động trong trình hướng dẫn thiết lập. Khi bạn đưa ra lệnh này, quá trình uỷ quyền sẽ bị bỏ qua và chỉ các lệnh ở chế độ bán đổi mới hoạt động.

Lệnh này chỉ hoạt động trên các thiết bị có bản dựng userdebug, eng hoặc user. Bản dựng user phải được đặt ro=debuggable=1.

trạng thái thử nghiệm

adb shell tradeinmode testing status

Xác định xem chế độ thử nghiệm bán đổi có đang hoạt động hay không.

Lệnh này chỉ hoạt động trên các thiết bị có bản dựng userdebug, eng hoặc user. Bản dựng user phải được đặt ro=debuggable=1.

điểm dừng thử nghiệm

adb shell tradeinmode testing stop

Đưa thiết bị về chế độ bất kỳ trước khi bạn đưa ra lệnh adb shell tradeinmode testing start.

Lệnh này chỉ hoạt động trên các thiết bị có bản dựng userdebug, eng hoặc user. Bản dựng user phải được đặt ro=debuggable=1.

xoá sạch kiểm thử

adb shell tradeinmode testing wipe

Đặt lại thiết bị về trạng thái ban đầu.

Lệnh này chỉ hoạt động trên các thiết bị có bản dựng userdebug, eng hoặc user. Bản dựng user phải được đặt ro=debuggable=1.

wait-until-ready

adb shell tradeinmode wait-until-ready

Chờ cho đến khi các dịch vụ hệ thống sẵn sàng để chế độ đổi máy có thể hoạt động đầy đủ. Hãy sử dụng lệnh này trong quy trình tự động hoá để đảm bảo các lệnh ở chế độ đổi xe thành công.

Bạn có thể thêm wait-until-ready trước các lệnh khác ở chế độ bán đổi. Ví dụ: sau đây là wait-until-ready được liên kết với getstatus:

adb shell tradeinmode wait-until-ready getstatus