Android 8.0 ve sonraki sürümlerde, ART Tooling Interface (ART TI) belirli çalışma zamanı dahili değerlerini etkiler ve profil oluşturucular ile hata ayıklayıcıların uygulamaların çalışma zamanı davranışı. Bu, dönüşüm kabiliyetini performans araçlarını kullanarak son teknoloji ürünü yerel aracılara yönelik olarak tasarlanmıştır.
Çalışma zamanı dahili öğeleri, çalışma zamanı işlemine yüklenmiş aracılara gösterilir.
Bunlar, doğrudan aramalar ve geri çağırmalar yoluyla ART ile iletişim kurar. Çalışma zamanı
birden fazla aracıyı destekler. Böylece, farklı dikey profil çıkarma sorunlarının
ayırın. Aracılar çalışma zamanı başlangıcında sağlanabilir (
dalvikvm
veya app_process
çağrılır) ya da
bir süreci ifade eder.
Çünkü uygulama ve çalışma zamanı davranışını enstrümantasyon ve değiştirme becerisi ART TI'ya iki güvenlik önlemi entegre edilmiştir:
- İlk olarak, aracı arayüzünü (JVMTI) açığa çıkaran kod, eklentisidir, çalışma zamanının temel bir bileşeni değildir. Eklenti yükleniyor olabilir Bu nedenle, aracıların herhangi bir arayüzü bulması engellenebilir puan.
- İkinci olarak, hem
ActivityManager
sınıfı hem de çalışma zamanı işlemi yalnızca aracıların hata ayıklaması yapılabilir uygulamalara ekleyin. Hata ayıklanabilir uygulamaların oturumu kapatıldı tarafından analiz edilip enstrümantasyon için yürütülmesi ve son kullanıcılara ulaşabilirsiniz. Google Play Store, hata ayıklaması yapılabilecek dosyaların dağıtımına izin vermiyor. Bu, normal uygulamaların (temel bileşenler dahil) enstrümanlı veya çarpıtılmış olması.
Tasarım
Araçlı bir uygulamadaki genel akış ve ara bağlantı şurada gösterilir: 1. Şekil.
'nı inceleyin.
libopenjdkjvmti
ART eklentisi ART TI'yı ortaya çıkarır.
ve kısıtlarını karşılayacak şekilde tasarlanan
- Sınıf yeniden tanımı, yalnızca bir içeren
Dex
dosyasını temel alır. sınıf dosyaları yerine tek bir sınıf tanımını kullanabilir. - Enstrümantasyon ve yeniden tanımlama için Java dili API'leri test edilir.
ART TI, Android Studio profil araçlarını da destekler.
Aracı yükleme veya ekleme
Çalışma zamanı başlangıcında bir aracı eklemek için hem JVMTI eklentisi ve belirtilen aracı:
dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …
Çalışma zamanında bir aracı yüklenirken uygulanan güvenlik önlemleri yoktur başlatmadan önce manuel olarak başlatılan bir çalışma zamanının, olmadan yapılan değişiklikler de dahil. (Bu, ART testine olanak tanır.)
Not: Bu, normal uygulamalar (sistem dahil) için geçerli değildir. sunucu) kullanır. Uygulamalar zaten çalışan bir zigottan çatallanır. ve zigot işleminin aracıları yüklemesine izin verilmez.
Çalışmakta olan bir uygulamaya aracı eklemek için şunu kullanın: komut:
adb shell cmd activity attach-agent [process] /path/to/agent/libagent.so[=agent-options]
JVMTI eklentisi henüz yüklenmediyse bir aracı eklediğinizde hem kitaplığını oluşturur.
Bir aracı yalnızca
debuggable (uygulamanın manifest dosyasının bir parçası,
android:debuggable
, uygulamada true
olarak ayarlandı
düğüm). Hem ActivityManager
sınıfı hem de ART performansı
e-posta adresini kontrol eder. ActivityManager
sınıfı, geçerli uygulama bilgilerini kontrol eder (PackageManager'dan türetilir)
sınıf verileri) kullandığınızdan emin olun ve çalışma zamanı, mevcut durumunu kontrol ediyorsa
Bu ayar, uygulama başlatıldığında ayarlanır.
Temsilci konumları
Çalışma zamanının, aracıları mevcut sürece yüklemesi gerekir.
ona doğrudan bağlanıp iletişim kurabilmeyi sağlar. ART'ın kendisi bağımsızdır
geldiği yeri görebilirsiniz. Dize,
dlopen
araması için. Dosya sistemi izinleri ve SELinux politikaları
gerçek yüklemeyi sınırlandırır.
Hata ayıklaması yapılabilir bir uygulama tarafından çalıştırılabilecek aracıları yayınlamak için aşağıdakileri yapın:
- Aracıyı, uygulamanın APK'sının kitaplık dizinine yerleştirin.
- Aracıyı uygulama verilerine kopyalamak için
run-as
kullanın dizin.
API'ler
android.os.Debug
alanına aşağıdaki yöntem 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 herkes tarafından görülebilir. Bu komut, bir JVMTI aracısını çalışan bir işleme dönüştürün:
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ı Insert-agent komutuna benzer.
JVMTI
Bu özellik, JVMTI API'yi temsilcilere gösterir (yerel kod). Önemli özellikler arasında şunlar bulunur:
- Sınıf yeniden tanımlanıyor.
- Nesne ayırma ve atık toplama izleme.
- Şu referans ağacını izleyerek bir yığındaki tüm nesneleri yineleme nesneler'i tıklayın.
- Java çağrısı yığınlarını inceleme.
- Tüm ileti dizileri askıya alınıyor (ve devam ettiriliyor).
Google Etiket Yöneticisi'nin farklı sürümlerinde Android
Uyumluluk
Bu özellik, yalnızca Android 8.0'da kullanılabilen temel çalışma zamanı desteğine ihtiyaç duyar ve daha yüksek olabilir. Cihaz üreticilerinin uygulamak için herhangi bir değişiklik yapması gerekmez bu özelliği kullanabilirsiniz. AOSP'nin bir parçasıdır.
Doğrulama
CTS, Android 8 ve sonraki sürümlerde aşağıdakileri test eder:
- Aracıların hata ayıklaması yapılabilir uygulamalara eklediği ve uygulamalardır.
- Uygulanan tüm JVMTI API'lerini test eder
- Aracılar için ikili arayüzün kararlı olup olmadığını test eder
Android 9 ve sonraki sürümlere ek testler eklenmiştir ve testler dahildir. bu çalışmaların CTS testlerine dahil oldular.