Men-debug SDV

Panduan ini memberikan ringkasan alat dan teknik penting untuk layanan dan aplikasi yang berjalan di platform SDV.

Menghubungkan ke perangkat

Alat utama untuk terhubung dan berinteraksi dengan perangkat adalah Android Debug Bridge (adb). Pastikan adb ada di jalur sistem Anda.

Menghubungkan menggunakan jaringan

Jika perangkat terhubung ke 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 menghubungkannya melalui alamat IP yang berbeda. Jika 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 agar memproses di port yang 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 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 berjalan di 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, Cuttlefish akan menampilkan semua jalur penelusuran bug, dan Anda juga dapat mencarinya menggunakan cvd fleet untuk semua instance yang sedang 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 menjelajahi 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, mengupdate konfigurasi, atau mengambil 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

lldb adalah debugger default di Android Studio dan sering kali lebih disukai untuk pengembangan C++ dan Rust modern.

Ikuti langkah-langkah penyiapan berikut:

  1. Mulai ulang adb untuk mengizinkan izin root (diperlukan untuk penerusan). Gunakan ini untuk menyiapkan penerusan port. Di host, jalankan:

    adb root
    
  2. Jika biner memiliki simbol debug, kirim versi yang tidak dihilangkan. Anda dapat menemukan versi yang tidak di-strip di out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE]. Misalnya, untuk mengupload rpcagent dari system_ext dan sdv_core_cf, jalankan:

    adb push out/target/product/sdv_core_cf/symbols/system_ext/bin/rpcagent /data/local/tmp
    

    Sekarang versi yang tidak di-strip ada di /data/local/tmp.

  3. Hubungkan 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 2759
    

    Skrip ini menghubungkan lldb dari jarak jauh. Untuk semua flag yang tersedia, jalankan lldbclient.py. Lihat dokumentasi IDE Anda untuk menghubungkannya ke lldb.

Menganalisis dump error (tanda peringatan)

Saat layanan mengalami error, file tombstone akan dibuat di /data/tombstones/. File ini berisi stack trace, peta memori, dan informasi penting lainnya.

Tarik file penanda, 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 sedang berjalan yang diurutkan berdasarkan penggunaan CPU.

    adb shell top -m 10  # Show top 10 processes
    
  • procrank: Memberikan perincian mendetail tentang penggunaan memori untuk proses tertentu atau seluruh sistem.

    adb shell procrank
    

Menggunakan dumpsys untuk status layanan

dumpsys adalah alat canggih untuk membuat kueri 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 Anda 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 pelacakan tingkat aplikasi, dan penghitung performa, serta memvisualisasikannya pada linimasa.

Langkah-langkah utama:

  1. Tambahkan titik rekaman aktivitas dalam kode C++ atau Rust Anda:
    • C++: Gunakan Perfetto SDK dengan makro TRACE_EVENT.
    • Rust: Gunakan crate tracing, yang memancarkan peristiwa ATrace yang kompatibel dengan Perfetto.
  2. Buat file konfigurasi textproto untuk menentukan sumber data (misalnya, ftrace, track_event), kategori, dan tag.
  3. Gunakan skrip record_android_trace (external/perfetto/tools/record_android_trace) dengan file konfigurasi Anda untuk merekam aktivitas dari perangkat.
  4. Buka file rekaman aktivitas yang dibuat di UI Web Perfetto untuk menganalisis perilaku sistem, mengidentifikasi hambatan, 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 off-CPU: Analisis alasan thread dalam status tidur atau diblokir.
  • Penghitung hardware: Akses 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

Debug cepat (khusus pengembangan)

Anda dapat menonaktifkan sementara penerapan SELinux untuk melihat apakah masalahnya telah teratasi. Hal ini mengonfirmasi bahwa masalah 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 membuat aturan kebijakan .te yang benar untuk ditambahkan ke konfigurasi SELinux perangkat Anda.