Mikro-Benchmarks ohne Gradle erstellen

Auf dieser Seite wird beschrieben, wie Sie ein Nicht-Gradle-Build-System konfigurieren, wenn Sie die MicroBenchmark-Bibliothek verwenden.

Die MicroBenchmark-Bibliothek enthält ein Gradle-Plug-in zur direkten Einbindung in das Android-Gradle-Plug-in. Sie können es aber auch in anderen Build-Systemen wie Bazel oder Buck verwenden.

Instrumentierung

Verwenden Sie AndroidBenchmarkRunner oder eine Unterklasse als Instrumentierungs-Runner. Geben Sie sie dazu im Instrumentierungsblock des Testmanifests an:

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

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

Um genaue Messungen zu erhalten, dürfen Benchmarks nicht Debug-fähig sein. Wenn Sie das debuggable-Flag nicht richtig festlegen, gibt die Bibliothek einen Fehler aus und meldet keine ungültigen Ergebnisse. Sie müssen diese Einstellung möglicherweise bei lokalen Ausführungen zur Verwendung mit Android Studio-Profilern ändern, für die debuggable=true erforderlich ist.

Mikro-Benchmarks können auf zwei Arten erstellt werden: innerhalb eines selbst instrumentierenden APKs oder mit einem Test-APK, das ein anderes APK instrumentiert.

Selbst instrumentierende APKs

Bei einem selbstinstrumentierenden APK, das von Gradle für ein androidTest-Verzeichnis von com.android.library ausgegeben wird, müssen Sie „Debuggable“ im Android-Manifest des einzelnen APKs deaktivieren:

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

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

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

App-APK, instrumentiert durch Test-APK

Wenn Ihr Build zwei APKs ausgibt – ein App-APK und ein Test-APK, als Ausgabe von Gradle für das Verzeichnis androidTest aus dem Paket com.android.app –, müssen Sie das App-APK auf debuggable=false festlegen. Das Debuggable-Flag des Test-APKs wird vom Android-Betriebssystem ignoriert.

<!-- 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 und Gradle unterstützen kein Micro-Benchmarking für App-Modul-APKs. Das liegt daran, dass die Unterstützung eines zusätzlichen Testverzeichnisses komplex ist, das von einer nicht debugfähigen, optimierten oder reduzierten Variante des APKs abhängig ist, ohne dass durch die Komprimierung Aufrufe von Benchmarks in App-Code unterbrochen werden.

Minimierung und Optimierung

Wir empfehlen, für Ihre Benchmarks eine Reduzierung und Optimierung zu verwenden, um eine Leistung zu erzielen, die kurz vor der Veröffentlichung steht. Beispielcode finden Sie im Benchmark-Beispielprojekt.

Codeabdeckung

Wir empfehlen, Benchmarks mit deaktivierter Abdeckung und ohne Bibliotheks- oder DEX-Mangling durch Tools wie JaCoCo auszuführen.

Aus diesem Grund empfehlen wir, Benchmarks als Quelle von anderen Instrumentierungstests zu isolieren und mit Releaseabhängigkeiten separat zu erstellen. So vermeiden Sie, dass Tests mehrmals mit und ohne Abdeckung erstellt werden müssen.

Debug-Varianten, von denen Ihre Benchmark abhängt, (insbesondere lokal erstellte Bibliotheken), können mit aktivierter Abdeckung erstellt werden.

Tests ausführen

Sie können Ihre Tests über die Befehlszeile ausführen und die Klassen angeben, mit denen die Ausführung ausgeführt werden soll, wie im folgenden Beispiel gezeigt:

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

Informationen zum Konfigurieren der MicroBenchmark-Bibliothek zur Laufzeit ohne Gradle finden Sie unter Argumente für die MicroBenchmark-Instrumentierung.