Uygulamalarda yerel kodla hata ayıklama ve profil oluşturma işlemleri yaparken, genellikle işlem başlatıldığında etkinleştirilmesi gereken hata ayıklama araçlarını içerir. Bu, şunu gerektirir: uygulamanızı zigottan klonlamak yerine yeni bir süreçte çalıştırıyorsunuz. Örnekler:
- Sistem aramalarını strace ile izleme.
- Şununla bellek hatalarını bulma: malloc hata ayıklama veya Adres Temizleyici (ASan).
- Simpleperf ile profil oluşturma
Sarmalama kabuk komut dosyasını kullanma
wrap.sh
uygulamasını kullanmak kolaydır:
- Aşağıdakileri paketleyen özel bir hata ayıklaması yapılabilir APK derleyin:
wrap.sh
adlı bir kabuk komut dosyası. Görüntüleyin Sarmalama kabuk komut dosyasını oluşturun ve Ayrıntılı bilgi için Package Wrap.sh- Kabuk komut dosyanızın ihtiyaç duyduğu ek araçlar (kendi
strace
ikili programınız gibi).
- Hata ayıklaması yapılabilir APK'yı bir cihaza yükleyin.
- Uygulamayı başlatın.
Sarmalama kabuk komut dosyasını oluşturma
wrap.sh
içeren hata ayıklaması yapılabilir bir APK başlattığınızda sistem,
komut dosyası tarafından oluşturulur ve uygulamayı bağımsız değişken olarak başlatmak için komutu iletir. Komut dosyası
uygulamanın başlatılmasından sorumlu, ancak herhangi bir ortam veya tartışma
anlamına gelir. Komut dosyası
MirBSD Korn kabuğu (mksh) söz dizimi.
Aşağıdaki snippet, yalnızcawrap.sh
uygulamayı başlatır:
#!/system/bin/sh exec "$@"
Malloc hata ayıklaması
Kullanılacak
malloc hata ayıklama
wrap.sh
aracılığıyla şu satırı dahil edersiniz:
#!/system/bin/sh LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper "$@"
ASan
Aşağıda, ASan için bunun nasıl yapılacağına dair ASan belgeleri.
Wrap.sh
wrap.sh
uygulamasından yararlanmak için APK'nızın hata ayıklaması mümkün olmalıdır. Lütfen
android:debuggable="true"
ayarı
<application>
öğesine sahip olmayabilir veya
build.gradle
dosyası.
useLegacyPackaging
uygulamanızın build.gradle
dosyasındaki true
adresine. Çoğu durumda bu seçenek
Varsayılan olarak false
değerine ayarlayın. Bu nedenle, bunu açıkça true
olarak ayarlamak isteyebilirsiniz.
sürprizlerden kaçının.
wrap.sh
komut dosyasını, uygulamanın yerel kitaplıklarıyla paketlemeniz gerekir. Eğer
Uygulamanız yerel kitaplıklar içermiyorsa lib dizinini manuel olarak
oluşturmanız gerekir. Uygulamanızın desteklediği her mimari için
bu yerel kitaplık dizininin altına sarmalama kabuk komut dosyasının bir kopyasını sağlar.
Aşağıdaki örnekte, hem ARMv8 hem de x86-64'ü destekleyecek dosya düzeni gösterilmektedir mimariler:
# App Directory |- AndroidManifest.xml |- … |- lib |- arm64-v8a |- ... |- wrap.sh |- x86_64 |- ... |- wrap.sh
Android Studio lib/
dizinlerindeki yalnızca .so
dosyalarını paketler. Dolayısıyla
Android Studio kullanıcısıysanız, wrap.sh
dosyalarınızı
Bunun yerine src/main/resources/lib/*
dizin oluşturup bu dizinlerin paketlenmesini sağlayın
sağlayabilir.
resources/lib/x86
öğesinin, kullanıcı arayüzünde şu şekilde görüntüleneceğini unutmayın:
lib.x86
, ancak bu aslında bir alt dizin olmalıdır:
Wrap.sh kullanırken hata ayıkla
wrap.sh
kullanırken bir hata ayıklayıcı eklemek isterseniz kabuk komut dosyanız
hata ayıklamayı manuel olarak etkinleştirmem gerekiyor. Bu işlemin nasıl yapılacağı, yayınladığınız sürüm ve
Bu örnekte, yayınlanan tüm sürümler için uygun seçeneklerin
wrap.sh
desteği:
#!/system/bin/sh
cmd=$1
shift
os_version=$(getprop ro.build.version.sdk)
if [ "$os_version" -eq "27" ]; then
cmd="$cmd -Xrunjdwp:transport=dt_android_adb,suspend=n,server=y -Xcompiler-option --debuggable $@"
elif [ "$os_version" -eq "28" ]; then
cmd="$cmd -XjdwpProvider:adbconnection -XjdwpOptions:suspend=n,server=y -Xcompiler-option --debuggable $@"
else
cmd="$cmd -XjdwpProvider:adbconnection -XjdwpOptions:suspend=n,server=y $@"
fi
exec $cmd