Manuel çalışmayı 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 profil kurallarını bir uygulamada veya kitaplık modülünde manuel olarak tanımlayabilirsiniz. Bu, AndroidManifest.xml dosyasını içeren klasörle aynıdır.
Dosyada her satırda bir kural belirtilir. Her kural, uygulamadaki veya kitaplıktaki optimize edilmesi gereken yöntemleri ya da sınıfları eşleştirmek için bir kalıbı temsil eder.
Bu kuralların söz dizimi, adb shell profman --dump-classes-and-methods kullanılırken insan tarafından okunabilen ART profil biçiminin (HRF) bir üst kümesidir. Söz dizimi, tanımlayıcılar ve imzalar için kullanılan 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ığında bulunan 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 Compiler Explorer projesinde profil kurallarını değiştirmeyi deneyebilirsiniz. Compiler Explorer yalnızca okunabilir ART profili biçimini (HRF) desteklediğinden joker karakterler desteklenmez.
Kural söz dizimi
Bu kurallar, yöntemleri veya sınıfları hedeflemek için iki biçimden birini alır:
[FLAGS][CLASS_DESCRIPTOR]->[METHOD_SIGNATURE]
Sınıf kuralı aşağıdaki kalıbı kullanır:
[CLASS_DESCRIPTOR]
Ayrıntılı açıklama için aşağıdaki tabloya bakın:
| Söz dizimi | Açıklama |
|---|---|
FLAGS |
Bu yöntemin başlangıç türüyle ilgili olarak Hot, Startup veya Post Startup şeklinde işaretlenmesi gerekip gerekmediğini belirtmek için H, S ve P karakterlerinden birini veya daha fazlasını temsil eder. H işaretine sahip bir yöntem, "hot" yöntem olduğunu gösterir. Yani uygulamanın kullanım ömrü boyunca birçok kez çağrılır. S işaretine sahip bir yöntem, başlatma sırasında çağrılan bir yöntem olduğunu gösterir. P işaretine sahip bir yöntem, başlatma işleminden sonra çağrılan bir yöntem olduğunu gösterir. Bu dosyada bulunan bir sınıf, başlatma sırasında kullanıldığını ve sınıf yükleme maliyetinden kaçınmak için yığında önceden tahsis edilmesi gerektiğini gösterir. ART derleyicisi, bu yöntemlerin AOT derlemesi 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; şeklindedir. Burada, Dalvik Executable (DEX) biçimi uyarınca L harfi eklenir. |
METHOD_SIGNATURE |
Yöntemin adı, parametre türleri ve dönüş türleri dahil olmak üzere yöntemin imzası. Örneğin:// LayoutNode.kt fun isPlaced():Boolean { // ...} , LayoutNode üzerinde isPlaced()Z imzasına sahiptir. |
Bu kalıplar, tek bir kuralın birden fazla yöntem veya sınıfı kapsamasını sağlayacak joker karakterler içerebilir. Android Studio'da kural söz dizimiyle yazarken rehberli yardım için Android Baseline Profiles eklentisine bakın.
Joker karakter kuralı örneği aşağıdaki gibi olabilir:
HSPLandroidx/compose/ui/layout/**->**(**)**
Temel profil kurallarında desteklenen türler
Baseline Profile kuralları aşağıdaki türleri destekler. Bu türlerle ilgili ayrıntılı bilgi için Dalvik Executable (DEX) biçimi bölümüne bakın.
| Karakter | Tür | Açıklama |
|---|---|---|
B |
bayt | İmzalı bayt |
C |
char | UTF-16'da kodlanmış Unicode karakter kodu noktası |
D |
çift | Çift duyarlıklı kayan nokta değeri |
F |
float | Tek duyarlıklı kayan nokta değeri |
I |
int | Tam sayı |
J |
uzun | Uzun tam sayı |
S |
kısa video | İşaret diliyle anlatılan Shorts videosu |
V |
geçersiz | Geçersiz |
Z |
boole | Doğru veya yanlış |
L (sınıf adı) |
referans | Sınıf adının bir örneği |
Ayrıca kitaplıklar, AAR yapıları içinde paketlenmiş kurallar tanımlayabilir. Bu yapıları içerecek bir APK oluşturduğunuzda kurallar birleştirilir (manifest birleştirmeye benzer şekilde) ve APK'ya özel, kompakt bir ikili ART profili olarak derlenir.
ART, APK cihazlarda kullanıldığında bu profilden yararlanarak uygulamanın belirli bir alt kümesini Android 9'da (API düzeyi 28) veya ProfileInstaller kullanırken Android 7'de (API düzeyi 24) yükleme sırasında AOT ile derler.
Temel Profilleri manuel olarak toplama
Macrobenchmark kitaplığını ayarlamadan manuel olarak temel profil oluşturabilir ve kritik kullanıcı yolculuklarınız (CUJ) için kullanıcı arayüzü otomasyonları oluşturabilirsiniz. Makro karşılaştırmaları kullanmanızı öneririz ancak bu her zaman mümkün olmayabilir. Örneğin, Gradle olmayan bir derleme sistemi kullanıyorsanız Baseline Profile Gradle eklentisini kullanamazsınız. Bu gibi durumlarda, Temel Profil kurallarını manuel olarak toplayabilirsiniz. API 34 ve sonraki sürümlerin yüklü olduğu bir cihaz veya emülatör kullanırsanız bu işlem çok daha kolay olur. Daha düşük API düzeylerinde de bu işlemi yapabilirsiniz ancak root erişimi gerekir ve AOSP görüntüsü çalıştıran bir emülatör kullanmanız gerekir. Kuralları doğrudan aşağıdaki adımları uygulayarak toplayabilirsiniz:
- Uygulamanızın yayınlanan bir sürümünü test cihazına yükleyin. Derleme sistemi tarafından kullanılabilecek bir profil yakalamak için uygulama derleme türü R8 ile optimize edilmiş olmamalı ve hata ayıklanabilir olmamalıdır.
- Profil yüklemeyi devre dışı bırakıp uygulamayı kapatın.
APK'nızın Jetpack Profile Installer kitaplığına bağımlılığı varsa kitaplık, APK'nızın ilk başlatılmasında bir profil oluşturur. Bu, profil oluşturma sürecini engelleyebilir. Bu nedenle, aşağıdaki komutla devre dışı bırakın:
adb shell am broadcast -a androidx.profileinstaller.action.SKIP_FILE WRITE_SKIP_FILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver
Uygulama derlemesini sıfırlayın ve tüm profilleri temizleyin.
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 altı
adb root adb shell cmd package compile --reset $PACKAGE_NAME
Uygulamayı çalıştırın ve profil toplamak istediğiniz kritik kullanıcı yolculuklarında manuel olarak gezinin.
Profillerin dengelenmesi için en az beş saniye bekleyin.
Kaydetme işlemini gerçekleştirin ve kaydetme işleminin tamamlanmasını bekleyin. APK'nızın Jetpack Profile Installer kitaplığına bağımlılığı varsa profilleri dökümlemek için bu kitaplığı kullanın:
Profile Installer kullanmıyorsanız aşağıdaki komutu kullanarak profilleri bir emülatörde manuel olarak dökün:adb shell am broadcast -a androidx.profileinstaller.action.SAVE_PROFILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver sleep 1 # wait 1 second adb shell am force-stop $PACKAGE_NAME
adb root adb shell killall -s SIGUSR1 $PACKAGE_NAME sleep 1 # wait 1 second adb shell am force-stop $PACKAGE_NAME
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 altı
Referans profil mi yoksa mevcut profil mi oluşturulduğunu belirleyin. Referans profil aşağıdaki konumda bulunur:
/data/misc/profiles/ref/$$PACKAGE_NAME/primary.prof
Mevcut bir profil şu konumda bulunuyor:
/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ü 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
Dökümü alınan profili cihazdan almak için
adbkomutunu 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 derlemenizde Temel Profil 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 optimize edilmemiş 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, Baseline Profile'ı başka bir kaynaktan 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ı eskisi gibi ancak derlenmiş durumu sıfırlamadan ö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"
Temel Profiller ve profgen
Bu bölümde, profgen aracının bir temel profilin kompakt ikili sürümünü oluştururken ne yaptığı açıklanmaktadır.
Profgen-cli, profil derleme, iç gözlem ve ART profillerini çevirme işlemlerine yardımcı olur. Böylece, hedef SDK sürümünden bağımsız olarak Android destekli cihazlara yüklenebilirler.
Profgen-cli, bir Temel Profil'in HRF'sini derlenmiş biçimine derleyen bir KSA'dır. CLI, Android SDK'nın bir parçası olarak cmdline-tools deposunda da bulunur.
Bu ö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 komutunu 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
Sıkıştırılmış ikili profil 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 komutunu 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 yayınlanan derlemesinin yoluna ve R8 ya da Proguard kullanılırken APK'yı gizlemek için kullanılan bir gizleme eşlemesine de ihtiyaç duyar. Bu sayede profgen, derlenmiş profili oluştururken HRF'deki kaynak sembolleri karşılık gelen gizlenmiş adlarına çevirebilir.
ART profili biçimleri ileriye veya geriye dönük uyumlu olmadığından, gerektiğinde bir ART profili biçimini diğerine dönüştürmek için kullanabileceğiniz profgen paketleri profil meta verilerini (profm) içeren 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 eşlemeleri
HRF, kaynak sembolleri kullanıyorsa kod karartma eşlemesini sağlamanız gerekir. HRF, zaten gizlenmiş olan yayınlanan bir derlemeden oluşturuluyorsa ve eşleme gerekmiyorsa bu seçeneği yoksayabilir ve çıkışları assets veya dexopt klasörüne kopyalayabilirsiniz.
Temel Profiller'in geleneksel yüklemesi
Temel Profiller, geleneksel olarak bir cihaza iki şekilde gönderilir.
install-multiple uygulamasını DexMetadata ile kullanma
API 28 ve sonraki sürümleri çalıştıran cihazlarda Play istemcisi, yüklenen APK sürümü için APK ve DexMetadata (DM) yükünü indirir. DM, cihazdaki Paket Yöneticisi'ne aktarılan profil bilgilerini içerir.
APK ve DM, aşağıdakine benzer 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çinde paketlenmiş bir profili yüklemek için alternatif bir mekanizma sağlar. ProfileInstaller, ProfileInstallReceiver veya doğrudan uygulama tarafından çağrılır.
ProfileInstaller kitaplığı, profili hedef cihaz SDK sürümüne göre dönüştürür ve profili cihazdaki cur dizinine (cihazdaki ART profilleri için pakete özel bir hazırlama dizini) kopyalar.
Cihaz boşta kaldığında profil, cihazda bg-dexopt adlı bir işlem tarafından alınır.
Temel profili başka bir cihazdan yükleme
Bu bölümde, APK'ya göre Temel Profil'in nasıl yükleneceği açıklanmaktadır.
androidx.profileinstaller ile anons yapma
API 24 ve sonraki sürümlerin yüklü olduğu cihazlarda, profili yüklemek için bir komut 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, Temel Profiller içeren APK'ların çoğunda (Google Play'deki 450 bin uygulamanın yaklaşık 77 bininde) bulunmaz ancak Compose kullanan tüm APK'larda bulunur. Bunun nedeni, kitaplıkların ProfileInstaller'a bağımlılık beyan etmeden profil sağlayabilmesidir. Jetpack'ten başlayarak her kitaplığa profil içeren bir bağımlılık eklenir.
Profgen veya DexMetaData ile install-multiple kullanma
API 28 ve sonraki sürümlerin yüklü olduğu cihazlarda, uygulamada ProfileInstaller kitaplığına gerek olmadan Temel Profil'i başka bir kaynaktan 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ı her APK için bir kez çalıştırın. Yükleme sırasında her APK'yı ve ilişkili .dm dosyasını ileterek APK ve .dm adlarının eşleştiğinden emin olun:
adb install-multiple appname-base.apk appname-base.dm \
appname-split1.apk appname-split1.dm
Doğrulama
Profilin doğru şekilde yüklendiğini doğrulamak için Uygulama iyileştirmelerini manuel olarak ölçme bölümündeki adımları uygulayabilirsiniz.
İkili program profilinin içeriğini dökme
Temel Profil'in 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
dumpProfile, APK'ya ihtiyaç duyar. Çünkü kompakt ikili gösterim yalnızca DEX ofsetlerini depolar ve bu nedenle sınıf ve yöntem adlarını yeniden oluşturmak için bunlara ihtiyaç duyar.
Yüksek düzey modu varsayılan olarak etkindir ve profilin APK'daki DEX dosyalarıyla uyumluluk kontrolünü gerçekleştirir. Başka bir araç tarafından oluşturulan profillerde hata ayıklamaya çalışıyorsanız inceleme için döküm almanızı engelleyen uyumluluk hataları alabilirsiniz. Bu gibi durumlarda, --strict false ile yüksek düzey modu devre dışı bırakabilirsiniz. Ancak çoğu durumda yüksek düzey modu etkin tutmanız gerekir.
Karartma eşlemesi isteğe bağlıdır. Sağlandığında, kullanım kolaylığı için karartılmış simgelerin okunabilir sürümlerine yeniden eşlenmesine yardımcı olur.
Sizin için önerilenler
- Not: JavaScript devre dışı bırakıldığında bağlantı metni gösterilir.
- SQLite performansıyla ilgili en iyi uygulamalar
- Temel profiller {:#baseline-profiles}
- Takılı kalan kısmi uyanık kalma kilitleri