במהלך ניפוי באגים ויצירת פרופילים של אפליקציות באמצעות קוד מקורי, לעיתים קרובות כדאי להשתמש כלים לניפוי באגים שצריך להפעיל במהלך הפעלת התהליך. כדי לעשות את זה, שמפעילים את האפליקציה בתהליך חדש במקום לשכפל אותה מהזיגוטה. דוגמאות:
- מעקב אחר שיחות מערכת באמצעות 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
כדי להשתמש ב-
ניפוי באגים מסוג 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
אם רוצים לצרף כלי לניפוי באגים בזמן השימוש ב-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