Android 16 이상 기기가 부팅되면 보상 판매 모드로 전환되며, 이 모드에서는 adb를 사용하여 기기에 연결하고 명령어를 사용하여 기기 정보를 가져올 수 있습니다. 기기가 보상 판매 모드로 전환되려면 다음과 같은 기본 조건이 충족되어야 합니다.
- 기기를 초기화해야 합니다.
- 기기에 셀룰러 서비스가 없어야 합니다.
- 기기에 연결이 설정되어 있거나 계정이 설정되어서는 안 됩니다.
- 기기에서 디버그 불가능한 빌드를 실행해야 합니다.
설정 마법사를 탐색하면 기기가 평가 모드로 전환되며, 이 모드에서는 모든 adb 명령어를 실행하고 기기에서 추가 진단을 실행할 수 있습니다.
일반 건강 정보 수집
배터리, 저장용량 상태, IMEI (International Mobile Equipment Identity) 번호와 같은 기기의 일반적인 상태 정보를 수집하려면 다음 단계를 따르세요.
기기가 보상 판매 모드의 기본 요건을 충족하는지 확인합니다.
기기를 워크스테이션에 연결합니다.
워크스테이션에서 다음 명령어를 실행합니다.
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 운영체제의 상태에 관한 정보를 수집하려면 다음 단계를 따르세요.
- 기기를 워크스테이션에 연결합니다.
- 기기가 인터넷에 연결되어 있는지 확인합니다.
워크스테이션에서 다음 명령어를 실행합니다.
adb shell tradeinmode getstatus --challenge CHALLENGE
CHALLENGE는
p4tRsuHjWB
와 같이 무작위로 생성된 영숫자 문자열입니다. 이 명령어는 base64 증명 레코드가 포함된 증명 필드를 포함하는 JSON을 반환합니다.이 명령어는
getstatus
명령어에서 반환된 정보에 증명 정보를 추가합니다. 증명 정보는 다음과 같습니다."attestation": { "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw ... }
Android 16 이상으로 출시되는 기기는 증명 레코드를 만들기 위해 인터넷에 연결되어 있어야 합니다. 설정 마법사에서 실행하면 인증에 실패하므로 연결을 구성한 후 평가 모드에서 인증을 실행해야 합니다.
다음 방법 중 하나를 사용하여 증명 정보를 파싱합니다.
- AOSP를 빌드할 때 빌드되는
parse_tim_attestation
도구를 사용합니다. - Android 키 증명 라이브러리를 사용합니다.
예를 들어
parse_tim_attestation
도구를 사용하려면 다음을 실행합니다.parse_tim_attestation --challenge CHALLENGE output_file
CHALLENGE는 증명 정보를 얻는 데 사용한 것과 동일한 챌린지여야 합니다.
2단계의 출력을 output_file에 저장한 경우 해당 파일 이름을 제공할 수 있습니다. 그렇지 않으면 증명 정보가 stdin에서 읽힙니다.
Android OS 정보가 포함된 JSON 객체가 반환됩니다.
"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가 위조되지 않았습니다.기기와 호스트 모두에서 증명을 실행하려면 인터넷에 연결되어 있어야 합니다.
- AOSP를 빌드할 때 빌드되는
테스트 보상 판매 모드
개발 중에는 기기를 테스트하여 기기가 보상 판매 모드로 제대로 전환되고 종료되는지 확인해야 합니다. 기기의 보상 판매 모드 진입 및 종료 기능을 테스트하려면 다음 단계를 따르세요.
기기를 워크스테이션에 연결합니다.
워크스테이션에서 기기를 보상 판매 모드로 재부팅합니다.
adb shell tradeinmode testing start
기기가 재부팅되고 보상 판매 모드로 전환됩니다. 보상 판매 모드를 시작한 후에는
adb shell tradein
명령어를 사용할 수 있습니다.보상 판매 모드가 활성 상태인지 확인합니다.
adb shell tradeinmode testing status
기기가 보상 판매 모드 테스트가 활성 상태임을 식별합니다.
보상 판매 모드를 종료하고 전체 adb 액세스 권한을 복원합니다.
adb shell tradeinmode testing stop
맞춤 설정 마법사 통합
broadcast receiver가 추가되지 않으면 맞춤 설정 마법사가 있는 기기에서 evaluate
명령어가 작동하지 않습니다. 맞춤 설정 마법사 앱에 broadcast receiver를 추가하려면 다음 단계를 따르세요.
앱 매니페스트에서 수신자를 선언합니다.
<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>
다음과 유사한 broadcast receiver를 만듭니다.
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. } }
수신기는 다음 작업을 순서대로 실행해야 합니다.
persist.adb.tradeinmode
가2
인지 확인합니다.- 초기화 보호 또는 도난 방지 잠금이 없는지 확인합니다.
- 기기를 프로비저닝하여
Settings.Secure.USER_SETUP_COMPLETE
및Settings.Global.DEVICE_PROVISIONED
가1
인지 확인합니다. - 설정 마법사 활동을 닫아 기기가 홈 화면에 표시되도록 합니다.
보상 판매 모드 참조
이 섹션에서는 모든 보상 판매 모드 명령어를 설명합니다.
평가
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
기기를 보상 판매 모드로 재부팅합니다. 이 명령어는 설정 마법사 내에서만 작동합니다. 이 명령어를 실행하면 승인이 우회되고 보상 판매 모드 명령어만 작동합니다.
이 명령어는 userdebug
, eng
또는 user
빌드가 있는 기기에서만 작동합니다. user
빌드에는 ro=debuggable=1
이 설정되어야 합니다.
테스트 상태
adb shell tradeinmode testing status
보상 판매 모드 테스트가 활성 상태인지 식별합니다.
이 명령어는 userdebug
, eng
또는 user
빌드가 있는 기기에서만 작동합니다. user
빌드에는 ro=debuggable=1
이 설정되어야 합니다.
테스트 중지
adb shell tradeinmode testing stop
adb shell tradeinmode testing start
명령어를 실행하기 전의 모드로 기기를 되돌립니다.
이 명령어는 userdebug
, eng
또는 user
빌드가 있는 기기에서만 작동합니다. user
빌드에는 ro=debuggable=1
이 설정되어야 합니다.
테스트 와이프
adb shell tradeinmode testing wipe
기기를 초기화합니다.
이 명령어는 userdebug
, eng
또는 user
빌드가 있는 기기에서만 작동합니다. user
빌드에는 ro=debuggable=1
이 설정되어야 합니다.
wait-until-ready
adb shell tradeinmode wait-until-ready
보상 판매 모드가 완전히 작동할 수 있도록 시스템 서비스가 준비될 때까지 기다립니다. 자동화 내에서 이 명령어를 사용하여 보상 판매 모드 명령어가 성공적으로 실행되었는지 확인합니다.
다른 보상 판매 모드 명령어 앞에 wait-until-ready
를 추가할 수 있습니다. 예를 들어 wait-until-ready
가 getstatus
에 연결된 모습은 다음과 같습니다.
adb shell tradeinmode wait-until-ready getstatus