عند تصحيح أخطاء التطبيقات وإنشاء ملفات شخصية لها باستخدام رموز برمجية أصلية، غالبًا ما يكون من المفيد استخدام أدوات تصحيح الأخطاء التي يجب تفعيلها عند بدء العملية. هذا يتطلب تقوم بتشغيل تطبيقك بعملية جديدة بدلاً من استنساخ من زيغوت. تشمل الأمثلة ما يلي:
- تتبُّع طلبات النظام باستخدام strace
- العثور على أخطاء الذاكرة باستخدام تصحيح أخطاء malloc أو منظِّم العنوان (ASan).
- إنشاء الملفات التعريفية باستخدام Simpleperf:
استخدام النص البرمجي للالتفاف
يتميز استخدام "wrap.sh
" بالسهولة:
- تجميع حزمة APK مخصّصة قابلة للتصحيح تتضمّن ما يلي:
- نص برمجي واجهة برمجة تطبيقات باسم
wrap.sh
. عرض إنشاء النص البرمجي للالتفافو يمكنك الاطّلاع على Package wrap.sh لمعرفة المزيد من التفاصيل. - أي أدوات إضافية يحتاجها النص البرمجي للواجهة (مثل البرنامج الثنائي الخاص بك على
strace
)
- نص برمجي واجهة برمجة تطبيقات باسم
- ثبِّت حزمة APK القابلة للتصحيح على أحد الأجهزة.
- افتح التطبيق.
إنشاء نص التفاف هيكلي
عند تشغيل حزمة 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
إذا أردت إرفاق برنامج تصحيح الأخطاء عند استخدام 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