Manuel çabayı azaltmak ve genel ölçeklenebilirliği artırmak için Jetpack Macrobenchmark kitaplığını kullanarak profil kurallarının oluşturulmasını otomatikleştirmenizi önemle tavsiye ederiz. Ancak uygulamanızda profil kurallarını manuel olarak oluşturup ölçebilirsiniz.
Profil kurallarını manuel olarak tanımlama
src/main
dizininde baseline-prof.txt
adlı bir dosya oluşturarak bir uygulamada veya kitaplık modülünde profil kurallarını manuel olarak tanımlayabilirsiniz. Bu, AndroidManifest.xml
dosyasını içeren klasördür.
Dosyada her satırda bir kural belirtilir. Her kural, uygulama veya kitaplıktaki optimize edilmesi gereken eşleşen yöntemler ya da sınıflar için bir kalıbı temsil eder.
Bu kuralların söz dizimi, adb shell profman --dump-classes-and-methods
kullanıldığında kullanıcı tarafından okunabilen ART profil biçiminin (HRF) bir üst kümesidir. Söz dizimi, tanımlayıcılar ve imzalar için söz dizimine benzer ancak kural yazma sürecini basitleştirmek için joker karakterlerin kullanılmasına olanak tanır.
Aşağıdaki örnekte, Jetpack Compose kitaplığına dahil edilen birkaç Temel Profil kuralı gösterilmektedir:
HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V
HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I
HLandroidx/compose/runtime/ComposerImpl;->validateNodeExpected()V
PLandroidx/compose/runtime/CompositionImpl;->applyChanges()V
HLandroidx/compose/runtime/ComposerKt;->findLocation(Ljava/util/List;I)I
Landroidx/compose/runtime/ComposerImpl;
Bu örnek Derleyici Gezgini projesinde profil kurallarını değiştirmeyi deneyebilirsiniz. Derleyici Gezgini'nin yalnızca okunabilir ART profil biçimini (HRF) desteklediğini, bu nedenle joker karakterlerin desteklenmediğini unutmayın.
Kural söz dizimi
Bu kurallar, yöntemleri veya sınıfları hedeflemek için iki biçimden birinde olur:
[FLAGS][CLASS_DESCRIPTOR]->[METHOD_SIGNATURE]
Sınıf kuralları aşağıdaki kalıbı kullanır:
[CLASS_DESCRIPTOR]
Ayrıntılı açıklama için aşağıdaki tabloya bakın:
Sözdizimi | Açıklama |
---|---|
FLAGS |
Bu yöntemin, başlangıç türüne göre Hot , Startup veya Post Startup olarak işaretlenmesi gerekip gerekmediğini belirtmek için H , S ve P karakterlerinden birini veya daha fazlasını temsil eder. H işareti içeren bir yöntem, "sıcak" bir yöntem olduğunu gösterir. Yani bu yöntem, uygulamanın kullanım ömrü boyunca birçok kez çağrılır. S işareti içeren bir yöntem, başlatma sırasında çağrılan bir yöntem olduğunu gösterir. P işareti içeren bir yöntem, başlangıçtan sonra çağrılan bir yöntem olduğunu belirtir. Bu dosyada bulunan bir sınıf, başlangıç sırasında kullanıldığını ve sınıf yükleme maliyetini önlemek için yığınta önceden ayrılması gerektiğini gösterir. ART derleyicisi, bu yöntemlerin AOT derlenmesi ve oluşturulan AOT dosyasında düzen optimizasyonları gerçekleştirme gibi çeşitli optimizasyon stratejileri kullanır. |
CLASS_DESCRIPTOR |
Hedeflenen yöntemin sınıfı için tanımlayıcı. Örneğin, androidx.compose.runtime.SlotTable için tanımlayıcı Landroidx/compose/runtime/SlotTable; 'dur. Dalvik yürütülebilir (DEX) biçimi uyarınca L önek olarak eklenir. |
METHOD_SIGNATURE |
Yöntemin adı, parametre türleri ve döndürülen türleri dahil olmak üzere yöntemin imzası. Örneğin:// LayoutNode.kt fun isPlaced():Boolean { // ... } LayoutNode adresindeki isPlaced()Z imzasına sahiptir. |
Tek bir kuralın birden fazla yöntem veya sınıfı kapsaması için bu kalıplarda joker karakterler bulunabilir. Android Studio'da kural söz dizimini yazarken rehberli yardım için Android Temel Profilleri eklentisini inceleyin.
Joker karakter kuralı örneği şu şekilde olabilir:
HSPLandroidx/compose/ui/layout/**->**(**)**
Temel profil kurallarında desteklenen türler
Referans profil kuralları aşağıdaki türleri destekler. Bu türlerle ilgili ayrıntılar için Dalvik yürütülebilir (DEX) biçimi bölümüne bakın.
Karakter | Tür | Açıklama |
---|---|---|
B |
bayt | İmzalı bayt |
C |
char | UTF-16 ile kodlanmış Unicode karakter kod noktası |
D |
çift | Çift hassasiyetli kayan nokta değeri |
F |
float | Tek hassasiyetli kayan nokta değeri |
I |
int | Tam sayı |
J |
uzun | Uzun tam sayı |
S |
kısa video | İmzalı Shorts videosu |
V |
geçersiz | Geçersiz |
Z |
boole | Doğru veya yanlış |
L (sınıf adı) |
referans | Sınıf adı örneği |
Ayrıca, kitaplıklar AAR yapılarına paketlenmiş kurallar tanımlayabilir. Bu yapıları içerecek şekilde bir APK oluşturduğunuzda kurallar, manifest birleştirme işlemine benzer şekilde birleştirilir ve APK'ya özgü kompakt bir ikili ART profiline derlenir.
APK cihazlarda kullanıldığında ART, Android 9 (API düzeyi 28) veya ProfileInstaller
kullanılırken Android 7 (API düzeyi 24)'te yükleme sırasında uygulamanın belirli bir alt kümesini AOT derlemek için bu profilden yararlanır.
Temel profilleri manuel olarak toplama
Makro karşılaştırma kitaplığını ayarlamadan temel profil oluşturabilir ve kritik kullanıcı yolculuklarınızın kullanıcı arayüzü otomasyonlarını oluşturabilirsiniz. Makro karşılaştırmalarını kullanmanızı öneririz ancak bu her zaman mümkün olmayabilir. Örneğin, Gradle dışında bir derleme sistemi kullanıyorsanız Temel Profil Gradle eklentisini kullanamazsınız. Bu gibi durumlarda, temel profil kurallarını manuel olarak toplayabilirsiniz. API 34 ve sonraki sürümleri çalıştıran bir cihaz veya emülatör kullanıyorsanız bu işlem çok daha kolaydır. Daha düşük API düzeylerinde de mümkündür ancak root erişimi gerektirir ve AOSP resmi çalıştıran bir emülatör kullanmanız gerekir. Aşağıdakileri yaparak kuralları doğrudan toplayabilirsiniz:
- Uygulamanızın bir sürümünü test cihazına yükleyin. Doğru bir profil için uygulama derleme türü R8 için optimize edilmiş ve hata ayıklama yapılamayan bir tür olmalıdır.
- Profillerin derlenmediğinden emin olun.
API 34 ve sonraki sürümler
adb shell cmd package compile -f -m verify $PACKAGE_NAME adb shell pm art clear-app-profiles $PACKAGE_NAME
API 33 ve önceki sürümler
adb root adb shell cmd package compile --reset $PACKAGE_NAME
APK'nız Jetpack Profil Yükleyici kitaplığına bağımlıysa kitaplık, APK'nızın ilk başlatılmasında bir profil oluşturur. Bu, profil oluşturma sürecini etkileyebilir. Bu nedenle, aşağıdaki komutla devre dışı bırakın:
adb shell am broadcast -a androidx.profileinstaller.action.SKIP_FILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver
- Uygulamayı çalıştırın ve profil toplamak istediğiniz kritik kullanıcı yolculuklarında manuel olarak gezinin.
- ART'den profilleri dökmesini isteyin. APK'nız Jetpack Profile Installer kitaplığına bağımlıysa profilleri dökmek için bu kitaplığı kullanın:
Profil Yükleyici'yi kullanmıyorsanız aşağıdaki komutu kullanarak profilleri bir emülatöre manuel olarak aktarın:adb shell am broadcast -a androidx.profileinstaller.action.SAVE_FILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver adb shell am force-stop $PACKAGE_NAME
adb root adb shell killall -s SIGUSR1 $PACKAGE_NAME adb shell am force-stop $PACKAGE_NAME
- Profil oluşturma işleminin tamamlanması için en az beş saniye bekleyin.
- Oluşturulan ikili profilleri metne dönüştürün:
API 34 ve sonraki sürümler
adb shell pm dump-profiles --dump-classes-and-methods $PACKAGE_NAME
API 33 ve önceki sürümler
Referans profili mi yoksa mevcut profil mi oluşturulduğunu belirleyin. Referans profili aşağıdaki konumda bulunur:
/data/misc/profiles/ref/$$PACKAGE_NAME/primary.prof
Mevcut profil şu konumda bulunur:
/data/misc/profiles/cur/0/$PACKAGE_NAME/primary.prof
APK'nın konumunu belirleyin:
adb root adb shell pm path $PACKAGE_NAME
Dönüşüm işlemini gerçekleştirin:
adb root adb shell profman --dump-classes-and-methods --profile-file=$PROFILE_PATH --apk=$APK_PATH > /data/misc/profman/$PACKAGE_NAME-primary.prof.txt
- Depolanan profili cihazdan almak için
adb
'ü kullanın:adb pull /data/misc/profman/$PACKAGE_NAME-primary.prof.txt PATH_TO_APP_MODULE/src/main/
Bu işlem, oluşturulan profil kurallarını alır ve uygulama modülünüze yükler. Uygulamayı bir sonraki sefer derlediğinizde referans profili dahil edilir. Yükleme sorunları bölümündeki adımları uygulayarak bunu doğrulayın.
Uygulama iyileştirmelerini manuel olarak ölçme
Uygulama iyileştirmelerini karşılaştırma yoluyla ölçmenizi önemle tavsiye ederiz. Ancak iyileştirmeleri manuel olarak ölçmek istiyorsanız referans olarak optimizasyon yapılmamış uygulama başlatma süresini ölçerek başlayabilirsiniz.
PACKAGE_NAME=com.example.app
# Force Stop App adb shell am force-stop $PACKAGE_NAME # Reset compiled state adb shell cmd package compile --reset $PACKAGE_NAME
# Measure App startup # This corresponds to `Time to initial display` metric. adb shell am start-activity -W -n $PACKAGE_NAME/.ExampleActivity \ | grep "TotalTime"
Ardından, temel profili harici olarak yükleyin.
# Unzip the Release APK first. unzip release.apk
# Create a ZIP archive. # The name should match the name of the APK. # Copy `baseline.prof{m}` and rename it `primary.prof{m}`. cp assets/dexopt/baseline.prof primary.prof cp assets/dexopt/baseline.profm primary.profm
# Create an archive. zip -r release.dm primary.prof primary.profm
# Confirm that release.dm only contains the two profile files: unzip -l release.dm # Archive: release.dm # Length Date Time Name # --------- ---------- ----- ---- # 3885 1980-12-31 17:01 primary.prof # 1024 1980-12-31 17:01 primary.profm # --------- ------- # 2 files
# Install APK + Profile together. adb install-multiple release.apk release.dm
Paketin yükleme sırasında optimize edildiğini doğrulamak için aşağıdaki komutu çalıştırın:
# Check dexopt state.
adb shell dumpsys package dexopt | grep -A 1 $PACKAGE_NAME
Çıkışta paketin derlendiği belirtilmelidir:
[com.example.app]
path: /data/app/~~YvNxUxuP2e5xA6EGtM5i9A==/com.example.app-zQ0tkJN8tDrEZXTlrDUSBg==/base.apk
arm64: [status=speed-profile] [reason=install-dm]
Artık uygulama başlatma performansını, derlenmiş durumu sıfırlamadan önceki gibi ölçebilirsiniz. Paketin derlenmiş durumunu sıfırlamadığınızdan emin olun.
# Force stop app adb shell am force-stop $PACKAGE_NAME
# Measure app startup adb shell am start-activity -W -n $PACKAGE_NAME/.ExampleActivity \ | grep "TotalTime"
Referans Profiller ve profgen
Bu bölümde, profgen aracının bir Referans Profili'nin kompakt ikili sürümünü oluştururken ne yaptığı açıklanmaktadır.
Profgen-cli, ART profillerinin derlenmesi, iç gözlemi ve derlenmesine yardımcı olur. Böylece, hedef SDK sürümünden bağımsız olarak Android destekli cihazlara yüklenebilirler.
Profgen-cli, bir taban profilin HRF'sini derlenmiş biçimine derleyen bir KSA'dır. KSA, Android SDK'sının bir parçası olarak cmdline-tools
deposunda da bulunur.
Aşağıdaki özellikler studio-main
dalında kullanılabilir:
➜ ../cmdline-tools/latest/bin
apkanalyzer
avdmanager
lint
profgen
retrace
screenshot2
sdkmanager
Profgen-cli ile kompakt ikili profiller oluşturma
Profgen-cli ile kullanılabilen komutlar bin
, validate
ve dumpProfile
'dir. Kullanılabilir komutları görmek için profgen --help
simgesini kullanın:
➜ profgen --help
Usage: profgen options_list
Subcommands:
bin - Generate Binary Profile
validate - Validate Profile
dumpProfile - Dump a binary profile to a HRF
Options:
--help, -h -> Usage info
Kompakt ikili profili oluşturmak için bin
komutunu kullanın. Aşağıda örnek bir çağrı verilmiştir:
profgen bin ./baseline-prof.txt \
--apk ./release.apk \
--map ./obfuscation-map.txt \
--profile-format v0_1_0_p \
--output ./baseline.prof \
Kullanılabilir seçenekleri görmek için profgen bin options_list
simgesini kullanın:
Usage: profgen bin options_list
Arguments:
profile -> File path to Human Readable profile { String }
Options:
--apk, -a -> File path to apk (always required) { String }
--output, -o -> File path to generated binary profile (always required)
--map, -m -> File path to name obfuscation map { String }
--output-meta, -om -> File path to generated metadata output { String }
--profile-format, -pf [V0_1_0_P] -> The ART profile format version
{ Value should be one of [
v0_1_5_s, v0_1_0_p, v0_0_9_omr1, v0_0_5_o, v0_0_1_n
]
}
--help, -h -> Usage info
İlk bağımsız değişken, baseline-prof.txt
HRF'nin yolunu temsil eder.
Profgen-cli, APK'nın sürüm derlemesinin yoluna ve R8 veya Proguard kullanılırken APK'yı karartmak için kullanılan bir karartma haritasına da ihtiyaç duyar. Bu sayede profgen
, derlenmiş profili oluştururken HRF'deki kaynak sembolleri, karartılmış karşılıklarına çevirebilir.
ART profil biçimleri ileri veya geriye dönük uyumlu olmadığından, profgen
'ün gerektiğinde bir ART profil biçimini başka bir biçime kodlamak için kullanabileceğiniz profil meta verilerini (profm
) paketlemesi amacıyla bir profil biçimi sağlayın.
Profil biçimleri ve platform sürümleri
Profil biçimi seçerken aşağıdaki seçenekler kullanılabilir:
Profil biçimi | Platform sürümü | API seviyesi |
---|---|---|
v0_1_5_s | Android S+ | 31+ |
v0_1_0_p | Android P, Q ve R | 28-30 |
v0_0_9_omr1 | Android O MR1 | 27 |
v0_0_5_o | Android O | 26 |
v0_0_1_n | Android N | 24-25 |
baseline.prof
ve baseline.profm
çıkış dosyalarını APK'daki assets
veya dexopt
klasörüne kopyalayın.
Kod karartma haritaları
Yalnızca HRF kaynak simgeleri kullanıyorsa karartma haritasını sağlamanız gerekir. HRF, zaten kodu karartılmış bir sürüm derlemesinden oluşturulduysa ve eşleme gerekmiyorsa bu seçeneği yoksayabilir ve çıkışları assets
veya dexopt
klasörüne kopyalayabilirsiniz.
Temel profillerin geleneksel kurulumu
Taban profiller genellikle bir cihaza iki yoldan biri kullanılarak dağıtılır.
install-multiple
'ü DexMetadata ile kullanma
API 28 ve sonraki sürümleri çalıştıran cihazlarda Play istemcisi, yüklenen APK sürümünün APK'sını ve DexMetadata (DM) yükünü indirir. DM, cihazdaki Paket Yöneticisi'ne iletilen profil bilgilerini içerir.
APK ve DM, aşağıdaki gibi bir yöntem kullanılarak tek bir yükleme oturumunun parçası olarak yüklenir:
adb install-multiple base.apk base.dm
Jetpack ProfileInstaller
API düzeyi 29 ve sonraki sürümleri çalıştıran cihazlarda Jetpack ProfileInstaller kitaplığı, APK cihaza yüklendikten sonra assets
veya dexopt
içine paketlenmiş bir profili yüklemek için alternatif bir mekanizma sağlar. ProfileInstaller
, ProfileInstallReceiver
tarafından veya doğrudan uygulama tarafından çağrılır.
ProfileInstaller kitaplığı, hedef cihazın SDK sürümüne göre profili yeniden kodlar ve cihazdaki cur
dizinine (cihazdaki ART profilleri için pakete özel bir hazırlık dizini) kopyalar.
Cihaz boştayken profil, cihazda bg-dexopt
adlı bir işlem tarafından alınır.
Temel profili harici olarak yükleme
Bu bölümde, bir APK verildiğinde ana profilin nasıl yükleneceği açıklanmaktadır.
androidx.profileinstaller
ile anons yapma
API 24 ve sonraki sürümleri çalıştıran cihazlarda profili yükleme komutu yayınlayabilirsiniz:
# Broadcast the install profile command - moves binary profile from assets
# to a location where ART uses it for the next compile.
# When successful, the following command prints "1":
adb shell am broadcast \
-a androidx.profileinstaller.action.INSTALL_PROFILE \
<pkg>/androidx.profileinstaller.ProfileInstallReceiver
# Kill the process
am force-stop <pkg>
# Compile the package based on profile
adb shell cmd package compile -f -m speed-profile <pkg>
ProfileInstaller, Play'deki 450.000 uygulamanın yaklaşık 77.000'inde bulunan temel profillere sahip çoğu APK'da bulunmaz. Ancak Compose kullanan hemen her APK'da bulunur. Bunun nedeni, kitaplıkların ProfileInstaller'a bağımlı olduğunu belirtmeden profil sağlayabilmesidir. Profil içeren her kitaplığa bağımlılık ekleme özelliği, Jetpack'ten itibaren geçerlidir.
install-multiple
'yi profgen veya DexMetaData ile kullanma
API 28 ve sonraki sürümleri çalıştıran cihazlarda, uygulamada ProfileInstaller kitaplığının bulunmasına gerek kalmadan bir temel profil yükleyebilirsiniz.
Bunun için Profgen-cli'yi kullanın:
profgen extractProfile \
--apk app-release.apk \
--output-dex-metadata app-release.dm \
--profile-format V0_1_5_S # Select based on device and the preceding table.
# Install APK and the profile together
adb install-multiple appname-release.apk appname-release.dm
APK bölmelerini desteklemek için önceki profil ayıklama adımlarını APK başına bir kez çalıştırın. Yükleme sırasında, APK ve .dm
adlarının eşleştiğinden emin olarak her APK'yı ve ilişkili .dm
dosyasını iletin:
adb install-multiple appname-base.apk appname-base.dm \
appname-split1.apk appname-split1.dm
Doğrulama
Profilin doğru şekilde yüklenip yüklenmediğini doğrulamak için Uygulama iyileştirmelerini manuel olarak ölçme başlıklı makaledeki adımları uygulayabilirsiniz.
İkili profilin içeriğini dökme
Temel profilin kompakt ikili sürümünün içeriğini incelemek için Profgen-cli dumpProfile
seçeneğini kullanın:
Usage: profgen dumpProfile options_list
Options:
--profile, -p -> File path to the binary profile (always required)
--apk, -a -> File path to apk (always required) { String }
--map, -m -> File path to name obfuscation map { String }
--strict, -s [true] -> Strict mode
--output, -o -> File path for the HRF (always required) { String }
--help, -h -> Usage info
Kompakt ikili gösterim yalnızca DEX ofsetlerini depoladığından ve bu nedenle sınıf ve yöntem adlarını yeniden oluşturmak için bu ofsetlere ihtiyaç duyduğundan dumpProfile
, APK'ya ihtiyaç duyar.
Sıkı mod varsayılan olarak etkindir ve profilin APK'daki DEX dosyalarıyla uyumluluk kontrolü yapar. Başka bir araç tarafından oluşturulan profillerde hata ayıklama işlemi yapmaya çalışıyorsanız uyumluluk hataları alabilirsiniz. Bu hatalar, inceleme için döküm almanızı engelleyebilir. Bu gibi durumlarda --strict false
ile yüksek güvenlik modunu devre dışı bırakabilirsiniz. Ancak çoğu durumda yüksek güvenlik modunu etkin tutmanız gerekir.
Gizleme haritası isteğe bağlıdır. Sağlandığında, kullanım kolaylığı için gizlenen sembollerin insan tarafından okunabilen sürümleriyle yeniden eşlenmesine yardımcı olur.
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- SQLite performansı için en iyi uygulamalar
- Temel Profiller {:#baseline-profiles}
- Takılı kalan kısmi uyanık kalma kilitleri