W Androidzie 8.0 i nowszych interfejs ART Tooling Interface (ART TI) udostępnia określone wewnętrzne środowiska wykonawczego oraz umożliwia programom profilującym i debugerom wpływanie na działania aplikacji w czasie działania aplikacji. Może to służyć do wdrażania najnowocześniejsze narzędzia do skutecznego wdrażania agentów natywnych na innych platformach.
Wewnętrzne środowisko wykonawcze są widoczne dla agentów, które zostały wczytane do procesu środowiska wykonawczego.
Komunikują się one z ART za pomocą bezpośrednich połączeń i wywołań zwrotnych. Środowisko wykonawcze
wspomaga wiele czynników, dzięki czemu różne problemy profilowania ortogonalnego
nie są rozdzielane. Agenty mogą być udostępniane podczas uruchamiania (gdy
są wywoływane (dalvikvm
lub app_process
) lub dołączane do
do istniejącego procesu.
Ponieważ możliwość dostosowywania i modyfikowania działania aplikacji oraz środowiska wykonawczego W ART TI zostały uwzględnione dwa środki bezpieczeństwa:
- Po pierwsze, kod prezentujący interfejs agenta, JVMTI, jest zaimplementowany jako wtyczką środowiska wykonawczego, a nie podstawowym komponentem środowiska wykonawczego. Wtyczka może być ładowana ograniczone, tak aby agenty nie mogły znaleźć żadnego interfejsu pkt.
- Po drugie, zarówno klasa
ActivityManager
, jak i proces środowiska wykonawczego zezwalają agentom tylko na dołączane do aplikacji z możliwością debugowania. Zarejestrowano aplikacje z możliwością debugowania przez programistów, aby je analizować i instrumentować, a nie są one rozpowszechniane użytkowników. Sklep Google Play nie zezwala na dystrybucję treści z możliwością debugowania aplikacji. Dzięki temu zwykłe aplikacje (w tym podstawowe komponenty) nie będą zmodyfikowane lub zmanipulowane.
Projektowanie
Ogólny przepływ i połączenie międzysieciowe w przypadku aplikacji instrumentalnej są przedstawione na tych stronach: Rysunek 1.
.
Wtyczka ART libopenjdkjvmti
udostępnia ART TI, czyli
zaprojektowany z myślą o potrzebach i ograniczeniach platformy:
- Ponowna definicja klasy jest oparta na plikach
Dex
, które zawierają tylko w przypadku pojedynczej klasy, a nie plików klas. - Interfejsy API w języku Java do instrumentacji i ponownego definiowania nie są nie są narażone na kontakt.
ART TI obsługuje także programy do profilowania Android Studio.
Wczytaj lub dołącz agenta
Aby dołączyć agenta podczas uruchamiania, użyj tego polecenia w celu wczytania Wtyczka JVMTI i dany agent:
dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …
Gdy agent jest ładowany w czasie działania, nie są stosowane środki bezpieczeństwa uruchamiania. Pamiętaj jednak, że w przypadku tego środowiska ręcznego można pełne modyfikacji bez stosowania środków bezpieczeństwa. (pozwala to na testy ART).
Uwaga: nie dotyczy to zwykłych aplikacji (w tym systemu serwer) na urządzeniu. Aplikacje zostały rozwidlone z działającej już zygoty, a proces zygote nie może wczytywać agentów.
Aby podłączyć agenta do już uruchomionej aplikacji, użyj tego polecenie:
adb shell cmd activity attach-agent [process] /path/to/agent/libagent.so[=agent-options]
Jeśli wtyczka JVMTI nie została jeszcze wczytana, dołączenie agenta spowoduje wczytanie obu z wtyczką i biblioteką agenta.
Agent można dołączyć tylko do uruchomionej aplikacji oznaczonej jako
debuggable (część pliku manifestu aplikacji zawierająca atrybut
android:debuggable
ustawiono na true
w aplikacji
). Skuteczność klasy ActivityManager
i reklamy ART
sprawdza się przed zezwoleniem na dołączenie agenta. przy użyciu interfejsu ActivityManager.
klasa sprawdza bieżące informacje o aplikacji (pochodzące z narzędzia PackageManager).
danych klasy) pod kątem stanu możliwości debugowania, a środowisko wykonawcze sprawdza swój bieżący stan
, która była ustawiona podczas uruchamiania aplikacji.
Lokalizacje agentów
Środowisko wykonawcze musi wczytać agenty do bieżącego procesu, aby agent
które można bezpośrednio z nim powiązać i z nim komunikować. Sama reklama ART jest niezależna
dotyczące konkretnej lokalizacji, z której przychodzi agent. Używany jest ciąg znaków.
aby nawiązać połączenie dlopen
. Uprawnienia systemu plików i zasady SELinux
ogranicza rzeczywiste wczytywanie.
Aby dostarczyć agenty, które mogą być uruchamiane przez aplikację z możliwością debugowania, wykonaj te czynności:
- Umieść agenta w katalogu bibliotek w pliku APK aplikacji.
- Użyj narzędzia
run-as
, aby skopiować agenta do danych aplikacji katalogu.
Interfejsy API
Ta metoda została dodana do 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 dla Androida
Polecenie Podłączania agenta jest widoczne publicznie. To polecenie dołącza JVMTI do uruchomionego procesu:
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 dołączać-agent.
Certyfikat JVMTI
Ta funkcja udostępnia interfejs JVMTI API (kod natywny). Ważne funkcje obejmują:
- Ponowne zdefiniowanie klasy.
- Śledzenie przydzielania obiektów i czyszczenia pamięci.
- Wykonanie iteracji na wszystkich obiektach na stercie zgodnie z drzewem referencyjnym obiektów.
- Sprawdzam stosy wywołań Java.
- Zawieszanie (i wznawianie) wszystkich wątków.
Poszczególne wersje na urządzeniu z Androidem.
Zgodność
Ta funkcja wymaga obsługi środowiska wykonawczego, która jest dostępna tylko na Androidzie 8.0 i wyższe. Producenci urządzeń nie muszą wprowadzać żadnych zmian tę funkcję. Jest częścią AOSP.
Weryfikacja
CTS testuje te elementy na Androidzie 8 i nowszych:
- Testy dołączane przez agenty do aplikacji z możliwością debugowania i niepodłączone do aplikacji, których nie można debugować.
- Testuje wszystkie zaimplementowane interfejsy API JVMTI
- Sprawdza, czy interfejs binarny agentów jest stabilny
W Androidzie 9 i nowszych wersjach dodaliśmy dodatkowe testy. Są one teraz dostępne w testach CTS tych wersji.