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
cd frameworks/av/services/audioflinger
Configuration.h
öğesini düzenle#define TEE_SINK
adlı kullanıcının yorumunu kaldırın.libaudioflinger.so
adlı binayı yeniden derleyin.adb root
adb remount
- Yeni
libaudioflinger.so
öğesini cihazınızın/system/lib
cihazına aktarın veya senkronize edin.
Çalışma zamanı kurulumu
adb shell getprop | grep ro.debuggable
.
Çıkışın şu olduğunu onaylayın:[ro.debuggable]: [1]
adb shell
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
echo af.tee=# > /data/local.prop
.
Buradaaf.tee
değeri aşağıda açıklanan bir sayıdır.chmod 644 /data/local.prop
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
- Ses testinizi çalıştırın.
adb shell dumpsys media.audio_flinger
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.- Ardından, ilgilendiğiniz tüm
/data/misc/audioserver/*.wav
dosyalarınıadb pull
; kanala özel döküm dosya adlarınındumpsys
çıkış, ancak kanal kapatıldığında/data/misc/audioserver
hesabına kaydedilmeye devam eder. - 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:
- Kaynak kodu
Configuration.h
değişikliklerini geri alın. libaudioflinger.so
adlı binayı yeniden derleyin.- Geri yüklenen
libaudioflinger.so
öğesini aktarın veya senkronize edin cihazın/system/lib
cihazına. adb shell
rm /data/local.prop
rm /data/misc/audioserver/*.wav
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
veFastCapture
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:
Önemli noktalar:
init
çatal ve yöneticilerimediaserver
.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:
Ö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