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.)