SANAT TI

Android 8.0 ve sonraki sürümlerde, ART Araç Oluşturma Arayüzü (ART TI) belirli çalışma zamanı dahili bileşenlerini ortaya çıkarır ve profil oluşturucuların ve hata ayıklayıcıların uygulamaların çalışma zamanı davranışını etkilemesine olanak tanır. Bu, yerel aracıların diğer platformlarda uygulanması için sağlanan son teknoloji ürünü performans araçlarını uygulamak için kullanılabilir.

Çalışma zamanı dahili öğeleri, çalışma zamanı sürecine yüklenen aracılara maruz kalır. Bunlar ART ile doğrudan aramalar ve geri aramalar yoluyla iletişim kurar. Çalışma zamanı, farklı ortogonal profil oluşturma konularının ayrılabilmesi için birden fazla aracıyı destekler. Aracılar çalışma zamanı başlangıcında sağlanabilir ( dalvikvm veya app_process çağrıldığında) veya halihazırda çalışmakta olan bir işleme eklenebilir.

Uygulama ve çalışma zamanı davranışını ölçme ve değiştirme yeteneği çok güçlü olduğundan, ART TI'ye iki güvenlik önlemi entegre edilmiştir:

  • İlk olarak, aracı arayüzünü ortaya çıkaran kod JVMTI, çalışma zamanının temel bir bileşeni olarak değil, bir çalışma zamanı eklentisi olarak uygulanır. Eklenti yüklemesi kısıtlanabilir, böylece aracıların arayüz noktalarından herhangi birini bulması engellenebilir.
  • İkincisi, hem ActivityManager sınıfı hem de çalışma zamanı süreci, aracıların yalnızca hata ayıklanabilir uygulamalara eklenmesine izin verir. Hata ayıklanabilir uygulamalar, geliştiricileri tarafından analiz edilmek ve kontrol edilmek üzere imzalanmıştır ve son kullanıcılara dağıtılmamaktadır. Google Play mağazası, hata ayıklaması yapılabilecek uygulamaların dağıtımına izin vermez. Bu, normal uygulamalara (temel bileşenler dahil) müdahale edilmemesini veya manipüle edilmemesini sağlar.

Tasarım

Cihazlı bir uygulamadaki genel akış ve ara bağlantı, Şekil 1'de gösterilmektedir.

Flow and interconnection in an instrumented app
Şekil 1. Cihazlı bir uygulamanın akışı ve ara bağlantısı

ART eklentisi libopenjdkjvmti , platformun ihtiyaçlarını ve kısıtlamalarını karşılamak üzere tasarlanmış ART TI'yı ortaya çıkarır:

  • Sınıfın yeniden tanımlanması, 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ımlamaya yönelik Java dili API'leri kullanıma sunulmaz.

ART TI ayrıca Android Studio profil oluşturucularını da destekler.

Bir aracı yükleyin veya ekleyin

Çalışma zamanı başlangıcında bir aracı eklemek için, hem JVMTI eklentisini hem de verilen aracıyı yüklemek için bu komutu kullanın:

dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …

Bir aracı, çalışma zamanı başlangıcında yüklendiğinde mevcut güvenlik önlemleri yoktur; bu nedenle, manuel olarak başlatılan bir çalışma zamanının, güvenlik önlemleri olmadan tam modifikasyona izin verdiğini unutmayın. (Bu ART testine izin verir.)

Not: Bu, cihazdaki normal uygulamalar (sistem sunucusu dahil) için geçerli değildir. Uygulamalar halihazırda çalışmakta olan bir zigottan çatallanır ve bir zigot işleminin aracıları yüklemesine izin verilmez.

Zaten çalışmakta olan bir uygulamaya bir aracı 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ının eklenmesi hem eklentiyi hem de aracı kitaplığını yükler.

Bir aracı yalnızca hata ayıklanabilir olarak işaretlenmiş çalışan bir uygulamaya eklenebilir (uygulama bildiriminin bir parçası, android:debuggable özelliği uygulama düğümünde true olarak ayarlanmıştır). Hem ActivityManager sınıfı hem de ART, bir aracının eklenmesine izin vermeden önce kontroller gerçekleştirir. ActivityManager sınıfı, hata ayıklanabilir durum için mevcut uygulama bilgilerini ( PackageManager sınıfı verilerinden türetilen) kontrol eder ve çalışma zamanı, uygulama başlatıldığında ayarlanan mevcut durumunu kontrol eder.

Temsilci konumları

Aracının doğrudan bağlanabilmesi ve onunla iletişim kurabilmesi için çalışma zamanının aracıları geçerli işleme yüklemesi gerekir. ART'ın kendisi, aracının geldiği spesifik konum konusunda agnostiktir. Dize bir dlopen çağrısı için kullanılır. Dosya sistemi izinleri ve SELinux politikaları gerçek yüklemeyi kısıtlar.

Hata ayıklanabilir bir uygulama tarafından çalıştırılabilecek aracılar sunmak için aşağıdakileri yapın:

  • Aracıyı uygulamanın APK'sının kitaplık dizinine yerleştirin.
  • Aracıyı uygulamanın veri dizinine kopyalamak için run-as kullanın.

API'ler

android.os.Debug dosyası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, çalışan bir işleme bir 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'sini aracılara (yerel kod) sunar. Önemli yetenekler şunları içerir:

  • Bir sınıfın yeniden tanımlanması.
  • Nesne tahsisi ve çöp toplamanın izlenmesi.
  • Nesnelerin referans ağacını takip ederek bir yığındaki tüm nesnelerin yinelenmesi.
  • Java çağrı yığınlarının incelenmesi.
  • Tüm ileti dizilerini askıya alın (ve devam ettirin).

Android'in farklı sürümlerinde farklı yetenekler mevcut olabilir.

Uyumluluk

Bu özellik, yalnızca Android 8.0 ve sonraki sürümlerde kullanılabilen çekirdek çalışma zamanı desteğine ihtiyaç duyar. Cihaz üreticilerinin bu özelliği uygulamak için herhangi bir değişiklik yapmasına gerek yoktur. AOSP'nin bir parçası.

Doğrulama

CTS, Android 8 ve sonraki sürümlerde aşağıdakileri test eder:

  • Aracıların hata ayıklaması yapılabilen uygulamalara eklendiğini ve hata ayıklaması yapılamayan uygulamalara eklenemediğini test eder.
  • Uygulanan tüm JVMTI API'lerini test eder
  • Aracılara yönelik ikili arayüzün kararlı olup olmadığını test eder

Android 9 ve sonraki sürümlere ek testler eklenmiştir ve bu sürümler için CTS testlerine dahil edilmiştir.