Bu kılavuzda, SDV platformunda çalışan hizmet ve uygulamalarda hata ayıklama için gerekli araç ve tekniklere genel bir bakış sunulmaktadır.
Cihaza bağlanma
Cihaza bağlanmak ve cihazla etkileşim kurmak için kullanılan birincil araç Android Debug Bridge (adb)'dir. adb aracının sisteminizin yolunda olduğunu doğrulayın.
Ağı kullanarak bağlanma
Cihaz aynı ağdaysa ve IP adresini biliyorsanız Ethernet üzerinden 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. Bu işlem için her SDV cihazındaki adb daemon'un benzersiz bir bağlantı noktasını (ör. ilk cihaz için 5555 ve ikinci cihaz için 5556) dinleyecek şekilde yapılandırılması gerekir. Ana makineyi, bu bağlantı noktalarını farklı konuklara yönlendirecek şekilde 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 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 (çekirdek günlükleri) kullanma
dmesg, Linux çekirdeğindeki günlükleri gösterir. Bu, aşağıdakilerle ilgili hata ayıklama işlemleri için çok önemlidir:
- Donanım ve sürücü sorunları
- Kernel panic hataları
- SELinux retleri (
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'te günlüklere erişme
Cuttlefish sanal cihazında çalışırken günlük dosyalarına doğrudan ana makinenin dosya sisteminden erişebilirsiniz. Bu, özellikle adb kullanılamıyorsa yararlıdır. Cuttlefish'i başlattığınızda tüm hata ayıklama yollarını gösterir. 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ında hata ayıklama 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
Ana makineniz ile cihaz arasında dosya taşımak için adb push ve adb pull komutlarını kullanın. Test komut dosyalarını dağıtmak, yapılandırmayı güncellemek veya kilitlenme dökümlerini almak için bu seçeneği 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 online veya çevrimdışı olarak hata ayıklayabilirsiniz.
Canlı hata ayıklama için lldb kullanma
lldb kullanarak bir hizmette gerçek zamanlı olarak hata ayıklamak için aşağıdaki adımları uygulayın (Android Studio for Platform'dan hata ayıklayıcıyı eklemek için Hata ayıklama ve test etme ve Platform kodunda hata ayıklama bölümlerine bakın):
adb'i root izinleriyle yeniden başlatın (bağlantı noktası yönlendirme için gereklidir):adb rootİkili programda hata ayıklama sembolleri varsa
out/target/product/[SDV_FLAVOR]/symbols/[PARTITION]/bin/[EXECUTABLE]üzerinden çıkarılmamış bir sürüm gönderin. Örneğin,system_extvesdv_core_cf'denrpcagentyüklemek için şu komutu çalıştırın:adb push out/target/product/sdv_core_cf/symbols/system_ext/bin/rpcagent /data/local/tmplldbclient.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ı,
lldbcihazına uzaktan bağlanır. Kullanılabilir tüm işaretler içinlldbclient.py --helpkomutunu çalıştırın.
Kilitlenme dökümlerini (tombstone) analiz etme
Bir hizmet kilitlendiğinde /data/tombstones/ içinde bir tombstone dosyası oluşturulur.
Dosyada yığın izleme (stack trace), bellek haritası ve diğer önemli bilgiler yer alır.
Tombstone dosyasını alın, ardından simge kullanan bir araçla (ör. lldb veya özel bir komut dosyası) ikili programın çıkarılmamış sürümüyle analiz edin.
Performansı analiz etme
SDV, performans ölçümleri için birden fazla aracı destekler.
CPU ve bellek kullanımını kontrol etme
top: Çalışan işlemlerin CPU kullanımına göre sıralanmış gerçek zamanlı bir görünümünü sağlar.adb shell top -m 10 # Show top 10 processesprocrank: Belirli bir işlem veya sistemin tamamı için bellek kullanımının ayrıntılı 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 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 standart araçtır. Perfetto, sistem etkinliklerini, uygulama düzeyindeki izleme noktalarını ve performans sayaçlarını kaydedip zaman çizelgesinde görselleştirmenize olanak tanır.
Temel adımlar:
- C++ veya Rust kodunuza izleme noktaları ekleyin:
- C++: Perfetto SDK'yı
TRACE_EVENTmakrolarıyla kullanın. - Rust: Perfetto ile uyumlu ATrace etkinlikleri yayınlayan
tracingpaketini kullanın.
- C++: Perfetto SDK'yı
- Veri kaynaklarını (ör.
ftrace,track_event), kategorileri ve etiketleri belirtmek için bir textproto yapılandırma dosyası oluşturun. - Cihazdan 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.
İzleme, 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'i kullanma
Simpleperf, Linux perf'e benzer şekilde Android'de performans profili oluşturmak için kullanılan ç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 uyku modunda veya engellendiğini analiz edin.
- Donanım sayaçları: Donanım performans sayaçlarına erişme
Ö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, daha birçok etkinlik ve seçenek sunar. Kapsamlı dokümanlar için Simpleperf kılavuzuna bakın.
SELinux reddetmeleri
Belirti: Hizmetiniz başlatılamıyor, bir dosyaya erişemiyor veya bir özelliği kullanamıyor ve dmesg ya da logcat içinde bir avc: denied mesajı görüyorsunuz.
[ 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 yaptırımını geçici olarak devre dışı bırakabilirsiniz. Bu, sorunun eksik bir SELinux politika 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: Red mesajındaki Android kaynak ağacından audit2allow aracı. Bu işlem, cihazınızın SELinux yapılandırmasına eklenecek doğru .te politika kuralını oluşturur.