Kabuk komut dosyasını sarmala

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:

Sarmalama kabuk komut dosyasını kullanma

wrap.sh uygulamasını kullanmak kolaydır:

  1. Aşağıdakileri paketleyen özel bir hata ayıklaması yapılabilir APK derleyin:
  2. Hata ayıklaması yapılabilir APK'yı bir cihaza yükleyin.
  3. 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:

Android Studio&#39;da Wrap.sh paketleme örneği

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