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ẽ chuyển sang chế độ thu mua. Chế độ này cho phép bạn kết nối với thiết bị bằng adb và dùng một 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 để 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 đã thiết lập.
  • Thiết bị phải đang chạy một bản dựng không thể gỡ lỗi.

Chế độ đổi cũ lấy mới cho phép bạn truy vấn thông tin chẩn đoán cơ bản hoặc chuyển sang chế độ đánh giá. Chế độ này 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 sức khoẻ chung cho thiết bị của bạn, 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 để chuyển dữ liệu ở chế độ đổi cũ lấy mới.

  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ề đầu ra 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 bạn đặt factory_reset_protection thành true, thì thiết bị sẽ được bảo mật và không thể đặt lại. Nếu không đặt lại được, thì 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 dạng 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 chứng thực ở chế độ đánh giá, sau khi định cấu hình một kết nối, vì chứng thực 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à chính thử thách mà bạn đã dùng để lấy thông tin chứng thực.

    Nếu đã lưu đầu ra của bước 2 vào một 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ủ.

Chế độ kiểm thử đổ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 thiết bị vào và thoát khỏi chế độ thu cũ đổi mới đúng cách. Làm theo các bước sau để kiểm tra khả năng vào và thoát khỏi chế độ thu cũ đổi mới của thiết bị:

  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ị ở chế độ thu mua:

    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ế độ đổi trả một phần, bạn có thể 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 chế độ kiểm thử chuyển đổi có hỗ trợ thu cũ đang hoạt động.

  4. Thoát chế độ đổi cũ lấy mới và khôi phục toàn quyền truy cập 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 bộ nhận tín hiệu truyền tin. 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 một trình nhận trong tệp kê khai ứng dụng:

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

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

Người 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ó chế độ bảo vệ khi đặt lại về trạng thái ban đầu hoặc khoá chống trộm.
  3. Cung cấp dữ liệu cho 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ị ở 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ế độ đổi cũ lấy mớ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 các lệnh ADB bổ sung hoặc kiểm thử chức năng trên thiết bị.

Sau khi bạn thoát khỏi chế độ đánh giá, hệ thống sẽ khôi phục cài đặt gốc để đảm bảo không có hiện vật nào từ quá trình kiểm thử vô tình được chuyển cho khách hàng.

getstatus

adb shell tradeinmode getstatus [--challenge CHALLENGE]

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

Thêm tham số --challenge, theo sau là một 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.

poweroff

adb shell tradeinmode poweroff

Tắt nguồn thiết bị. Sử dụng lệnh này để tránh hao pin 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. Sau 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ế độ đổi cũ 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 thành ro=debuggable=1.

trạng thái kiểm thử

adb shell tradeinmode testing status

Xác định xem chế độ kiểm thử trao đổ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 thành ro=debuggable=1.

testing stop

adb shell tradeinmode testing stop

Đưa thiết bị về chế độ trước khi bạn phát 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 thành ro=debuggable=1.

kiểm thử xoá sạch

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 thành 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ế độ thu cũ đổi mới có thể hoạt động đầy đủ. Sử dụng lệnh này trong quy trình tự động hoá để đảm bảo các lệnh ở chế độ đổi cũ lấy mới hoạt động thành công.

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

adb shell tradeinmode wait-until-ready getstatus