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">
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.