Ses hata ayıklama

Bu makalede, Android seslerinde hata ayıklamayla ilgili bazı ipuçları ve püf noktaları açıklanmaktadır.

Tee lavabo

"Tee lavabo" : Yalnızca özel derlemelerde bulunan bir AudioFlinger hata ayıklama özelliği saklamanızı öneririz. Bu, asıl oynatılan veya kaydedilen içerikler arasında karşılaştırma yapmaya olanak tanır ve beklenenler karşılaştırması.

Gizlilik nedeniyle tee havuzu hem derleme zamanında hem de varsayılan olarak devre dışıdır. biraz daha belirir. Tee havuzu kullanmak için yeniden derleyerek etkinleştirmeniz gerekir. bir mülk ayarlayarak yapabilirsiniz. Şu işlemleri gerçekleştirdikten sonra bu özelliği devre dışı bırakın: hata ayıklama işlemi tamamlandı. tee havuzu, üretim derlemelerinde etkin bırakılmamalıdır.

Bu bölümdeki talimatlar Android 7.x ve sonraki sürümler için geçerlidir. Android için 5.x ve 6.x, /data/misc/audioserver şununla değiştirin: /data/misc/media. Ek olarak, kullanıcı hata ayıklama veya mühendis. Bir userdebug derlemesi kullanıyorsanız şununla sürümü devre dışı bırakın:

adb root && adb disable-verity && adb reboot

Derleme zamanı kurulumu

  1. cd frameworks/av/services/audioflinger
  2. Configuration.h öğesini düzenle
  3. #define TEE_SINK adlı kullanıcının yorumunu kaldırın.
  4. libaudioflinger.so adlı binayı yeniden derleyin.
  5. adb root
  6. adb remount
  7. Yeni libaudioflinger.so öğesini cihazınızın /system/lib cihazına aktarın veya senkronize edin.

Çalışma zamanı kurulumu

  1. adb shell getprop | grep ro.debuggable.
    Çıkışın şu olduğunu onaylayın: [ro.debuggable]: [1]
  2. adb shell
  3. ls -ld /data/misc/audioserver

    Çıkışın şu olduğunu onaylayın:

    drwx------ media media ... media
    

    Dizin yoksa aşağıdaki gibi oluşturun:

    mkdir /data/misc/audioserver
    chown media:media /data/misc/audioserver
    
  4. echo af.tee=# > /data/local.prop.
    Burada af.tee değeri aşağıda açıklanan bir sayıdır.
  5. chmod 644 /data/local.prop
  6. reboot

af.tee mülkü için değerler

af.tee değeri, 0 ile 7 arasında bir sayıdır ve şunu ifade eder: özellik başına bir tane olmak üzere, bitlerin toplamıdır. AudioFlinger.cpp bölgesindeki AudioFlinger::AudioFlinger() adresinde kodu görebilirsiniz kısa ama özlü bir örnek verelim:

  • 1 = giriş
  • 2 = FastMixer çıkışı
  • 4 = parça başına Ses Kaydı ve Ses Parçası

Derin tampon ya da normal mikser için henüz pek bir şey yoktur. ancak "4" düğmesini kullanarak benzer sonuçlar alabilirsiniz.

Verileri test etme ve edinme

  1. Ses testinizi çalıştırın.
  2. adb shell dumpsys media.audio_flinger
  3. dumpsys çıkışında şuna benzer bir satır arayın:
    tee copied to /data/misc/audioserver/20131010101147_2.wav
    Bu bir PCM .wav dosyasıdır.
  4. Ardından, ilgilendiğiniz tüm /data/misc/audioserver/*.wav dosyalarını adb pull; kanala özel döküm dosya adlarının dumpsys çıkış, ancak kanal kapatıldığında /data/misc/audioserver hesabına kaydedilmeye devam eder.
  5. Başkalarıyla paylaşmadan önce döküm dosyalarını gizlilikle ilgili kaygılar açısından inceleyin.

Öneriler

Daha faydalı sonuçlar için şu fikirleri deneyin:

  • Test çıkışında kesintileri azaltmak için dokunma seslerini ve tuş tıklamalarını devre dışı bırakın.
  • Tüm birimleri en üst düzeye çıkarın.
  • Mikrofondan ses yapan veya kayıt yapan uygulamaları devre dışı bırakın, (testiniz ile ilgilenmiyorlarsa) seçin.
  • Kanala özel dökümler yalnızca kanal kapatıldığında kaydedilir. Kanala özgü verileri dökümü için bir uygulamayı kapanmaya zorlamanız gerekebilir
  • Testten hemen sonra dumpsys işlemini yapın; sınırlı miktarda kayıt alanı vardır.
  • Döküm dosyalarınızı kaybetmemek için bunları düzenli aralıklarla barındırıcınıza yükleyebilirsiniz. Yalnızca sınırlı sayıda döküm dosyası korunur; Bu sınıra ulaşıldıktan sonra eski dökümler kaldırılır.

Geri yükle

Yukarıda belirtildiği gibi, tee lavabo özelliği etkin bırakılmamalıdır. Derlemenizi ve cihazınızı aşağıdaki şekilde geri yükleyin:

  1. Kaynak kodu Configuration.h değişikliklerini geri alın.
  2. libaudioflinger.so adlı binayı yeniden derleyin.
  3. Geri yüklenen libaudioflinger.so öğesini aktarın veya senkronize edin cihazın /system/lib cihazına.
  4. adb shell
  5. rm /data/local.prop
  6. rm /data/misc/audioserver/*.wav
  7. reboot

medya.log

ALOGx makroları

Android SDK'daki standart Java dili günlük kaydı API'si: android.util.Log ile değiştirin.

Android NDK'da ilgili C dili API'si: __android_log_print. <android/log.h> ayında açıklandı.

Android çerçevesinin doğal kısmı kapsamında ALOGE, ALOGW, ALOGI, ALOGV vb. Şurada beyan edilmişler: <utils/Log.h> ve bu makalenin amaçları doğrultusunda Bunlar birlikte ALOGx olarak anılacaktır.

Bu API'lerin tümü hem kullanımı kolay hem de iyi anlaşıldığı için çok yaygındır. bazı yöntemleri inceleyelim. Özellikle, mediaserver AudioFlinger ses sunucusunu da kapsayan bir işlem için ALOGx kapsamlı olarak.

Yine de ALOGx ve arkadaşlarına ilişkin bazı sınırlamalar vardır:

  • "Günlüğe spam kaydetme" riski vardır: Günlük arabelleği paylaşılan bir kaynaktır Böylece alakasız günlük girişleri nedeniyle kolayca taşabilir ve sonuçta eksik bilgi var. ALOGV varyantı şu adreste devre dışı bırakıldı: varsayılan olarak derleme süresidir. Tabii ki bu da günlük spam'ine neden olabilir. Etkinse.
  • Temel çekirdek sistemi çağrıları engellenebilir. Bunun sonucunda da büyük olasılıkla ve bunun sonucunda oluşan ölçüm bozuklukları, fark etmez. Bu öğe FastMixer ve FastCapture gibi zaman açısından kritik ileti dizileri için özel önem taşır.
  • Günlük spam'ini azaltmak için belirli bir günlük devre dışı bırakılırsa bu günlüğün yakaladığı tüm bilgiler kaybolur. Belirli bir günlüğü geriye dönük olarak etkinleştirmek mümkün değildir. sonra da günlüğün ilgi çekici olduğu anlaşılır hale gelir.

NBLOG, media.log ve MediaLogService

NBLOG API'leri ve ilişkilendirilmiş media.log işlem ve MediaLogService hizmeti birlikte medya için yeni bir günlük kaydı sistemi oluşturur ve aşağıda belirtilen sorunları gidermek için tasarlanmıştır. Terimi genel olarak "media.log" her üçüne de değinmek isteriz, ancak tam anlamıyla NBLOG C++ Logging API, media.log bir Linux işlem adıdır ve MediaLogService günlükleri incelemek için kullanılan bir Android bağlayıcı hizmetidir.

media.log "zaman çizelgesi" bir dizidir göreceli sıralaması korunan günlük girişi sayısını gösterir. Kural olarak, her iş parçacığı kendi zaman çizelgesini kullanmalıdır.

Avantajlar

media.log sisteminin avantajları şunlardır:

  • Gerekli olmadığı sürece ve ihtiyaç duyulana kadar ana günlüğe spam göndermez.
  • mediaserver kilitlendiğinde veya kilitlendiğinde bile incelenebilir.
  • Zaman çizelgesine göre engelleyici değil.
  • Performansta daha az rahatsızlığa neden olur. (Elbette hiçbir günlük kaydı biçimi tamamen rahatsız edici değildir.)

Mimari

Aşağıdaki şemada mediaserver sürecinin ilişkisi gösterilmektedir media.log kullanıma sunulmadan önceki init süreci:

media.log&#39;dan önceki mimari

Şekil 1. media.log'dan önceki mimari

Önemli noktalar:

  • init çatal ve yöneticileri mediaserver.
  • init, mediaserver adlı çocuğun öldüğünü algılar ve gerektiği şekilde çatallanıyor.
  • ALOGx günlük kaydı gösterilmiyor.

Aşağıdaki şemada, bileşenlerin yeni ilişkisi gösterilmektedir media.log mimariye eklendikten sonra:

media.log&#39;dan sonra mimari

Şekil 2. media.log'dan sonra mimari

Önemli değişiklikler:

  • İstemciler NBLOG API'yi kullanarak günlük girişleri oluşturur ve bunları bir arabellek sunar.
  • MediaLogService, dairesel arabelleğin içeriğini herhangi bir zamanda döküm haline getirebilir.
  • Dairesel tampon, oluşturulan verideki herhangi bir bozulmanın paylaşılan anı MediaLogService kilitlenmez ve hâlâ kilitlenebilir tamponun yolsuzluktan etkilenmeyen ne kadar büyük bir kısmını atar?
  • Dairesel arabellek engellemez ve hem yazı için kilitsizdir mevcut girişleri okumanızı sağlar.
  • Döngüsel arabelleğe yazmak veya buradan okumak için çekirdek sistem çağrısı gerekmez (isteğe bağlı zaman damgaları hariç).

Kullanım yeri

Android 4.4 sürümünden itibaren AudioFlinger'da yalnızca birkaç günlük noktası bulunmaktadır. media.log sistemini kullanan kampanyalar var. Yeni API'ler önceki kadar kullanımı kolay ALOGx ve çok zor değil. Kullanıcılarınız için yeni günlük kaydı sistemini öğrenmenizi gerekli olduğu özel durumlar için de geçerlidir. Özellikle, her öğenin ve benzeri engelleme işlemleri (örneğin, FastMixer ve FastCapture mesaj dizisi.

Nasıl kullanılır?

Günlük ekle

Öncelikle, kodunuza günlük eklemeniz gerekir.

FastMixer ve FastCapture ileti dizilerinde aşağıdaki gibi bir kod kullanın:

logWriter->log("string");
logWriter->logf("format", parameters);
logWriter->logTimestamp();

Bu NBLog zaman çizelgesi, yalnızca FastMixer ve FastCapture ileti dizisi, karşılıklı dışlamaya gerek yoktur.

Diğer AudioFlinger ileti dizilerinde mNBLogWriter öğesini kullanın:

mNBLogWriter->log("string");
mNBLogWriter->logf("format", parameters);
mNBLogWriter->logTimestamp();

FastMixer ve FastCapture dışındaki ileti dizileri için, ileti dizisinin NBLog zaman çizelgesi hem ileti dizisi tarafından hem de bağlayıcı işlemleriyle oluşturulur. NBLog::Writer, herhangi bir her zaman örtülü hariç tutmalar oluşturur, bu nedenle tüm günlüklerin komutunun ne kadarının tutulduğuna (mLock) tutulamaz.

Günlükleri ekledikten sonra AudioFlinger'ı yeniden derleyin.

Dikkat: Her ileti dizisi için ayrı bir NBLog::Writer zaman çizelgesi gereklidir. kullanın. Şu durumda: birden fazla iş parçacığının aynı zaman çizelgesini kullanmasını istiyorsanız (yukarıda mLock için açıklandığı şekilde) kullanın. Dilerseniz NBLog::Writer yerine NBLog::LockedWriter sarmalayıcıyı kullanın. Ancak bu durum, bu API'nin en önemli avantajını ortadan kaldırıyor: API'nin engellemeyen çalışması gösterir.

NBLog API'nin tam sürümü frameworks/av/include/media/nbaio/NBLog.h adresinde.

media.log'u etkinleştir

media.log varsayılan olarak devre dışıdır. Yalnızca mülk olduğunda etkindir ro.test_harness 1. Bu özelliği aşağıdaki şekilde etkinleştirebilirsiniz:

adb root
adb shell
echo ro.test_harness=1 > /data/local.prop
chmod 644 /data/local.prop
reboot

Yeniden başlatma sırasında bağlantı kesilir. Bu nedenle:

adb shell
ps media komutu artık iki işlem gösterecek:
  • medya.log
  • medya sunucusu

Daha sonrası için mediaserver işlem kimliğini not edin.

Zaman çizelgelerini görüntüleyin

İstediğiniz zaman manuel olarak günlük dökümü isteyebilirsiniz. Bu komut, tüm etkin ve son zaman çizelgelerine ait günlükleri gösterir ve ardından bunları temizler:

dumpsys media.log

Tasarım zaman çizelgelerinin bağımsız, zaman çizelgelerini birleştirme olanağı yoktur.

Medya sunucusu ölümünden sonra günlükleri kurtar

Şimdi mediaserver işlemini sonlandırmayı deneyin: kill -9 #. Burada # not ettiğiniz işlem kimliğini girin. media.log konumuna ait bir döküm göreceksiniz kilitlenmeye neden olan tüm günlükleri gösterir.logcat

dumpsys media.log