בניית נקודות מיקרובנצ'מרקים ללא Gradle

בדף הזה נסביר הגדרה של מערכת build שאינה של Gradle כשמשתמשים ב- ספריית מיקרובנצ'מרק.

למרות שספריית Microbenchmark נשלחת פלאגין של Gradle לשילוב ישיר באמצעות הפלאגין Android Gradle, אפשר להשתמש בו גם במערכות פיתוח אחרות, כמו Bazel או באק.

אינסטרומנטציה

שימוש ב-AndroidBenchmarkRunner או במחלקה משנית בתור הפעלת האינסטרומנטציה על ידי ציון שלו בבלוק האינסטרומנטציה של מניפסט הבדיקה:

<manifest
    package="com.example.library.test" ...>

    <instrumentation android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner" />
    ...
</manifest>

כדי לקבל מדידות מדויקות, אסור שהנקודות להשוואה יהיו ניתנות לניפוי באגים. אם לא מגדירים בצורה נכונה את הסימון לצורך ניפוי באגים, הספרייה גורמת לשגיאה מאשר דיווח על תוצאות לא תקינות. יכול להיות שתצטרכו להחליף את המצב של ההגדרה הזו במהלך הפעלות מקומיות שמאפשרות שימוש בכלי ליצירת פרופילים של Android Studio, שמחייבות debuggable=true

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

חבילות APK עם אינסטרומנטציה עצמית

באמצעות APK עם אינסטרומנטציה עצמית – כפלט של Gradle לandroidTest מ-com.android.library - יש להשבית את ניתנים לניפוי באגים מניפסט Android של APK:

<manifest
    package="com.example.library.test" ...>

    <instrumentation
        android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner"
        android:targetPackage="com.example.library.test"/>

    <application android:debuggable="false"/>
</manifest>

חבילת APK של אפליקציה שבוצעה אליה אינסטרומנטציה על ידי APK לבדיקה

אם ה-build שלך יוצר שתי חבילות APK – APK של אפליקציה ו-APK לבדיקה, כפלט של Gradle עבור הספרייה androidTest מחבילת com.android.app — עליך להגדיר את ה-APK של האפליקציה לערך debuggable=false. מערכת ההפעלה Android מתעלמת מהסימון של ה-APK לבדיקה שניתן לניפוי באגים.

<!-- Test manifest. -->
<manifest
    package="com.example.android.app.test" ...>

    <instrumentation
        android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner"
        android:targetPackage="com.example.android.app"/>
    <!-- This debuggable is ignored by the OS. -->
</manifest>

<!-- App being tested. -->
<manifest
    package="com.example.android.app" ...>

    <application android:debuggable="false"/>
</manifest>

ב-Android Studio וב-Gradle אין תמיכה במיקרו נתונים לצורכי השוואה ל-APK של מודול האפליקציה. הסיבה לכך היא המורכבות של תמיכה בספריית בדיקות נוספת תלוי בגרסה שלא ניתנת לניפוי באגים, עברה אופטימיזציה או מוקטנת של ה-APK, אבל בלי הקטנה של השיחות מנקודות ההשוואה לקוד האפליקציה.

קומפילציה

מומלץ להרכיב את ה-APK של המיקרו-בנצ'מרק לפני הרצת בדיקות, באמצעות הפקודה הבאה:

adb shell cmd package compile -f -m speed com.example.benchmark

מזעור ואופטימיזציה

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

רמת הכיסוי של הקוד

מומלץ להפעיל נקודות השוואה כשהכיסוי מושבת וללא ספרייה או ניהול DEX באמצעות כלים כמו JaCoCo.

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

ניפוי באגים בווריאנטים של ספריות שהבנצ'מרק מבוסס עליהן, במיוחד שפותח באופן מקומי, עשוי להיבנות כשהכיסוי מופעל.

הרצת הבדיקות

אפשר להריץ את הבדיקות משורת הפקודה ולציין את המחלקות שרוצים להריץ כפי שמוצג בדוגמה הבאה:

adb shell am instrument -w com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

כדי להגדיר את ספריית Microbenchmark בזמן ריצה בלי Gradle: ארגומנטים של אינסטרומנטציית מיקרובנצ'מרק.