Bu kılavuzda, SDV platformunda çalışan hizmetlerin ve uygulamaların hata ayıklaması için gerekli araçlar ve teknikler hakkında genel bilgiler verilmektedir.
Cihaza bağlanma
Cihaza bağlanmak ve cihazla etkileşimde bulunmak için kullanılan temel araç Android Debug Bridge (adb)'dir. adb'nin sisteminizin yolunda olduğundan emin olun.
Ağı kullanarak bağlanma
Cihaz aynı ağdaysa ve IP adresini biliyorsanız Ethernet ile bağlanabilirsiniz. Sistemimiz, adb için yalnızca ağ bağlantılarını kullanır:
# Connect to the device using its IP address and default port
adb connect <device_ip_address>:5555
Birden fazla cihaza bağlanma
Tek bir iş istasyonundan birden fazla cihazı yönetmek için farklı IP adresleri üzerinden bu cihazlara bağlanabilirsiniz. Tek bir ana makinede birden fazla sanal makine çalıştırıyorsanız her cihaza farklı bağlantı noktaları atamanız gerekir. Bunun için her SDV cihazında adb arka plan programını benzersiz bir bağlantı noktasını (ör. ilk cihaz için 5555, ikinci cihaz için 5556) dinleyecek şekilde yapılandırmanız gerekir. Ayrıca, bu bağlantı noktalarını farklı konuklara yönlendirmek için ana makineyi de yapılandırabilirsiniz:
# 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
Sonraki adb komutlarını çalıştırırken -s işaretini tam adresiyle (ip:port) kullanarak belirli bir cihazı hedefleyebilirsiniz:
# Run a shell command on the second VM on first device in the above example
adb -s <device_1_ip_address>:5556 shell
Günlükleri göster
Bir hizmet başarısız olduğunda veya beklenmedik şekilde davrandığında önce günlükleri kontrol edin.
logcat'i (Android günlükleri) kullanma
logcat, sistem hizmetleri, aracıları ve hizmet paketlerinden gelen günlükleri gösterir:
# 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
dmesg'yi (çekirdek günlükleri) kullanma
dmesg, Linux çekirdeğindeki günlükleri gösterir. Bu, aşağıdakileri ayıklamak için çok önemlidir:
- Donanım ve sürücü sorunları
- Çekirdek panikleri
- SELinux reddetmeleri (
avc: denied) - logcat'te de gösterilir
# View all kernel messages
adb shell dmesg
# Follow kernel messages in real-time
adb shell dmesg -w
Cuttlefish'teki erişim günlükleri
Cuttlefish sanal cihazında çalışırken ana makinenin dosya sistemindeki günlük dosyalarına doğrudan erişebilirsiniz. Bu, özellikle adb seçeneği kullanılamıyorsa yararlıdır. Cuttlefish'i başlattığınızda tüm hata ayıklama yollarını verir. Ayrıca, çalışan tüm örnekler için cvd fleet kullanarak bu yolları arayabilirsiniz.
- Logcat (Android günlükleri):
cuttlefish/instances/cvd-1/logs/logcat - Çekirdek günlükleri:
cuttlefish/instances/cvd-1/logs/kernel.log - Cuttlefish başlatıcı günlükleri:
cuttlefish/instances/cvd-1/logs/launcher.log(Cuttlefish ortamının kendisinde hata ayıklamak için kullanışlıdır)
Bu dosyaları gerçek zamanlı olarak görüntülemek için cat, less veya tail -f gibi standart komut satırı araçlarını kullanabilirsiniz.
Kabuk ve dosya sistemiyle etkileşim kurma
Komutları doğrudan cihazda çalıştırmak, işlem durumunu kontrol etmek ve dosya sisteminde gezinmek için kabuk erişimi elde edin:
# 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>
Dosya sistemi işlemleri gerçekleştirme
Dosyaları ana makineniz ile cihaz arasında taşımak için adb push ve adb pull tuşlarını kullanın. Test komut dosyalarını dağıtmak, yapılandırmayı güncellemek veya kilitlenme dökümlerini almak için bunu kullanın:
# 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 .
Uygulamalarda hata ayıklama (C++/Rust)
Uygulamalarda hem çevrimiçi hem de çevrimdışı olarak hata ayıklayabilirsiniz.
Canlı hata ayıklama için lldb'yi kullanma
lldb, Android Studio'daki varsayılan hata ayıklayıcıdır ve genellikle modern C++ ve Rust geliştirmesi için tercih edilir.
Kurulum için aşağıdaki adımları uygulayın:
Yönlendirmeye izin vermek için adb'yi yeniden başlatın (yönlendirme için gereklidir). Bağlantı noktası yönlendirmeyi ayarlamak için bunu kullanın. Ana makinede şunu çalıştırın:
adb rootBir ikilide hata ayıklama sembolleri varsa sembolleri kaldırılmamış bir sürümü gönderin. Şeridi kaldırılmamış sürümü
out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE]adresinde bulabilirsiniz. Örneğin,system_extvesdv_core_cfkonumlarındanrpcagentdosyasını yüklemek için şu komutu çalıştırın:adb push out/target/product/sdv_core_cf/symbols/system_ext/bin/rpcagent /data/local/tmpŞimdi, kaldırılmamış sürüm
/data/local/tmpiçinde.lldbclient.pykolaylık komut dosyasını kullanarak LLDB istemcisine bağlanın:# 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 2759Bu komut dosyası, lldb'yi uzaktan bağlar. Kullanılabilir tüm bayraklar için
lldbclient.pykomutunu çalıştırın. IDE'nizi lldb'ye bağlamak için IDE dokümanlarınıza bakın.
Kilitlenme dökümlerini (mezartaşları) analiz etme
Bir hizmet kilitlendiğinde /data/tombstones/ içinde tombstone dosyası oluşturulur.
Dosya; yığın izleme, bellek haritası ve diğer önemli bilgileri içerir.
Mezar taşı dosyasını çekin, ardından ikilinin şeritlenmemiş sürümüyle analiz etmek için sembolleri algılayan bir araç (ör. lldb veya özel bir komut dosyası) kullanın.
Performansı analiz etme
SDV, performans ölçümleri için birden fazla aracı destekler.
CPU ve bellek kullanımını kontrol etme
top: CPU kullanımına göre sıralanmış çalışan işlemlerin anlık görünümünü sağlar.adb shell top -m 10 # Show top 10 processesprocrank: Belirli bir işlem veya tüm sistem için bellek kullanımının ayrıntılı bir dökümünü sağlar.adb shell procrank
Hizmet durumu için dumpsys'i kullanma
dumpsys, herhangi bir Android sistem hizmetinin dahili durumunu sorgulamak için kullanılan güçlü bir araçtır.
# List all available services
adb shell dumpsys -l
# Dump the state of a specific service or agent
adb shell dumpsys <service_name>
Performans analizi için torq'u kullanma
torq, Android'de profil oluşturma ve izleme görevlerini basitleştiren bir komut satırı aracıdır. Sistem performansı analizi sırasında Simpleperf, Perfetto ve diğer tipik görevlerin çalıştırılmasına olanak tanır.
İzleme için Perfetto'yu kullanma
Perfetto, Android'de sistem genelinde izleme için kullanılan standart araçtır. Perfetto, sistem etkinliklerini, uygulama düzeyindeki izleme noktalarını ve performans sayaçlarını kaydetmenize ve bunları bir zaman çizelgesinde görselleştirmenize olanak tanır.
Önemli adımlar:
- C++ veya Rust kodunuza izleme noktaları ekleyin:
- C++: Perfetto SDK'sını
TRACE_EVENTmakrolarıyla kullanın. - Rust: Perfetto ile uyumlu ATrace etkinlikleri yayınlayan
tracingsandığını kullanın.
- C++: Perfetto SDK'sını
- Veri kaynaklarını (örneğin,
ftrace,track_event), kategorileri ve etiketleri belirtmek için bir textproto yapılandırma dosyası oluşturun. - Cihazdaki izlemeyi yakalamak için yapılandırma dosyanızla birlikte
record_android_tracekomut dosyasını (external/perfetto/tools/record_android_trace) kullanın. - Sistem davranışını analiz etmek, darboğazları belirlemek ve hizmet etkileşimlerini anlamak için oluşturulan izleme dosyasını Perfetto Web kullanıcı arayüzünde açın.
Enstrümantasyon, yapılandırma ve toplama ile ilgili ayrıntılı talimatlar için Sistem performansıyla ilgili analizler elde etmek için izlemeyi kullanma başlıklı makaleyi inceleyin.
Profil oluşturmak için Simpleperf'ü kullanma
Simpleperf, Linux perf'e benzer şekilde Android'de performans profili oluşturma için çok yönlü bir komut satırı aracıdır.
Yaygın kullanım alanları:
- CPU profili oluşturma: En fazla CPU süresini tüketen işlevleri belirleyin.
- CPU dışı analiz: İş parçacıklarının neden uyuduğunu veya engellendiğini analiz edin.
- Donanım sayaçları: Donanım performans sayaçlarına erişin.
Örnek komutlar:
# 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 çok daha fazla etkinlik ve seçenek sunar. Kapsamlı dokümanlar için Simpleperf kılavuzuna bakın.
SELinux retleri
Belirti: Hizmetiniz başlatılamıyor, bir dosyaya erişilemiyor veya bir özellik kullanılamıyor ve dmesg ya da logcat içinde avc: denied mesajı gösteriliyor.
[ 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
Hızlı hata ayıklama (yalnızca geliştirme için)
Sorunun çözülüp çözülmediğini görmek için SELinux'un zorunlu kılınmasını geçici olarak devre dışı bırakabilirsiniz. Bu, sorunun eksik bir SELinux politikası kuralından kaynaklandığını doğrular.
# 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
Düzeltme: Reddetme mesajındaki Android kaynak ağacından audit2allow aracını kullanın. Bu işlem, cihazınızın SELinux yapılandırmasına eklenecek doğru .te politika kuralını oluşturur.