Android 8.0 ve sonraki sürümlerde ART Aracı Arayüzü (ART TI), belirli çalışma zamanı dahili özelliklerini gösterir ve profilleyicilerin ve hata ayıklayıcıların uygulamaların çalışma zamanı davranışını etkilemesini sağlar. Bu, diğer platformlarda yerel aracılar uygulamak için sağlanan en son performans araçlarını uygulamak amacıyla kullanılabilir.
Çalışma zamanı dahili özellikleri, çalışma zamanı sürecine yüklenen aracılara gösterilir.
Bunlar, doğrudan aramalar ve geri aramalar aracılığıyla ART ile iletişim kurar. Çalışma zamanı, farklı ortogonal profilleme sorunlarının ayrılabilmesi için birden fazla aracıyı destekler. Temsilciler, çalışma zamanında başlangıçta (dalvikvm
veya app_process
çağrıldığında) sağlanabilir ya da zaten çalışan bir sürece eklenebilir.
Uygulama ve çalışma zamanı davranışını ölçeklendirme ve değiştirme özelliği çok güçlü olduğundan ART TI'ya iki güvenlik önlemi entegre edilmiştir:
- Öncelikle, aracı arayüzünü (JVMTI) gösteren kod, çalışma ortamının temel bileşeni değil, çalışma ortamı eklentisi olarak uygulanır. Eklenti yükleme işlemi kısıtlanabilir. Böylece, temsilcilerin arayüz noktalarından herhangi birini bulmasını engelleyebilirsiniz.
- İkinci olarak, hem
ActivityManager
sınıfı hem de çalışma zamanı işlemi yalnızca temsilcilerin hata ayıklama yapılabilir uygulamalara bağlanmasına izin verir. Hata ayıklama yapılabilir uygulamalar, geliştiricileri tarafından analiz edilmek ve araçlandırılmak üzere onaylanmış olup son kullanıcılara dağıtılmaz. Google Play Store, hata ayıklama yapılabilir uygulamaların dağıtılmasına izin vermez. Bu sayede, normal uygulamalar (temel bileşenler dahil) ayarlanamaz veya değiştirilemez.
Tasarım
Enstrümante edilmiş bir uygulamadaki genel akış ve bağlantılar Şekil 1'de gösterilmiştir.

ART eklentisi libopenjdkjvmti
, platformun ihtiyaçlarını ve kısıtlamalarını karşılamak için tasarlanmış ART TI'yi gösterir:
- Sınıf yeniden tanımlama, sınıf dosyaları yerine yalnızca tek bir sınıf tanımı içeren
Dex
dosyalarını temel alır. - Enstrümantasyon ve yeniden tanımlama için Java dili API'leri kullanıma sunulmaz.
ART TI, Android Studio profilleyicilerini de destekler.
Temsilci yükleme veya ekleme
Bir aracıyı çalışma zamanında başlatırken eklemek için hem JVMTI eklentisini hem de belirtilen aracı yüklemek üzere şu komutu kullanın:
dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …
Bir işleyici çalışma zamanında başlatılırken güvenlik önlemleri uygulanmaz. Bu nedenle, manuel olarak başlatılan çalışma zamanının güvenlik önlemleri olmadan tam değişiklik yapılmasına izin verdiğini unutmayın. (Bu, ART testine olanak tanır.)
Not: Bu durum, cihazdaki normal uygulamalar (sistem sunucusu dahil) için geçerli değildir. Uygulamalar, zaten çalışan bir zygote'tan ayrılır ve zygote işleminin aracı yüklemesine izin verilmez.
Halihazırda çalışan bir uygulamaya temsilci eklemek için şu komutu kullanın:
adb shell cmd activity attach-agent [process] /path/to/agent/libagent.so[=agent-options]
JVMTI eklentisi henüz yüklenmemişse bir aracı eklemek hem eklentiyi hem de aracı kitaplığını yükler.
Temsilci yalnızca hata ayıklama yapılabilir olarak işaretlenmiş çalışan bir uygulamaya (uygulama düğümünde android:debuggable
özelliği true
olarak ayarlanmış, uygulama manifest'inin bir parçası) bağlanabilir. Hem ActivityManager
sınıfı hem de ART, bir temsilcinin eklenmesine izin vermeden önce kontroller gerçekleştirir. ActivityManager sınıfı, hata ayıklama durumuna yönelik mevcut uygulama bilgilerini (PackageManager sınıf verilerinden türetilir) kontrol eder ve çalışma zamanı, uygulama başlatılırken ayarlanan mevcut durumunu kontrol eder.
Temsilci konumları
Çalışma zamanının, aracının doğrudan bağlanıp iletişim kurabilmesi için mevcut sürece aracı yüklemesi gerekir. ART, temsilcinin geldiği belirli konumla ilgili değildir. Dize, dlopen
araması için kullanılır. Dosya sistemi izinleri ve SELinux politikaları gerçek yüklemeyi kısıtlar.
Hata ayıklama yapılabilir bir uygulama tarafından çalıştırılabilen aracılar yayınlamak için aşağıdakileri yapın:
- Aracı, uygulamanın APK'sının kitaplık dizinine yerleştirin.
- Temsilciyi uygulamanın veri dizinine kopyalamak için
run-as
değerini kullanın.
API'ler
Aşağıdaki yöntem android.os.Debug
öğesine eklendi.
/** * 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 {
Diğer Android API'leri
attach-agent komutu herkese açıktır. Bu komut, çalışan bir sürece JVMTI aracısı ekler:
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;\''
am start -P
ve am
start-profiler/stop-profiler
komutları, attach-agent komutuna benzer.
JVMTI
Bu özellik, JVMTI API'yi aracılara (yerel kod) gösterir. Önemli özelliklerden bazıları şunlardır:
- Sınıfları yeniden tanımlama
- Nesne tahsisi ve atık toplamayı izleme.
- Nesnelerin referans ağacını izleyerek bir yığıntaki tüm nesneler üzerinde iterasyon yapma.
- Java çağrı yığınlarını inceleme.
- Tüm mesaj dizilerini askıya alma (ve devam ettirme).
Android'in farklı sürümlerinde farklı özellikler kullanılabilir.
Uyumluluk
Bu özellik için yalnızca Android 8.0 ve sonraki sürümlerde bulunan temel çalışma zamanı desteği gerekir. Cihaz üreticilerinin bu özelliği uygulamak için herhangi bir değişiklik yapması gerekmez. AOSP'nin bir parçasıdır.
Doğrulama
CTS, Android 8 ve sonraki sürümlerde aşağıdakileri test eder:
- Temsilcilerin hata ayıklanabilir uygulamalara bağlanıp hata ayıklanabilir olmayan uygulamalara bağlanamamasını test eder.
- Uygulanan tüm JVMTI API'lerini test eder.
- Temsilciler için ikili arayüzün kararlı olup olmadığını test eder.
Android 9 ve sonraki sürümlere ek testler eklendi ve bu sürümlerin CTS testlerine dahil edildi.