Panduan ini memberikan ringkasan tentang alat dan teknik penting untuk men-debug layanan dan aplikasi yang berjalan di platform SDV.
Hubungkan ke perangkat
Alat utama untuk menghubungkan dan berinteraksi dengan perangkat adalah
Android Debug Bridge (adb). Pastikan adb ada di jalur sistem Anda.
Hubungkan menggunakan jaringan
Jika perangkat berada di jaringan yang sama dan Anda mengetahui alamat IP-nya, Anda dapat terhubung melalui Ethernet. Sistem kami secara eksklusif menggunakan koneksi jaringan untuk adb:
# Connect to the device using its IP address and default port
adb connect <device_ip_address>:5555
Menghubungkan ke beberapa perangkat
Untuk mengelola beberapa perangkat dari satu workstation, Anda dapat terhubung ke perangkat tersebut melalui alamat IP yang berbeda. Jika Anda menjalankan beberapa VM di satu host, Anda harus menetapkan port yang berbeda untuk setiap perangkat. Hal ini memerlukan konfigurasi daemon adb di setiap perangkat SDV untuk memproses port unik, misalnya, 5555 untuk perangkat pertama dan 5556 untuk perangkat kedua. Anda juga dapat mengonfigurasi host untuk meneruskan port tersebut ke tamu yang berbeda:
# Connect to the first device
adb connect <device_1_ip_address>:5555
# Connect to a second device
adb connect <device_2_ip_address>:5555
# Connect to a second VM on first device on different port
adb connect <device_1_ip_address>:5556
# List all connected devices to verify
adb devices
Saat menjalankan perintah adb berikutnya, Anda dapat menargetkan perangkat tertentu dengan
menggunakan flag -s dengan alamat lengkapnya (ip:port):
# Run a shell command on the second VM on first device in the above example
adb -s <device_1_ip_address>:5556 shell
Melihat log
Jika layanan gagal atau berperilaku tidak terduga, periksa log terlebih dahulu.
Menggunakan logcat (log Android)
logcat menampilkan log dari layanan sistem, agen, dan paket layanan:
# View all logs in real-time
adb logcat
# Filter logs by a specific tag (e.g., the name of your service)
adb logcat -s MyServiceTag
# Filter logs by priority (V: Verbose, D: Debug, I: Info, W: Warn, E: Error, F: Fatal)
# This shows only Error and Fatal messages for a specific tag
adb logcat MyServiceTag:E *:S
# Clear old logs before viewing new ones
adb logcat -c && adb logcat
# Show all logs and return
adb logcat -d
# Color logs by level
adb logcat -v color
# Show timestamps as time since boot
adb logcat -v monotonic
Menggunakan dmesg (log kernel)
dmesg menampilkan log dari kernel Linux. Hal ini sangat penting untuk men-debug hal berikut:
- Masalah hardware dan driver
- Kernel panic
- Penolakan SELinux (
avc: denied) - juga ditampilkan di logcat
# View all kernel messages
adb shell dmesg
# Follow kernel messages in real-time
adb shell dmesg -w
Mengakses log di Cuttlefish
Saat menjalankan perangkat virtual Cuttlefish, Anda dapat langsung mengakses file log
dari sistem file mesin host. Hal ini sangat berguna jika adb tidak tersedia. Saat Anda memulai Cuttlefish, semua jalur proses debug akan ditampilkan, dan
Anda juga dapat mencarinya menggunakan cvd fleet untuk semua instance yang berjalan.
- Logcat (log Android):
cuttlefish/instances/cvd-1/logs/logcat - Log kernel:
cuttlefish/instances/cvd-1/logs/kernel.log - Log peluncur Cuttlefish:
cuttlefish/instances/cvd-1/logs/launcher.log(berguna untuk men-debug lingkungan Cuttlefish itu sendiri)
Anda dapat menggunakan alat command line standar seperti cat, less, atau tail -f untuk melihat file ini secara real time.
Berinteraksi dengan shell dan sistem file
Dapatkan akses shell untuk menjalankan perintah langsung di perangkat, memeriksa status proses, dan menavigasi sistem file:
# Open an interactive shell on the device
adb shell
# From within the shell, you can check running processes
ps -A
# Or check the status of a specific service managed by init
getprop init.svc.<service_name>
Melakukan operasi sistem file
Gunakan adb push dan adb pull untuk memindahkan file antara mesin host dan
perangkat. Gunakan ini untuk men-deploy skrip pengujian, memperbarui konfigurasi, atau mengambil file dump error:
# Push a file from your computer to the device
adb push my_local_file.txt /data/local/tmp/
# Pull a file from the device to your computer
adb pull /data/tombstones/tombstone_00 .
Men-debug aplikasi (C++/Rust)
Anda dapat men-debug aplikasi secara online atau offline.
Menggunakan lldb untuk proses debug langsung
Ikuti langkah-langkah berikut untuk men-debug layanan secara real-time menggunakan lldb (untuk memasang
debugger dari Android Studio for Platform, lihat Men-debug dan menguji dan
Men-debug kode platform):
Mulai ulang
adbdengan izin root (diperlukan untuk penerusan port):adb rootJika biner memiliki simbol proses debug, kirim versi yang tidak di-strip dari
out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE]. Misalnya, untuk menguploadrpcagentdarisystem_extdansdv_core_cf, jalankan:adb push out/target/product/sdv_core_cf/symbols/system_ext/bin/rpcagent /data/local/tmpHubungkan dengan klien LLDB menggunakan skrip praktis
lldbclient.py:# Run and connect a binary on device, run on host: lldbclient.py -r /data/local/tmp/rpcagent # Connect to an existing process with PID 2759 lldbclient.py -p 2759Skrip ini menghubungkan
lldbdari jarak jauh. Untuk semua flag yang tersedia, jalankanlldbclient.py --help.
Menganalisis file dump error (tombstone)
Saat layanan mengalami error, file tombstone akan dibuat di /data/tombstones/.
File ini berisi stack trace, peta memori, dan informasi penting lainnya.
Tarik file tombstone, lalu gunakan alat yang mendukung simbol (seperti lldb atau skrip khusus) untuk menganalisisnya dengan versi biner yang tidak di-strip.
Menganalisis performa
SDV mendukung beberapa alat untuk pengukuran performa.
Memeriksa penggunaan CPU dan memori
top: Memberikan tampilan real-time dari proses yang berjalan, yang diurutkan berdasarkan penggunaan CPU.adb shell top -m 10 # Show top 10 processesprocrank: Memberikan perincian mendetail tentang penggunaan memori untuk proses tertentu atau seluruh sistem.adb shell procrank
Menggunakan dumpsys untuk status layanan
dumpsys adalah alat yang canggih untuk mengkueri status internal layanan sistem Android apa pun.
# List all available services
adb shell dumpsys -l
# Dump the state of a specific service or agent
adb shell dumpsys <service_name>
Menggunakan torq untuk analisis performa
torq adalah alat command line yang menyederhanakan tugas pembuatan profil dan pelacakan di Android. Alat ini memungkinkan menjalankan Simpleperf, Perfetto, dan tugas umum lainnya selama analisis performa sistem.
Menggunakan Perfetto untuk pelacakan
Perfetto adalah alat standar untuk pelacakan di seluruh sistem di Android. Perfetto memungkinkan Anda merekam peristiwa sistem, titik rekaman aktivitas level aplikasi, dan penghitung performa, serta memvisualisasikannya di linimasa.
Langkah-langkah utama:
- Tambahkan titik rekaman aktivitas dalam kode C++ atau Rust Anda:
- C++: Gunakan Perfetto SDK dengan makro
TRACE_EVENT. - Rust: Gunakan crate
tracing, yang memunculkan peristiwa ATrace yang kompatibel dengan Perfetto.
- C++: Gunakan Perfetto SDK dengan makro
- Buat file konfigurasi textproto untuk menentukan sumber data (misalnya,
ftrace,track_event), kategori, dan tag. - Gunakan skrip
record_android_trace(external/perfetto/tools/record_android_trace) dengan file konfigurasi Anda untuk mengambil rekaman aktivitas dari perangkat. - Buka file rekaman aktivitas yang dihasilkan di Perfetto Web UI untuk menganalisis perilaku sistem, mengidentifikasi bottleneck, dan memahami interaksi layanan.
Untuk mengetahui petunjuk mendetail tentang instrumentasi, konfigurasi, dan pengumpulan, lihat Menggunakan pelacakan untuk mendapatkan insight tentang performa sistem.
Menggunakan Simpleperf untuk pembuatan profil
Simpleperf adalah alat command line serbaguna untuk pembuatan profil performa di Android, mirip dengan perf Linux.
Kasus penggunaan umum:
- Pembuatan profil CPU: Mengidentifikasi fungsi yang menggunakan waktu CPU paling banyak.
- Analisis non-CPU: Menganalisis alasan thread tidur atau diblokir.
- Penghitung hardware: Mengakses penghitung performa hardware.
Contoh perintah:
# Go to simpleperf scripts
cd system/extras/simpleperf/scripts
# Profile system for 20 seconds and record call graph
./app_profiler.py --system_wide -r "--call-graph fp --duration 20"
# Record a profile for a specific process (PID 1)
./app_profiler.py --pid 1 -r "--call-graph fp --duration 5"
# Pull the profile data
adb pull /data/local/tmp/perf.data .
# Generate a report with symbol resolution
./report_html.py --add_source_code --source_dirs $ANDROID_BUILD_TOP --add_disassembly -o report.html
Simpleperf menawarkan lebih banyak peristiwa dan opsi. Lihat panduan Simpleperf untuk dokumentasi yang komprehensif.
Penolakan SELinux
Gejala: Layanan Anda gagal dimulai, mengakses file, atau menggunakan kemampuan,
dan Anda melihat pesan avc: denied di dmesg atau logcat.
[ 123.456] avc: denied { read } for pid=789 comm="my_service" name="some_file" dev="sda1" ino=123 scontext=u:r:my_service_t:s0 tcontext=u:object_r:some_file_t:s0 tclass=file permissive=0
Proses debug cepat (khusus untuk pengembangan)
Anda dapat menonaktifkan sementara penerapan SELinux untuk melihat apakah masalah telah diselesaikan. Hal ini mengonfirmasi bahwa masalahnya disebabkan oleh aturan kebijakan SELinux yang tidak ada.
# Disabling SELinux requires root permission
adb root
# Set SELinux to permissive mode
adb shell setenforce 0
# Check the current mode (should return "Permissive")
adb shell getenforce
Perbaikan: Alat audit2allow dari hierarki sumber Android pada pesan
penolakan. Tindakan ini akan menghasilkan aturan kebijakan .te yang benar untuk ditambahkan ke konfigurasi SELinux perangkat Anda.