ART hizmeti yapılandırması

Başlamadan önce ART Hizmeti hakkında üst düzey bir genel bakışa göz atın.

Android 14'ten itibaren şunun için cihaz üzerinde AOT derlemesi: uygulamaları (dexopt olarak da bilinir), ART Hizmeti tarafından işlenir. ART Hizmeti, ART'ın bir parçasıdır modülünü kullanabilir ve sistem özellikleri ve API'ler aracılığıyla özelleştirebilirsiniz.

Sistem özellikleri

ART Hizmeti, alakalı tüm bilgileri dex2oat seçenekleri hakkında daha fazla bilgi edinin.

Ayrıca, ART Hizmeti aşağıdaki sistem özelliklerini de destekler:

pm.dexopt.<sebep>

Bu, varsayılan derleyici filtrelerini belirleyen bir dizi sistem özelliğidir (Dexopt senaryolarında açıklanan önceden tanımlanmış tüm derleme nedenleri için)

Daha fazla bilgi için bkz. Derleyici filtreleri.

Standart varsayılan değerler şunlardır:

pm.dexopt.first-boot=verify
pm.dexopt.boot-after-ota=verify
pm.dexopt.boot-after-mainline-update=verify
pm.dexopt.bg-dexopt=speed-profile
pm.dexopt.inactive=verify
pm.dexopt.cmdline=verify

pm.dexopt.shared (varsayılan: hız)

Bu, diğer uygulamalar tarafından kullanılan uygulamalar için yedek derleyici filtresidir.

Prensip olarak, ART Service aşağıdaki veriler için profil rehberliğinde derleme (speed-profile) yapar: tüm uygulamalarda (genellikle arka plan kaldırma işlemi sırasında) Ancak, başka uygulamalar tarafından kullanılan bazı uygulamalar (<uses-library> tarihine kadar olan veya yüklenen uygulamalar) şununla dinamik olarak Context#createPackageContext kullanarak CONTEXT_INCLUDE_CODE). Bu tür uygulamalar, yerel gizlilik nedeniyle devre dışı bırakılır.

Bu tür uygulamalar için profil rehberli derleme istenirse önce ART Hizmeti bir bulut profili kullanmaya çalışıyor. Bir bulut profili yoksa ART Hizmeti pm.dexopt.shared tarafından belirtilen derleyici filtresini kullanır.

İstenen derleme profil yönlendirmeli değilse bu özelliğin hiçbir etkisi olmaz.

pm.dexopt.<reason>.concurrency (varsayılan: 1)

Bu, önceden tanımlanmış belirli derlemeler için dex2oat çağrı sayısıdır nedenler (first-boot, boot-after-ota, boot-after-mainline-update ve bg-dexopt) tıklayın.

Bu seçeneğin etkisinin dex2oat kaynak kullanım seçenekleri (dalvik.vm.*dex2oat-threads, dalvik.vm.*dex2oat-cpu-set ve görev profilleri):

  • dalvik.vm.*dex2oat-threads, her dex2oat için iş parçacığı sayısını kontrol eder çağrı, pm.dexopt.<reason>.concurrency ise çağrının sayısını kontrol eder dex2oat çağrıları. Yani maksimum eşzamanlı iş parçacığı iki sistem özelliğinin çarpımıdır.
  • dalvik.vm.*dex2oat-cpu-set ve görev profilleri her zaman CPU çekirdeğini bağlar maksimum eşzamanlı iş parçacığı sayısından bağımsız olarak bölümüne bakın).

Tek bir dex2oat çağrısı, ne olursa olsun tüm CPU çekirdeklerini tam olarak kullanmayabilir / dalvik.vm.*dex2oat-threads. Dolayısıyla, dex2oat sayısını artırmak çağrılar (pm.dexopt.<reason>.concurrency) CPU çekirdeklerinden daha iyi yararlanabilir. Dexopt'in genel ilerlemesini hızlandırabilir. Bu, özellikle de başlatın.

Ancak, çok fazla dex2oat çağrısı olması, cihazın bitmesine neden olabilir. Bu durum, dalvik.vm.dex2oat-swap ürününün Değiştirme dosyası kullanımına izin vermek için true. Çok fazla çağrı, bağlam değiştirmiyor. Bu nedenle, bu sayı mutlaka ayrı ayrı değerlendirebiliriz.

pm.dexopt.downgrade_after_inactive_days (varsayılan: ayarlanmadı)

Bu seçenek belirlenirse ART Hizmeti yalnızca son belirtilen uygulama içinde kullanılan uygulamaları devre dışı bırakır. gün sayısı.

Ayrıca, depolama alanı neredeyse azaldıysa arka plan kaldırma işlemi sırasında ART Hizmeti belirtilen son süre içinde kullanılmayan uygulamaların derleyici filtresini düşürür gün sayısı. Bunun derleyici nedeni inactive, ve derleyici filtresi pm.dexopt.inactive tarafından belirlenir. Alan eşik değeri, Depolama Alanı Yöneticisi'nin düşük alan eşiğidir. (sys_storage_threshold_percentage ve global ayarlar üzerinden yapılandırılabilir) sys_storage_threshold_max_bytes, varsayılan: 500 MB) artı 500 MB.

Paket listesini ArtManagerLocal#setBatchDexoptStartCallback, sağlanan listedeki paketler bg-dexopt için BatchDexoptStartCallback tarafından eski sürüme geçilmez.

pm.dexopt.disable_bg_dexopt (varsayılan: yanlış)

Bu yalnızca test amaçlıdır. ART Hizmetinin arka planı programlamasını engeller dexopt işi.

Arka plan kaldırma işi zaten planlandı ancak henüz çalıştırılmadıysa seçeneğinin etkisi yoktur. Yani iş çalışmaya devam eder.

Arka planda kaldırma işinin çalışmasını önlemek için önerilen bir komut dizisi çalışıyor:

setprop pm.dexopt.disable_bg_dexopt true
pm bg-dexopt-job --disable

İlk satır, henüz planlanmadı. İkinci satır, aşağıdaki durumlarda arka plan kaldırma işinin planlamasını kaldırır: zaten planlanmışsa arka plan kaldırma işini hemen iptal eder. çalışıyor.

ART Hizmeti API'leri

ART Hizmeti, özelleştirme için Java API'lerini sunar. API'ler şurada tanımlanmıştır: ArtManagerLocal Javadoc'u şurada görüntüleyin: Şunun için art/libartservice/service/java/com/android/server/art/ArtManagerLocal.java: kullanımları (Android 14 kaynağı, yayınlanmamış geliştirme kaynağı).

ArtManagerLocal, LocalManagerRegistry tarafından sahip olunan bir tekillik. Yardımcı com.android.server.pm.DexOptHelper#getArtManagerLocal işlevi size ele alacağız.

import static com.android.server.pm.DexOptHelper.getArtManagerLocal;

API'lerin çoğu için PackageManagerLocal.FilteredSnapshot örneği gerekir. içeren bir e-posta alırsınız. Bu numarayı arayarak alabilirsiniz PackageManagerLocal#withFilteredSnapshot, burada PackageManagerLocal bir değerdir LocalManagerRegistry tarafından sahip olunan ve com.android.server.pm.PackageManagerServiceUtils#getPackageManagerLocal.

import static com.android.server.pm.PackageManagerServiceUtils.getPackageManagerLocal;

Aşağıda, API'lerin bazı tipik kullanım alanları verilmiştir.

Bir uygulama için dexopt'yi tetikleme

Dilediğiniz zaman şunu çağırarak herhangi bir uygulama için dexopt'yi tetikleyebilirsiniz: ArtManagerLocal#dexoptPackage

try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
  getArtManagerLocal().dexoptPackage(
      snapshot,
      "com.google.android.calculator",
      new DexoptParams.Builder(ReasonMapping.REASON_INSTALL).build());
}

Kendi dexopt nedeninizi de iletebilirsiniz. Bunu yaparsanız öncelik sınıfı ve derleyici filtresi açık bir şekilde ayarlanmalıdır.

try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
  getArtManagerLocal().dexoptPackage(
      snapshot,
      "com.google.android.calculator",
      new DexoptParams.Builder("my-reason")
          .setCompilerFilter("speed-profile")
          .setPriorityClass(ArtFlags.PRIORITY_BACKGROUND)
          .build());
}

Dexopt'yi iptal et

Bir işlem, bir dexoptPackage çağrısı tarafından başlatılırsa iptal sinyali oluşturur. Bu dexopt'yi eşzamansız olarak çalıştırdığınızda yararlı olabilir.

Executor executor = ...;  // Your asynchronous executor here.
var cancellationSignal = new CancellationSignal();
executor.execute(() -> {
  try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
    getArtManagerLocal().dexoptPackage(
        snapshot,
        "com.google.android.calculator",
        new DexoptParams.Builder(ReasonMapping.REASON_INSTALL).build(),
        cancellationSignal);
  }
});

// When you want to cancel the operation.
cancellationSignal.cancel();

Ayrıca, ART Hizmeti tarafından başlatılan arka plan devre dışı bırakma işlemini de iptal edebilirsiniz.

getArtManagerLocal().cancelBackgroundDexoptJob();

Dexopt sonuçlarını al

Bir işlem, dexoptPackage çağrısı tarafından başlatılırsa sonucu alabilirsiniz bulunur.

DexoptResult result;
try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
  result = getArtManagerLocal().dexoptPackage(...);
}

// Process the result here.
...

ART Hizmeti, birçok senaryoda dexopt işlemleri başlatır. Örneğin: arka plan dexopt'si. İşlemin gerçekleşip gerçekleşmediğine bakılmaksızın tüm kaldırma sonuçlarını dinlemek için bir dexoptPackage çağrısı veya ART Hizmeti tarafından başlatılmışsa ArtManagerLocal#addDexoptDoneCallback.

getArtManagerLocal().addDexoptDoneCallback(
    false /* onlyIncludeUpdates */,
    Runnable::run,
    (result) -> {
      // Process the result here.
      ...
    });

İlk bağımsız değişken, sonuca yalnızca güncellemelerin dahil edilip edilmeyeceğini belirler. Eğer yalnızca dexopt tarafından güncellenen paketleri dinlemek istiyorsanız bunu true olarak ayarlayın.

İkinci bağımsız değişken, geri çağırmanın yürütücüsüdür. Geri çağırmayı şurada yürütmek için: dexopt işlemi gerçekleştiren ileti dizisinde Runnable::run kullanın. Etiketin dexopt'yi engellemek için geri çağırma işlemi yapmak istiyorsanız eşzamansız bir yürütücü kullanın.

Birden fazla geri arama ekleyebilirsiniz. ART Hizmeti bunların tümünü yürütür sırayla yüklüyoruz. Geri çağırmaların tümü, gelecekteki tüm aramalar için etkin kalır. bu bilgilerden yararlanabilirsiniz.

Bir geri çağırmayı kaldırmak isterseniz ekleyin ve ArtManagerLocal#removeDexoptDoneCallback kullanın.

DexoptDoneCallback callback = (result) -> {
  // Process the result here.
  ...
};

getArtManagerLocal().addDexoptDoneCallback(
    false /* onlyIncludeUpdates */, Runnable::run, callback);

// When you want to remove it.
getArtManagerLocal().removeDexoptDoneCallback(callback);

Paket listesini ve dexopt parametrelerini özelleştirme

ART Hizmeti, başlatma ve arka plan sırasında dexopt işlemlerini kendisi başlatır dexopt. Paket listesini veya bu işlemler için dexopt parametrelerini özelleştirmek isterseniz ArtManagerLocal#setBatchDexoptStartCallback kullanın.

getArtManagerLocal().setBatchDexoptStartCallback(
    Runnable::run,
    (snapshot, reason, defaultPackages, builder, cancellationSignal) -> {
      switch (reason) {
        case ReasonMapping.REASON_BG_DEXOPT:
          var myPackages = new ArrayList<String>(defaultPackages);
          myPackages.add(...);
          myPackages.remove(...);
          myPackages.sort(...);
          builder.setPackages(myPackages);
          break;
        default:
          // Ignore unknown reasons.
      }
    });

Paket listesine öğe ekleyebilir, listeden öğe kaldırabilir, listeyi sıralayabilir veya tamamen farklı bir liste kullanın.

Geri arama işleminiz bilinmeyen nedenleri yoksaymalıdır çünkü sahip olacaksınız.

En fazla bir BatchDexoptStartCallback ayarlayabilirsiniz. Geri çağırma devam eder gelecekteki tüm aramalar için etkin olacaktır.

Geri çağırmayı silmek isterseniz ArtManagerLocal#clearBatchDexoptStartCallback

getArtManagerLocal().clearBatchDexoptStartCallback();

Arka plan dexopt işinin parametrelerini özelleştir

Varsayılan olarak arka plan kaldırma işi, cihaz boştayken günde bir kez çalışır ve şarj oluyor. Bu ayar, ArtManagerLocal#setScheduleBackgroundDexoptJobCallback

getArtManagerLocal().setScheduleBackgroundDexoptJobCallback(
    Runnable::run,
    builder -> {
      builder.setPeriodic(TimeUnit.DAYS.toMillis(2));
    });

En fazla bir ScheduleBackgroundDexoptJobCallback ayarlayabilirsiniz. Geri çağırma, siz silmediğiniz sürece gelecekteki tüm aramalar için etkin kalmaya devam eder.

Geri çağırmayı silmek isterseniz ArtManagerLocal#clearScheduleBackgroundDexoptJobCallback

getArtManagerLocal().clearScheduleBackgroundDexoptJobCallback();

Dexopt'yi geçici olarak devre dışı bırak

ART Hizmeti tarafından başlatılan herhangi bir dexopt işlemi şunu tetikler: BatchDexoptStartCallback İşlemleri iptal etmeye devam ederek dexopt'yi etkili bir şekilde devre dışı bırakır.

İptal ettiğiniz işlem arka plan dexopt ise varsayılan komutu uygular yeniden deneme politikası (30 saniye, üstel, 5 saatle sınırlı).

// Good example.

var shouldDisableDexopt = new AtomicBoolean(false);

getArtManagerLocal().setBatchDexoptStartCallback(
    Runnable::run,
    (snapshot, reason, defaultPackages, builder, cancellationSignal) -> {
      if (shouldDisableDexopt.get()) {
        cancellationSignal.cancel();
      }
    });

// Disable dexopt.
shouldDisableDexopt.set(true);
getArtManagerLocal().cancelBackgroundDexoptJob();

// Re-enable dexopt.
shouldDisableDexopt.set(false);

En fazla bir BatchDexoptStartCallback olabilir. Ayrıca Paket listesini veya dexopt parametrelerini özelleştirmek için BatchDexoptStartCallback, kodu tek bir geri çağırmada birleştirmeniz gerekir.

// Bad example.

// Disable dexopt.
getArtManagerLocal().unscheduleBackgroundDexoptJob();

// Re-enable dexopt.
getArtManagerLocal().scheduleBackgroundDexoptJob();

Uygulama yüklemede gerçekleştirilen dexopt işlemi, ART tarafından başlatılmıyor Hizmet. Bunun yerine, işlem paket yöneticisi tarafından dexoptPackage arama. Bu nedenle, bir veri kaynağı tetiklemez BatchDexoptStartCallback. Uygulama yüklemede dexopt'yi devre dışı bırakmak için dexoptPackage adlı iş ortağını aramasını engeller.

Belirli paketler için derleyici filtresini geçersiz kılma (Android 15 ve sonraki sürümler)

Belirli paketler için derleyici filtresini geçersiz kılmak için bir setAdjustCompilerFilterCallback üzerinden geri arama. Geri çağırmaya dexopt'in başlatma aşamasından bağımsız olarak, bir paket Başlatma ve arka plan kaldırma sırasında veya bir dexoptPackage API çağrısıyla ART Hizmeti.

Bir paket için ayarlama yapılması gerekmiyorsa geri çağırma işleminin sonucu originalCompilerFilter

getArtManagerLocal().setAdjustCompilerFilterCallback(
    Runnable::run,
    (packageName, originalCompilerFilter, reason) -> {
      if (isVeryImportantPackage(packageName)) {
        return "speed-profile";
      }
      return originalCompilerFilter;
    });

Yalnızca bir AdjustCompilerFilterCallback ayarlayabilirsiniz. Raporlarınızda Birden çok öğe için derleyici filtresini geçersiz kılmak üzere AdjustCompilerFilterCallback kodu tek bir geri çağırmada birleştirmeniz gerekir. Geri çağırma devam eder gelecekteki tüm aramalar için etkin olacaktır.

Geri çağırmayı silmek isterseniz ArtManagerLocal#clearAdjustCompilerFilterCallback

getArtManagerLocal().clearAdjustCompilerFilterCallback();

Diğer özelleştirmeler

ART Hizmeti diğer bazı özelleştirmeleri de destekler.

Arka plan dexopt'si için termal eşiği ayarlayın

Arka plan dexopt işinin termal kontrolü, İş Planlayıcı tarafından gerçekleştirilir. Sıcaklık ulaştığında iş hemen iptal edilir THERMAL_STATUS_MODERATE. Eşiğin THERMAL_STATUS_MODERATE ayarlanabilir.

Arka plan dexopt'nin çalışıp çalışmadığını belirleyin

Arka plan çıkarma işi İş Planlayıcı tarafından yönetilir ve iş kimliği: 27873780 İşin çalışıp çalışmadığını belirlemek için İş Planlayıcı API'lerini kullanın.

// Good example.

var jobScheduler =
    Objects.requireNonNull(mContext.getSystemService(JobScheduler.class));
int reason = jobScheduler.getPendingJobReason(27873780);

if (reason == PENDING_JOB_REASON_EXECUTING) {
  // Do something when the job is running.
  ...
}
// Bad example.

var backgroundDexoptRunning = new AtomicBoolean(false);

getArtManagerLocal().setBatchDexoptStartCallback(
    Runnable::run,
    (snapshot, reason, defaultPackages, builder, cancellationSignal) -> {
      if (reason.equals(ReasonMapping.REASON_BG_DEXOPT)) {
        backgroundDexoptRunning.set(true);
      }
    });

getArtManagerLocal().addDexoptDoneCallback(
    false /* onlyIncludeUpdates */,
    Runnable::run,
    (result) -> {
      if (result.getReason().equals(ReasonMapping.REASON_BG_DEXOPT)) {
        backgroundDexoptRunning.set(false);
      }
    });

if (backgroundDexoptRunning.get()) {
  // Do something when the job is running.
  ...
}

Dexopt için profil sağlayın

Dexopt'ye rehberlik etmek üzere bir profil kullanmak için.prof.dm APK'ya dokunun.

.prof dosyası ikili biçimde bir profil dosyası ve dosya adı APK'nın dosya adı + .prof. Örneğin,

base.apk.prof

.dm dosyasının dosya adı, uzantı .dm ile değiştirildi. Örneğin,

base.dm

Profilin dexopt için kullanıldığını doğrulamak üzere dexopt'yi speed-profile ve sonucu kontrol edin.

pm art clear-app-profiles <package-name>
pm compile -m speed-profile -f -v <package-name>

İlk satır, çalışma zamanı tarafından oluşturulan tüm profilleri (ör. /data/misc/profiles), varsa APK'nın yanındaki profilin ART Service'in kullanabileceği tek profil. İkinci satır dexopt'yi çalıştırır speed-profile ile başlar ve ayrıntılı sonucu yazdırmak için -v geçer.

Profil kullanılıyorsa, sayfada actualCompilerFilter=speed-profile ifadesini görürsünüz. yardımcı olur. Aksi durumda actualCompilerFilter=verify görürsünüz. Örneğin,

DexContainerFileDexoptResult{dexContainerFile=/data/app/~~QR0fTV0UbDbIP1Su7XzyPg==/com.google.android.gms-LvusF2uARKOtBbcaPHdUtQ==/base.apk, primaryAbi=true, abi=x86_64, actualCompilerFilter=speed-profile, status=PERFORMED, dex2oatWallTimeMillis=4549, dex2oatCpuTimeMillis=14550, sizeBytes=3715344, sizeBeforeBytes=3715344}

ART Hizmeti'nin bu profili kullanmamasının tipik nedenleri şunlardır:

  • Profilin dosya adı yanlış veya APK'nın yanında değil.
  • Profilin biçimi yanlış.
  • Profil, APK ile eşleşmiyor. (Profildeki sağlamalar, APK'daki .dex dosyalarının sağlamaları ile eşleşir.)