Po uruchomieniu urządzenia z Androidem 16 (lub nowszym) uruchamia się tryb wymiany, który umożliwia nawiązanie połączenia z urządzeniem za pomocą adb i użycie komendy w celu uzyskania informacji o urządzeniu. Aby urządzenie mogło przejść w tryb wymiany za dopłatą, muszą być spełnione te warunki wstępne:
- Urządzenie musi być przywrócone do ustawień fabrycznych.
- Urządzenie nie może mieć dostępu do sieci komórkowej.
- Urządzenie nie może mieć połączenia ani założonego konta.
- Na urządzeniu musi być uruchomiona kompilacja bez debugowania.
Po przejściu przez kreatora konfiguracji urządzenie zostanie umieszczone w trybie oceny, który umożliwia wykonywanie pełnego zakresu poleceń adb i przeprowadzanie dodatkowych testów diagnostycznych na urządzeniu.
Zbieranie ogólnych informacji zdrowotnych
Aby zebrać ogólne informacje o stanie urządzenia, takie jak informacje o baterii, stanie pamięci i numerach IMEI, wykonaj te czynności:
Sprawdź, czy Twoje urządzenie spełnia warunki wstępne dla trybu wymiany za dopłatą.
Podłącz urządzenie do stacji roboczej.
Na stacji roboczej uruchom to polecenie:
adb shell tradeinmode getstatus
To polecenie zwraca obiekt JSON z informacjami o urządzeniu. Poniżej znajduje się przykładowy wynik z Pixela 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" }
Jeśli
factory_reset_protection
jest ustawiona natrue
, urządzenie jest zabezpieczone i nie można go zresetować. Jeśli nie można zresetować urządzenia, nie można go ocenić.
Określanie stanu systemu operacyjnego Android
Aby uzyskać informacje o stanie systemu operacyjnego Android, np. czy jest to zatwierdzona wersja, wykonaj te czynności:
- Podłącz urządzenie do stacji roboczej.
- Upewnij się, że urządzenie ma połączenie z internetem.
Na stacji roboczej uruchom to polecenie:
adb shell tradeinmode getstatus --challenge CHALLENGE
CHALLENGE to losowo wygenerowany ciąg alfanumeryczny, np.
p4tRsuHjWB
. To polecenie zwraca dane JSON, w tym pole attestation zawierające rekord atesta w formacie base64.To polecenie dołącza informacje dotyczące potwierdzenia do informacji zwróconych przez polecenie
getstatus
. Informacje o poświadczeniu wyglądają tak:"attestation": { "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw ... }
Urządzenia z Androidem 16 lub nowszym wymagają połączenia z internetem, aby utworzyć rekord uwierzytelnienia. Atestat powinien być przeprowadzony w trybie oceny po skonfigurowaniu połączenia, ponieważ nie powiedzie się, jeśli zostanie przeprowadzony w kreatorze konfiguracji.
Przeanalizuj informacje dotyczące certyfikatu za pomocą jednej z tych metod:
- Użyj narzędzia
parse_tim_attestation
, które jest tworzone podczas kompilowania AOSP. - Użyj biblioteki uwierzytelniania kluczy na Androidzie.
Aby na przykład użyć narzędzia
parse_tim_attestation
, uruchom:parse_tim_attestation --challenge CHALLENGE output_file
Wartość CHALLENGE musi być taka sama jak wartość wyzwania użyta do uzyskania informacji o poświadczeniu.
Jeśli w kroku 2 zapiszesz dane wyjściowe w pliku output_file, możesz podać jego nazwę. W przeciwnym razie informacje o weryfikacji są odczytywane ze standardowego wejścia.
Zwracany jest obiekt JSON z informacjami o systemie operacyjnym 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"
Jeśli
trustworthy
jest równeyes
, system operacyjny jest uważany za zaufany. Wersja jest podpisana, a numer IMEI nie jest sfałszowany.Pamiętaj, że do wykonania weryfikacji wymagane jest połączenie z internetem zarówno na urządzeniu, jak i na hoście.
- Użyj narzędzia
Testowanie trybu wymiany za dopłatą
Podczas tworzenia aplikacji należy przetestować urządzenie, aby mieć pewność, że przechodzi ono prawidłowo w tryb wymiany i z niego. Aby sprawdzić, czy urządzenie może wejść w tryb wymiany i z niego wyjść:
Podłącz urządzenie do stacji roboczej.
Na stacji roboczej uruchom ponownie urządzenie w trybie wymiany za dopłatą:
adb shell tradeinmode testing start
Urządzenie zostanie zrestartowane i wejdzie w tryb wymiany za dopłatą. Po przejściu do trybu wymiany możesz używać dowolnego polecenia
adb shell tradein
.Upewnij się, że tryb wymiany jest aktywny:
adb shell tradeinmode testing status
Urządzenie rozpoznaje, że testowanie w trybie wymiany jest aktywne.
Wyjście z trybu wymiany za dopłatą i przywrócenie pełnego dostępu do adb:
adb shell tradeinmode testing stop
Integracja z kreatorem konfiguracji niestandardowej
Polecenie evaluate
nie będzie działać na urządzeniach z niestandardowymi kreatorami konfiguracji, chyba że dodasz odbiornik transmisji. Aby dodać odbiornik transmisji do aplikacji kreatora konfiguracji niestandardowej:
Zadeklaruj odbiornik w manifeście aplikacji:
<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>
Utwórz odbiornik transmisji podobny do:
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. } }
Odbiorca musi wykonać podane niżej czynności w podanej kolejności.
- Sprawdź, czy
persist.adb.tradeinmode
jest ustawiony na2
. - Sprawdź, czy nie ma ochrony przed przywracaniem do ustawień fabrycznych ani blokad antykradzieżowych.
- Przygotuj urządzenie, upewniając się, że
Settings.Secure.USER_SETUP_COMPLETE
iSettings.Global.DEVICE_PROVISIONED
są ustawione na1
. - Zamknij aktywność kreatora konfiguracji, aby przejść na ekran główny.
Informacje o trybie wymiany za dopłatą
W tej sekcji opisano wszystkie polecenia w trybie wymiany.
oceniać
adb shell tradeinmode evaluate
Wchodzi w tryb oceny, pomijając kreatora konfiguracji, tak jakby użytkownik ręcznie pomijał wszystkie ekrany konfiguracji.
Po pominięciu kreatora konfiguracji możesz uruchomić na urządzeniu dodatkowe polecenia ADB lub testy funkcjonalne.
Gdy opuścisz tryb oceny, nastąpi przywrócenie ustawień fabrycznych, aby żadne artefakty z testów nie zostały przypadkowo przeniesione do klientów.
getstatus
adb shell tradeinmode getstatus [--challenge CHALLENGE]
Zwraca ciąg JSON z informacjami o systemie, w tym o baterii i stanie pamięci urządzenia.
Dodaj parametr --challenge
, a za nim losowo wygenerowany klucz alfanumeryczny, aby zwrócić dodatkowe pole uwierzytelniania. Przeanalizuj tę odpowiedź, aby poznać najważniejsze informacje o systemie operacyjnym, takie jak stan bootloadera (zablokowany lub odblokowany) oraz ważność numerów seryjnych IMEI.
poweroff
adb shell tradeinmode poweroff
Wyłącza urządzenie. Użyj tego polecenia, aby zapobiec rozładowywaniu się baterii, gdy urządzenie nie jest aktywnie testowane ani oceniane.
Uruchom ponownie
adb shell tradeinmode reboot
Uruchom ponownie urządzenie.
rozpoczęcie testowania
adb shell tradeinmode testing start
Uruchom ponownie urządzenie w trybie wymiany. To polecenie działa tylko w kroku konfiguracji. Po wydaniu tego polecenia autoryzacja jest pomijana i działają tylko polecenia w trybie wymiany.
To polecenie działa tylko na urządzeniach z kompilacją userdebug
, eng
lub user
. W wersji user
musi być ustawiona opcja ro=debuggable=1
.
stan testowania
adb shell tradeinmode testing status
Wskazuje, czy testowanie trybu wymiany jest aktywne.
To polecenie działa tylko na urządzeniach z kompilacją userdebug
, eng
lub user
. W wersji user
musi być ustawiona opcja ro=debuggable=1
.
testing stop
adb shell tradeinmode testing stop
Przywraca urządzenie do trybu, w którym było przed wydaniem polecenia adb shell tradeinmode testing start
.
To polecenie działa tylko na urządzeniach z kompilacją userdebug
, eng
lub user
. W wersji user
musi być ustawiona opcja ro=debuggable=1
.
testowanie czyszczenia
adb shell tradeinmode testing wipe
przywraca urządzenie do ustawień fabrycznych.
To polecenie działa tylko na urządzeniach z kompilacją userdebug
, eng
lub user
. W wersji user
musi być ustawiona opcja ro=debuggable=1
.
wait-until-ready
adb shell tradeinmode wait-until-ready
Czeka, aż usługi systemowe będą gotowe, aby tryb wymiany mógł działać w pełni. Użyj tego polecenia w ramach automatyzacji, aby mieć pewność, że polecenia w trybie wymiany będą działać prawidłowo.
Możesz dodać wait-until-ready
przed innymi poleceniami w trybie wymiany. Na przykład: wait-until-ready
jest połączone z getstatus
:
adb shell tradeinmode wait-until-ready getstatus