التفاف النص البرمجي بالصدفة

عند تصحيح أخطاء التطبيقات وإنشاء ملفات شخصية لها باستخدام رموز برمجية أصلية، غالبًا ما يكون من المفيد استخدام أدوات تصحيح الأخطاء التي يجب تفعيلها عند بدء العملية. هذا يتطلب تقوم بتشغيل تطبيقك بعملية جديدة بدلاً من استنساخ من زيغوت. تشمل الأمثلة ما يلي:

استخدام النص البرمجي للالتفاف

يتميز استخدام "wrap.sh" بالسهولة:

  1. تجميع حزمة APK مخصّصة قابلة للتصحيح تتضمّن ما يلي:
    • نص برمجي واجهة برمجة تطبيقات باسم wrap.sh. عرض إنشاء النص البرمجي للالتفافو يمكنك الاطّلاع على Package wrap.sh لمعرفة المزيد من التفاصيل.
    • أي أدوات إضافية يحتاجها النص البرمجي للواجهة (مثل البرنامج الثنائي الخاص بك على strace)
  2. ثبِّت حزمة APK القابلة للتصحيح على أحد الأجهزة.
  3. افتح التطبيق.

إنشاء نص التفاف هيكلي

عند تشغيل حزمة APK قابلة للتصحيح وتحتوي على wrap.sh، يتم تنفيذ النظام. النص البرمجي ويمرر الأمر لبدء التطبيق كوسيطات. النص البرمجي مسئول عن بدء التطبيق، ولكن يمكنه جعل أي بيئة أو وسيطة التغييرات. يجب أن يتبع النص MirBSD Kornshell (mksh).

يوضح المقتطف التالي كيفية كتابة ملف wrap.sh بسيط لبدء تشغيل التطبيق:

#!/system/bin/sh
exec "$@"

تصحيح أخطاء مالوك

للاستخدام تصحيح أخطاء malloc عبر wrap.sh، يمكنك تضمين السطر التالي:

#!/system/bin/sh
LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper "$@"

آسان

هناك مثال على كيفية القيام بذلك بالنسبة إلى ASan في مستندات ASan

الحزمة wrap.sh

للاستفادة من wrap.sh، يجب أن يكون ملف APK قابلاً للتصحيح. تأكد من أن android:debuggable="true"تم ضبط الإعداد في <application> في بيان Android، أو إذا كنت تستخدم "استوديو Android" قمت بضبط إصدار تصحيح أخطاء في ملف build.gradle.

من الضروري أيضًا ضبط useLegacyPackaging إلى true في ملف build.gradle لتطبيقك. وفي معظم الحالات، يتم تعيين هذا الخيار على false تلقائيًا، لذا ننصحك بضبطها بشكل صريح على true وتجنب أي مفاجآت.

يجب تجميع النص البرمجي wrap.sh مع المكتبات الأصلية للتطبيق. في حال حذف لا يحتوي تطبيقك على مكتبات أصلية، أضِف دليل lib يدويًا إلى دليل مشروعك. لكل بنية يتوافق معها تطبيقك، يجب توفير نسخة من نص التفاف النص ضمن دليل المكتبة الأصلي هذا.

يوضح المثال التالي تنسيق الملف ليتوافق مع كل من ARMv8 وx86-64 البُنى الهندسية:

# App Directory
|- AndroidManifest.xml
|- …
|- lib
   |- arm64-v8a
      |- ...
      |- wrap.sh
   |- x86_64
      |- ...
      |- wrap.sh

لا يضم "استوديو Android" سوى ملفات .so من أدلة lib/، لذا إذا إذا كنت تستخدم "استوديو Android"، يجب وضع ملفات wrap.sh في src/main/resources/lib/* أدلة بدلاً من ذلك، حتى يتم تجميعها بشكل صحيح.

يُرجى العلم أنّ resources/lib/x86 سيتم عرضه في واجهة المستخدم على النحو التالي: lib.x86، لكن يجب أن يكون في الواقع دليلاً فرعيًا:

مثال على حزمة wrap.sh في &quot;استوديو Android&quot;

تصحيح الأخطاء عند استخدام wrap.sh

إذا أردت إرفاق برنامج تصحيح الأخطاء عند استخدام wrap.sh، سينفّذ البرنامج النصي من واجهة الأوامر إلى تفعيل تصحيح الأخطاء يدويًا. وتختلف طريقة تنفيذ ذلك من إصدار لآخر يوضّح هذا المثال كيفية إضافة الخيارات المناسبة لجميع الإصدارات التي دعم wrap.sh:

#!/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