W Androidzie 8.0 i nowszych interfejs narzędzi ART (ART TI) udostępnia niektóre wewnętrzne dane dotyczące środowiska uruchomieniowego i umożliwia profilatorom oraz debugerom wpływanie na zachowanie aplikacji w czasie ich działania. Możesz go używać do wdrażania najnowocześniejszych narzędzi do optymalizacji skuteczności, które są dostępne do implementowania agentów natywnych na innych platformach.
Elementy wewnętrzne środowiska wykonawczego są dostępne dla agentów załadowanych do procesu środowiska wykonawczego.
Komunikują się one z ART za pomocą wywołań bezpośrednich i wyzwań zwrotnych. Czas wykonywania obsługuje wiele agentów, dzięki czemu można rozdzielać różne problemy związane z profilowaniem ortogonalnym. Agentów można dostarczać na początku działania (gdy są wywoływane za pomocą funkcji dalvikvm
lub app_process
) albo dołączać do już uruchomionego procesu.
Umiejętność modyfikowania aplikacji i ich zachowania w czasie wykonywania jest bardzo przydatna, dlatego do narzędzia ART TI zostały dodane 2 środki bezpieczeństwa:
- Po pierwsze, kod udostępniający interfejs agenta, JVMTI, jest implementowany jako wtyczka środowiska wykonawczego, a nie jako główny komponent środowiska wykonawczego. Ładowanie wtyczek może być ograniczone, aby pracownicy nie mogli znaleźć żadnych punktów interfejsu.
- Po drugie, zarówno klasa
ActivityManager
, jak i proces wykonawczy umożliwiają agentom łączenie się tylko z aplikacjami, które można debugować. Aplikacje z możliwością debugowania zostały zatwierdzone przez deweloperów do analizy i instrumentacji. Nie są one rozpowszechniane wśród użytkowników końcowych. Sklep Google Play nie zezwala na rozpowszechnianie aplikacji z możliwością debugowania. Dzięki temu nie można modyfikować ani manipulować zwykłymi aplikacjami (w tym ich głównymi komponentami).
Projektowanie
Ogólny przepływ danych i połączenia w aplikacji z instrumentacją przedstawiono na rysunku 1.

Wtyczka ART libopenjdkjvmti
udostępnia interfejs ART TI, który został zaprojektowany z uwzględnieniem potrzeb i ograniczeń platformy:
- Zamiast plików klas definicja klasy jest definiowana na podstawie plików
Dex
, które zawierają tylko jedną definicję klasy. - Interfejsy API języka Java do instrumentacji i ponownie definiowania nie są udostępniane.
Interfejs ART TI obsługuje też profilatory Android Studio.
Ładowanie lub dołączanie agenta
Aby dołączyć agenta podczas uruchamiania, użyj tego polecenia, aby załadować zarówno wtyczkę JVMTI, jak i danego agenta:
dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …
Podczas wczytywania agenta w czasie uruchamiania nie są stosowane żadne środki bezpieczeństwa, dlatego pamiętaj, że ręcznie uruchomione środowisko wykonawcze umożliwia pełną modyfikację bez środków bezpieczeństwa. (umożliwia to testowanie ART).
Uwaga: nie dotyczy to zwykłych aplikacji (w tym serwera systemowego) na urządzeniu. Aplikacje są wyodrębniane z już uruchomionego procesu zygote, a proces zygote nie może wczytywać agentów.
Aby dołączyć agenta do aplikacji, która jest już uruchomiona, użyj tego polecenia:
adb shell cmd activity attach-agent [process] /path/to/agent/libagent.so[=agent-options]
Jeśli wtyczka JVMTI nie została jeszcze załadowana, dołączenie agenta spowoduje załadowanie zarówno wtyczki, jak i biblioteki agenta.
Agent może być dołączony tylko do uruchomionej aplikacji oznaczonej jako debuggable (część pliku manifestu aplikacji, w której atrybut android:debuggable
ma wartość true
w węźle aplikacji). Zarówno klasa ActivityManager
, jak i ART wykonują kontrole, zanim umożliwią dołączenie pracownika. Klasa ActivityManager sprawdza bieżące informacje o aplikacji (pochodzące z danych klasy PackageManager) pod kątem możliwości debugowania, a czas wykonywania sprawdza bieżący stan, który został ustawiony podczas uruchamiania aplikacji.
Lokalizacje agentów
Środowisko wykonawcze musi wczytywać agentów do bieżącego procesu, aby mogli oni bezpośrednio się z nim łączyć i z nim współpracować. Sam ART nie ma nic wspólnego z miejscem, z którego pochodzi agent. Ten ciąg znaków jest używany do wywołania dlopen
. Uprawnienia systemu plików i zasady SELinux ograniczają rzeczywiste wczytywanie.
Aby dostarczyć agentów, które można uruchomić w aplikacji debugującej, wykonaj te czynności:
- Umieszczanie agenta w katalogu biblioteki pliku APK aplikacji.
- Aby skopiować agenta do katalogu danych aplikacji, użyj polecenia
run-as
.
Interfejsy API
Do klasy android.os.Debug
dodano metodę 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 {
Inne interfejsy API Androida
Polecenie attach-agent jest widoczne publicznie. To polecenie łączy agenta JVMTI z działającym procesem:
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;\''
Polecenia am start -P
i am
start-profiler/stop-profiler
są podobne do polecenia attach-agent.
JVMTI
Ta funkcja udostępnia interfejs JVMTI agentom (kod natywny). Najważniejsze funkcje:
- zdefiniować zajęcia na nowo.
- śledzenie przydziału obiektów i zbierania elementów zbędących;
- Przechodzi po wszystkich obiektach w stosie, zgodnie z drzewem referencyjnym obiektów.
- Sprawdzanie stosów wywołań w Javie
- zawieszanie (i wznawianie) wszystkich wątków.
Różne wersje Androida mogą mieć różne możliwości.
Zgodność
Ta funkcja wymaga obsługi głównego środowiska uruchomieniowego, która jest dostępna tylko w Androidzie 8.0 lub nowszym. Producenci urządzeń nie muszą wprowadzać żadnych zmian, aby wdrożyć tę funkcję. Jest to część AOSP.
Weryfikacja
W przypadku Androida 8 i nowszych CTS sprawdza te elementy:
- Testy, które pracownicy obsługi klienta mogą dołączyć do aplikacji z możliwością debugowania, ale nie mogą dołączyć do aplikacji bez możliwości debugowania.
- testuje wszystkie zaimplementowane interfejsy API JVMTI;
- Sprawdzanie, czy interfejs binarny dla agentów jest stabilny
Do wersji 9 i wyższych dodano dodatkowe testy, które są uwzględniane w testach CTS w przypadku tych wersji.