ב-Android מגרסה 8.0 ואילך, ART Tooling Interface (ART TI) חושף רכיבים פנימיים מסוימים בסביבת זמן ריצה, ומאפשרים לכלי פרופיל ומנפקי באגים להשפיע של אפליקציות בסביבת זמן ריצה. אפשר להשתמש בכך כדי להטמיע כלי ביצועים מתקדמים שמסופקים ליישום סוכנים נייטיב בפלטפורמות אחרות.
נתונים פנימיים של זמן הריצה נחשפים לסוכנים שנטענו לתהליך של סביבת זמן הריצה.
המודעות האלה מתקשרות עם ART באמצעות שיחות ישירות והתקשרות חוזרת (callback). סביבת זמן הריצה
תומך במספר נציגים, כדי שבעיות שונות של פרופיל אורתוגונלי
להיות נפרדות. אפשר לספק סוכנים בתחילת זמן הריצה (כאשר
dalvikvm
או app_process
מופעלים), או מצורפים אל
תהליך שכבר פועל.
כי היכולת לבצע אינסטרומנטציה ולשנות את ההתנהגות של האפליקציה ושל סביבת זמן הריצה שני אמצעי בטיחות שולבו ב-ART TI:
- ראשית, הקוד שחושף את ממשק הסוכן, JVMTI, מוטמע הפלאגין של זמן הריצה, ולא רכיב ליבה של סביבת זמן הריצה. יכול להיות שטעינת יישומי הפלאגין מוגבלת, כך שהנציגים לא יוכלו למצוא כל אחד מהממשקים. נקודות.
- שנית, גם המחלקה
ActivityManager
וגם תהליך זמן הריצה מאפשרים לסוכנים מצורפים לאפליקציות שניתנות לניפוי באגים. הוצאו משימוש אפליקציות שניתנות לניפוי באגים על ידי המפתחים שלהם לנתח ולשייך אותם, והם לא מופצים למשתמשי קצה. חנות Google Play לא מתירה הפצה של אפליקציות שניתנות לניפוי באגים באפליקציות. כך ניתן להבטיח שאפליקציות רגילות (כולל רכיבי ליבה) לא שבוצעו בהם אינסטרומנטציה או שעברו שינוי ועיבוד.
עיצוב
הזרימה הכללית והחיבור ביניהם באפליקציה אינסטרומנטלית מוצגים איור 1.
הפלאגין ART libopenjdkjvmti
חושף את ART TI,
במטרה לתת מענה לצרכים ולמגבלות של הפלטפורמה:
- ההגדרה מחדש של הכיתה מבוססת על קובצי
Dex
, המכילים רק הגדרה של מחלקה אחת, במקום קבצים של המחלקה. - אין ממשקי API בשפת Java לאינסטרומנטציה ולהגדרה מחדש היא נחשפת.
ART TI תומך גם בכלי ליצירת פרופילים של Android Studio.
טעינה או צירוף של סוכן
כדי לצרף סוכן בהפעלה בזמן הריצה, צריך להשתמש בפקודה הזו כדי לטעון הפלאגין JVMTI והסוכן הנתון:
dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …
לא מופעלים אמצעי בטיחות כשנציג נטען בזמן הריצה לכן חשוב לזכור שסביבת זמן ריצה שמופעלת באופן ידני מאפשרת ללא אמצעי בטיחות. (כך ניתן יהיה לבצע בדיקת ART).
הערה: הפעולה הזו לא רלוונטית לאפליקציות רגילות (כולל המערכת במכשיר). האפליקציות מפוצלות מזיגוטה שכבר פועלת, ואסור לבצע תהליך זיגוטה כדי לטעון סוכנים.
כדי לצרף נציג לאפליקציה שכבר פועלת, צריך להשתמש כאן: הפקודה:
adb shell cmd activity attach-agent [process] /path/to/agent/libagent.so[=agent-options]
אם הפלאגין של JVMTI עדיין לא נטען, צירוף סוכן יטען את שני החלקים יישומי הפלאגין וספריית הסוכנים.
אפשר לצרף נציג תמיכה רק לאפליקציה פועלת שמסומנת כ:
ניתן לניפוי באגים (חלק מהמניפסט של האפליקציה, עם מאפיין)
android:debuggable
מוגדר כ-true
באפליקציה
). הביצועים של הכיתה ActivityManager
ושל ART
לפני שמאפשרים צירוף של סוכן. ב-ActivityManager
class בודק את פרטי האפליקציה הנוכחיים (נגזר מה-PackageManager
class data) את הסטטוס שניתן לניפוי באגים, וסביבת זמן הריצה בודקת את הסטטוס הנוכחי שלו,
שהוגדרה כשהאפליקציה הופעלה.
מיקומי נציגים
זמן הריצה צריך לטעון את הסוכנים לתהליך הנוכחי, כדי שהסוכן
יכול לקשר אליו באופן ישיר ולתקשר איתו. ה-ART עצמו אגנוסטי
המיקום הספציפי שממנו הנציג מגיע. המחרוזת משמשת
לשיחת dlopen
. הרשאות של מערכת קבצים וכללי מדיניות של SELinux
להגביל את הטעינה בפועל.
כדי להעביר סוכנים שיכולים להפעיל באמצעות אפליקציה שניתנת לניפוי באגים, יש לבצע את הפעולות הבאות:
- מטמיעים את הסוכן בספריית הספרייה ב-APK של האפליקציה.
- אפשר להשתמש ב-
run-as
כדי להעתיק את הנציג לנתוני האפליקציה
ממשקי API
השיטה הבאה נוספה אל android.os.Debug
.
/** * Attach a library as a jvmti agent to the current runtime, with the given classloader * determining the library search path. * Note: agents may only be attached to debuggable apps. Otherwise, this function will * throw a SecurityException. * * @param library the library containing the agent. * @param options the options passed to the agent. * @param classLoader the classloader determining the library search path. * * @throws IOException if the agent could not be attached. * @throws a SecurityException if the app is not debuggable. */ public static void attachJvmtiAgent(@NonNull String library, @Nullable String options, @Nullable ClassLoader classLoader) throws IOException {
ממשקי API אחרים של Android
הפקודה מסוג 'צירוף סוכן' גלויה לכולם. הפקודה הזו מצרפת קובץ JVMTI בתהליך הרצה:
adb shell 'am attach-agent com.example.android.displayingbitmaps \'/data/data/com.example.android.displayingbitmaps/code_cache/libfieldnulls.so=Ljava/lang/Class;.name:Ljava/lang/String;\''
הפקודות am start -P
ו-am
start-profiler/stop-profiler
דומות לפקודה related-agent.
JVMTI
התכונה הזו חושפת את JVMTI API לסוכנים (קוד נייטיב). הדבר החשוב היכולות כוללות:
- הגדרה מחדש של כיתה.
- מעקב אחרי הקצאות של אובייקטים ואיסוף אשפה.
- מופיע באיטרציה על כל האובייקטים בערימה, אחרי עץ העזר של אובייקטים.
- בדיקה של מקבץ קריאות של Java.
- כל השרשורים מושעים (וממשיכים אותם).
יכולות שונות עשויות להיות זמינות בגרסאות שונות של Android.
תאימות
לתכונה הזו נדרשת תמיכה בזמן ריצה ליבה, שזמינה רק ב-Android 8.0. גבוהה יותר. יצרני המכשירים לא צריכים לבצע שינויים כדי להטמיע בתכונה הזו. זה חלק מ-AOSP.
אימות
ה-CTS בודק את הדברים הבאים ב-Android 8 ואילך:
- בדיקות שנציגים מצרפים לאפליקציות שניתנות לניפוי באגים ולא ניתן לצרף אליהן אפליקציות שלא ניתנות לניפוי באגים.
- בדיקת כל ממשקי ה-API של JVMTI שהוטמעו
- בדיקה שהממשק הבינארי לסוכנים יציב
בדיקות נוספות נוספו לגרסת Android 9 ואילך, והן כלולות במחיר בבדיקות ה-CTS לגרסאות האלה.