SANATÇILAR İÇİN

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.

Enstrümante edilmiş bir uygulamada akış ve ara bağlantı
Şekil 1. Enstrümante edilmiş bir uygulamanın akışı ve birbirine bağlanması

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.