ART TI

In Android 8.0 und höher zeigt die ART Tooling Interface (ART TI) bestimmte Laufzeit-Interna an und ermöglicht Profilern und Debuggern, die Funktionsweise Laufzeitverhalten von Apps. Damit können Sie hochmoderne Leistungstools, die für die Implementierung native Agents auf anderen Plattformen.

Laufzeit-Interna sind für Agents sichtbar, die in den Laufzeitprozess geladen wurden. Diese kommunizieren mit der ART über direkte Anrufe und Rückrufe. Laufzeit unterstützt mehrere Agents, sodass unterschiedliche Probleme bei der orthogonalen Profilerstellung getrennt sein. Agents können beim Start der Laufzeit (wenn dalvikvm oder app_process aufgerufen werden) oder angehängt sind, ein bereits laufender Prozess ist.

Weil die Fähigkeit, das App- und Laufzeitverhalten instrumentieren und ändern zu können, sehr wirksam sind, wurden zwei Sicherheitsmaßnahmen in die ART TI integriert:

  • Zunächst wird der Code, der die Agent-Schnittstelle, JVMTI, offengelegt, Laufzeit-Plug-in, das keine Kernkomponente der Laufzeit ist. Das Laden des Plug-ins ist möglicherweise eingeschränkt, sodass Agents daran gehindert werden können, Punkte.
  • Zweitens ermöglichen sowohl die Klasse ActivityManager als auch der Laufzeitprozess Agents nur Folgendes: an debugfähige Apps anhängen. Debug-fähige Apps wurden abgemeldet von ihren Entwicklern zur Analyse und Instrumentierung verwendet. Sie werden nicht an Endanwendenden. Im Google Play Store ist die Verbreitung von Debug-fähigen Apps. Dadurch wird sichergestellt, dass normale Apps einschließlich der Hauptkomponenten instrumentiert oder manipuliert wurden.

Design

Der allgemeine Ablauf und die Verbindung in einer instrumentierten App sind in Abbildung 1:

<ph type="x-smartling-placeholder">
</ph> Datenfluss und Verbindung in einer instrumentierten Anwendung
Abbildung 1: Flow und Verbindung einer instrumentierten App

Das ART-Plug-in libopenjdkjvmti gibt die ART TI frei, also entwickelt, um die Anforderungen und Einschränkungen der Plattform zu berücksichtigen:

  • Die Neudefinition der Klasse basiert auf Dex-Dateien, die nur einen eine einzelne Klassendefinition anstelle von Klassendateien.
  • APIs in der Sprache Java für die Instrumentierung und Neudefinition exponiert sind.

ART TI unterstützt auch Android Studio-Profiler.

Agent laden oder anhängen

Wenn Sie beim Start der Laufzeit einen Agent anhängen möchten, laden Sie mit diesem Befehl sowohl den JVMTI-Plug-in und der angegebene Agent:

dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …

Wenn ein Agent zur Laufzeit geladen wird, sind keine Sicherheitsmaßnahmen vorhanden starten. Denken Sie daher daran, dass eine manuell gestartete Laufzeit vollen ohne Sicherheitsmaßnahmen zu verändern. Dies ermöglicht ART-Tests.

Hinweis: Dies gilt nicht für normale Apps (einschließlich des Systems Server) auf einem Gerät. Apps werden aus einer bereits laufenden Zygote abgespalten, und ein Zygote-Prozess zum Laden von Agents nicht zulässig ist.

Wenn Sie einen Agent an eine bereits ausgeführte Anwendung anhängen möchten, verwenden Sie diese Befehl:

adb shell cmd activity attach-agent [process]
/path/to/agent/libagent.so[=agent-options]

Wenn das JVMTI-Plug-in noch nicht geladen wurde, werden beim Anhängen eines Agents beide das Plug-in und die Agent-Bibliothek.

Ein Agent kann nur an eine laufende Anwendung angehängt werden, die als debuggable (Teil des App-Manifests mit Attribut android:debuggable wurde in der App auf „true“ festgelegt . Sowohl die ActivityManager-Klasse als auch die ART führen überprüft, bevor ein Agent hinzugefügt werden kann. ActivityManager -Klasse die aktuellen App-Informationen (abgeleitet vom PackageManager Klassendaten) für den Debug-fähigen Status und die Laufzeit prüft ihren aktuellen Status, die beim Start der App festgelegt wurde.

Agent-Standorte

Die Laufzeit muss Agents in den aktuellen Prozess laden, damit der Agent sich direkt an sie binden und mit ihr kommunizieren können. Die ART selbst ist unabhängig in Bezug auf den Standort, von dem der Kundenservicemitarbeiter kommt. Der String wird verwendet für einen dlopen-Anruf. Dateisystemberechtigungen und SELinux-Richtlinien das tatsächliche Laden einschränken.

So stellen Sie Agents bereit, die von einer debugfähigen Anwendung ausgeführt werden können:

  • Betten Sie den Agent im Bibliotheksverzeichnis des APK der App ein.
  • Agent mit run-as in die Daten der Anwendung kopieren -Verzeichnis.

APIs

Die folgende Methode wurde zu android.os.Debug hinzugefügt.

/**
     * 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 {

Andere Android-APIs

Der Befehl "attach-agent" ist öffentlich sichtbar. Mit diesem Befehl wird eine JVMTI zu einem laufenden Prozess hinzu:

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;\''

Die Befehle am start -P und am start-profiler/stop-profiler ähneln dem Befehl „attach-agent“.

JVMTI

Diese Funktion macht die JVMTI API für Agents verfügbar (nativer Code). Die wichtigen Zu den Funktionen gehören:

  • Kurse neu definieren
  • Objektzuweisung und automatische Speicherbereinigung verfolgen.
  • Iterieren über alle Objekte in einem Heap und folgen Sie dem Referenzbaum von Objekte.
  • Java-Aufrufstacks prüfen
  • Alle Threads anhalten (und fortsetzen)

Unterschiedliche Funktionen können in verschiedenen Versionen von Android

Kompatibilität

Diese Funktion erfordert eine grundlegende Laufzeitunterstützung, die nur unter Android 8.0 verfügbar ist. und höher. Gerätehersteller müssen keine Änderungen vornehmen, für diese Funktion. Es ist Teil von AOSP.

Zertifizierungsstufe

CTS testet unter Android 8 und höher Folgendes:

  • Tests, die Agents an debugfähige Apps anhängen und an die sie nicht angehängt werden können nicht debuggenden Apps.
  • Testet alle implementierten JVMTI APIs
  • Testet, ob die binäre Schnittstelle für Agents stabil ist

Für Android 9 und höher wurden zusätzliche Tests hinzugefügt. CTS-Tests für diese Releases.