סקריפט מעטפת

במהלך ניפוי באגים ויצירת פרופילים של אפליקציות באמצעות קוד מקורי, לעיתים קרובות כדאי להשתמש כלים לניפוי באגים שצריך להפעיל במהלך הפעלת התהליך. כדי לעשות את זה, שמפעילים את האפליקציה בתהליך חדש במקום לשכפל אותה מהזיגוטה. דוגמאות:

שימוש בסקריפט של מעטפת המעטפת

קל להשתמש ב-wrap.sh:

  1. עורכים חבילת APK מותאמת אישית שניתנת לניפוי באגים ומכילה את הפריטים הבאים:
  2. מתקינים במכשיר את חבילת ה-APK שניתנת לניפוי באגים.
  3. מפעילים את האפליקציה.

יצירת הסקריפט של מעטפת המעטפת

כשמשיקים APK שמכיל wrap.sh שניתן לבצע בו ניפוי באגים, המערכת עורכת אותו את הסקריפט ומעבירה את הפקודה להפעלת האפליקציה כארגומנטים. הסקריפט אחראי להפעלת האפליקציה, אבל יכול ליצור כל סביבה או ארגומנט שינויים. הסקריפט צריך להופיע כך: תחביר MirBSD Kornshell (mksh).

קטע הקוד הבא מראה איך לכתוב קובץ wrap.sh פשוט מפעיל את האפליקציה:

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

ניפוי באגים מסוג Malloc

כדי להשתמש ב- ניפוי באגים מסוג 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 Studio הגדרתם גרסת build לניפוי באגים קובץ build.gradle.

צריך גם להגדיר את useLegacyPackaging אל true בקובץ build.gradle של האפליקציה. ברוב המקרים, האפשרות הזו מוגדרת. ל-false כברירת מחדל, לכן ייתכן שתרצו להגדיר את זה באופן מפורש ל-true להימנע מפתעות.

צריך להוסיף את הסקריפט wrap.sh לספריות המקוריות של האפליקציה. אם המיקום האפליקציה לא מכילה ספריות נייטיב, יש להוסיף את ספריית lib באופן ידני את ספריית הפרויקט. עבור כל ארכיטקטורה שהאפליקציה שלך תומכת בה, צריך לספק עותק של הסקריפט של המעטפת ב-Gmail, באותה ספריית נייטיב.

בדוגמה הבאה מוצגת פריסת הקובץ שתתמוך גם ב-ARMv8 וגם ב-x86-64 של הארכיטקטורות:

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

Android Studio כולל רק .so קבצים מהספריות lib/, כך שאם אתה משתמש ב-Android Studio, עליך למקם את קובצי wrap.sh שלך ב ספריות src/main/resources/lib/* במקום זאת, כדי שהן יהיו נארזות בצורה נכונה.

לתשומת ליבך, השם resources/lib/x86 יופיע בממשק המשתמש בתור lib.x86, אבל למעשה היא צריכה להיות ספריית משנה:

דוגמה ל-wrap.sh על האריזה ב-Android Studio

ניפוי באגים בזמן שימוש ב-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