Manuel çabayı azaltmak ve genel ölçeklenebilirliği artırmak için Jetpack Macrobenchmark kitaplığını kullanarak profil kurallarının otomatik oluşturulmasını önemle tavsiye ederiz. Ancak, uygulamanızda manuel olarak profil kuralları oluşturup ölçebilirsiniz.
Profil kurallarını manuel olarak tanımlayın
src/main
dizininde bulunan 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.
Dosya, satır başına bir kural belirtir. Her kural, uygulama 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 kullanıcıların okuyabileceği ART profili biçiminin (HRF) üst kümesidir. Söz dizimi, açıklayıcılar ve imzalar için söz dizimine benzer ancak kural yazma sürecini basitleştirmek için joker karakterlerin kullanılmasına izin verir.
Aşağıdaki örnekte JetpackCompose 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;
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]
Bir 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özdizimi | Açıklama |
---|---|
FLAGS |
Bu yöntemin, başlangıç türüyle ilgili olarak Hot , Startup veya Post Startup olarak işaretlenmesinin 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, "çalışır durumda" bir yöntem olduğunu, yani uygulamanın ömrü boyunca birçok kez çağrıldığını belirtir. S işaretli bir yöntem, bunun başlatma sırasında çağrılan bir yöntem olduğunu gösterir. P işaretine sahip bir yöntem, başlatmadan sonra çağrılan bir yöntem olduğunu gösterir. Bu dosyada bulunan bir sınıf, başlangıç sırasında kullanıldığını ve sınıf yükleme maliyetinden kaçınmak için yığına önceden ayrılması gerektiğini belirtir. ART derleyicisi, bu yöntemlerin AOT olarak derlemesi ve oluşturulan AOT dosyasında düzen optimizasyonları yapma gibi çeşitli optimizasyon stratejileri kullanır. |
CLASS_DESCRIPTOR |
Hedeflenen yöntemin sınıfının tanımlayıcısı. Örneğin, androidx.compose.runtime.SlotTable , Landroidx/compose/runtime/SlotTable; tanımlayıcısına sahip. L, Dalvik Yürütülebilir (DEX) biçimi uyarınca buraya eklenir. |
METHOD_SIGNATURE |
Yöntemin adı, parametre türleri ve döndürme türleri dahil olmak üzere yöntemin imzası. Örneğin:// LayoutNode.kt fun isPlaced():Boolean { // ... } LayoutNode üzerindeki isPlaced()Z imzasına sahiptir. |
Bu kalıplar, tek bir kuralın birden fazla yöntemi veya sınıfı kapsaması için joker karakterler içerebilir. Android Studio'da kural söz dizimiyle yazma konusunda yardım almak için Android Baseline Profilleri eklentisine bakın.
Joker karakter kuralı örneği aşağıdaki gibi görünebilir:
HSPLandroidx/compose/ui/layout/**->**(**)**
Temel profil kurallarında desteklenen türler
Temel Profil kuralları aşağıdaki türleri destekler. Bu türlerle ilgili ayrıntılar için Dalvik Yürütülebilir (DEX) biçimini inceleyin.
Karakter | Tür | Açıklama |
---|---|---|
B |
bayt | İmzalanmış bayt |
C |
karakter | UTF-16 olarak kodlanmış Unicode karakter kodu noktası |
D |
çift | Çift duyarlıklı kayan nokta değeri |
F |
kayan | Tek duyarlıklı kayan nokta değeri |
I |
int | Tam sayı |
J |
uzun | Uzun tam sayı |
S |
kısa video | Shorts videosu olarak imzalandı |
V |
geçersiz | Geçersiz |
Z |
Boole | Doğru veya yanlış |
L (sınıf adı) |
reference | Sınıf adı örneği |
Ayrıca kitaplıklar, AAR yapılarında paketlenen kurallar tanımlayabilir. Bu yapıları içerecek bir APK oluşturduğunuzda kurallar, manifest birleştirme işlemine benzer şekilde birleştirilir ve APK'ya özel, kompakt bir ikili ART profiline derlenir.
ART, Android 9'da (API düzeyi 28) veya Android 7'de (API düzeyi 24) yükleme sırasında uygulamanın belirli bir alt kümesini AOT derlemek için cihazlarda ProfileInstaller
kullanıldığında bu profilden yararlanır.
Temel Profilleri manuel olarak toplama
Macrobenchmark kitaplığını oluşturmadan temel profili manuel olarak oluşturabilir ve kritik kullanıcı yolculuklarınız için kullanıcı arayüzü otomasyonları oluşturabilirsiniz. Makrobenchmark'ları kullanmanızı önersek de 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ümleri çalıştıran bir cihaz veya emülatör kullanıyorsanız bu işlem çok daha kolaydır. Daha düşük API seviyelerinde de mümkün olsa da kök erişimi gerektirir ve AOSP görüntüsü çalıştıran bir emülatör kullanmanız gerekir. Aşağıdakileri yaparak kuralları doğrudan toplayabilirsiniz:
- Uygulamanızın sürüm sürümünü bir test cihazına yükleyin. Uygulama derleme türü, doğru bir profil için R8 için optimize edilmiş ve hata ayıklanamaz olmalıdır.
- Profillerin önceden 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ın Jetpack Profile Installer kitaplığına bağımlılığı varsa kitaplık, APK'nızın ilk başlatılmasında bir profili önyükler. Bu durum, profil oluşturma sürecini etkileyebilir. Bu nedenle, aşağıdaki komutla profili 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 komutuna profillerin dökümünü al. APK'nızın Jetpack Profile Installer kitaplığına bağımlılığı varsa
profilleri dökümmek için bunu kullanın:
adb shell am broadcast -a androidx.profileinstaller.action.SAVE_FILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver adb shell am force-stop $PACKAGE_NAME
Profil Yükleyici'yi kullanmıyorsanız şu komutu kullanarak profilleri bir emülatöre manuel olarak aktarın: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 profilinin mi yoksa mevcut bir profilin mi oluşturulduğunu belirleyin. Referans profili, şu konumda yer alır:
/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üştürmeyi yapın:
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ülmüş 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ı çeker ve uygulama modülünüze yükler. Uygulamayı bir sonraki derlemenizde Temel Profil dahil edilir. Yükleme sorunları sayfasındaki adımları uygulayarak bu sorunu 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 optimize edilmemiş uygulama başlangıcını referans almak üzere ölçerek işe 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"
Sonra, Temel Profili başka cihazdan 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ış, paketin derlendiğini belirtmelidir:
[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. Paket için derlenmiş durumu 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, Temel Profilin kompakt bir ikili sürümünü oluştururken profgen aracının ne yaptığı açıklanmaktadır.
Profgen-cli, profil derleme, iç gözlem ve ART profillerinin dönüştürülmesinde yardımcı olur. Böylece, ART profilleri, hedef SDK sürümünden bağımsız olarak Android destekli cihazlara yüklenebilir.
Profgen-cli, bir Temel Profilin HRF'sini derlenen biçimde derleyen bir KSA'dır. CLI ayrıca Android SDK'nın bir parçası olarak cmdline-tools
deposunda da gönderilir.
studio-main
dalında şu özellikler mevcuttur:
➜ ../cmdline-tools/latest/bin
apkanalyzer
avdmanager
lint
profgen
retrace
screenshot2
sdkmanager
Profgen-cli ile küçük ikili profiller oluşturun
Profgen-cli ile kullanılabilen komutlar bin
, validate
ve dumpProfile
şeklindedir. Mevcut 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
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
işlevini 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'ye giden yolu temsil eder.
Profgen-cli, APK'nın sürüm derlemesine ve R8 veya ProGuard kullanılırken APK'nın kodunu karartmak için kullanılan bir karartma haritasına da ihtiyaç duyar. Bu şekilde profgen
, derlenen profili oluştururken HRF'deki kaynak simgelerini karşılık gelen kod karartılmış adlarına çevirebilir.
ART profili biçimleri ileri veya geriye dönük uyumlu olmadığından, profgen
tarafından gerekli olduğunda bir ART profili biçimini diğerine dönüştürmek için kullanabileceğiniz profil meta verilerini (profm
) paketleyecek bir profil biçimi sağlayın.
Profil biçimleri ve platform sürümleri
Profil biçimi seçerken aşağıdaki seçenekleri kullanabilirsiniz:
Profil biçimi | Platform sürümü | API seviyesi |
---|---|---|
s0_1_5_sn | Android S ve sonraki sürümler | 31+ |
s0_1_0_k | Android P, Q ve R | 28-30 |
s0_0_9_omr1 | Android O MR1 | 27 |
s0_0_5_o | Android O | 26 |
s0_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ı
Kod karartma haritasını yalnızca HRF'de kaynak simgeleri kullanılıyorsa sağlamanız gerekir. HRF, halihazırda karartılmış bir sürüm derlemesinden oluşturulduysa ve eşleme gerekmiyorsa bu seçeneği göz ardı edebilir ve çıkışları assets
veya dexopt
klasörüne kopyalayabilirsiniz.
Temel Profillerin geleneksel kurulumu
Temel Profiller, geleneksel olarak bir cihaza iki yöntemden biriyle yayınlanır.
install-multiple
özelliğini DexMetadata ile kullanma
API 28 ve sonraki sürümleri çalıştıran cihazlarda Play istemcisi, yüklenmekte olan bir APK için APK veDexMetadata (DM) yükünü indirir. DM, cihazdaki Paket Yöneticisi'ne aktarılan profil bilgilerini içerir.
APK ve DM, tek bir yükleme oturumunun parçası olarak aşağıdakiler gibi bir şey kullanılarak yüklenir:
adb install-multiple base.apk base.dm
Jetpack Profil Yükleyici
API düzeyi 29 ve sonraki sürümleri çalıştıran cihazlarda Jetpack ProfileLoader kitaplığı, APK cihaza yüklendikten sonra assets
veya dexopt
paketlerinde paketlenen bir profili yüklemek için alternatif bir mekanizma sağlar. ProfileInstaller
, ProfileInstallReceiver
veya doğrudan uygulama tarafından çağrılır.
ProfileLoader kitaplığı, hedef cihazın SDK sürümüne göre profilin kodunu dönüştürür ve profili cihazdaki cur
dizinine (cihazdaki ART profilleri için pakete özel bir hazırlık dizini) kopyalar.
Cihaz boşta kaldığında profil, cihazdaki bg-dexopt
adlı bir işlem tarafından alınır.
Temel profili başka cihazdan yükleme
Bu bölümde, belirli bir APK'da Temel Profilin nasıl yükleneceği açıklanmaktadır.
androidx.profileinstaller
ile anons yapın
API 24 ve sonraki sürümleri çalıştıran 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>
ProfileYükleyici, Temel Profiller içeren çoğu APK'da mevcut değildir. Bu, Play'deki 450 bin uygulamanın yaklaşık 77.000'inde yer almaktadır. Ancak Compose'u kullanan her APK'da etkin bir şekilde bulunur. Bunun nedeni, kitaplıkların ProfileLoader'a bir bağımlılık bildirmeden profil sağlayabilmesidir. Profili olan her kitaplığa bağımlılık eklemek Jetpack ile başlayarak uygulanır.
install-multiple
öğesini profgen veya DexMetaData ile kullanın
API 28 ve sonraki sürümleri çalıştıran cihazlarda, uygulamada ProfileLoader kitaplığına gerek kalmadan Temel Profili başka cihazdan yükleyebilirsiniz.
Bunun için Profgen-cli 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 ayıklama profili 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 düzgün şekilde yüklendiğini doğrulamak için Uygulama iyileştirmelerini manuel olarak ölçme adımlarını kullanabilirsiniz.
İkili profil içeriğinin dökümünü alma
Temel Profilin kompakt ikili sürümünün içeriğine göz atmak 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österimi yalnızca DEX ofsetlerini depoladığından, APK'ya dumpProfile
için ihtiyaç duyar. Bu nedenle, sınıf ve yöntem adlarını yeniden oluşturması gerekir.
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 oluşturabilmenizi engelleyen uyumluluk hataları alabilirsiniz. Bu gibi durumlarda, --strict false
ile yüksek düzey modunu devre dışı bırakabilirsiniz. Ancak çoğu durumda yüksek düzey
modu etkin durumda tutmanız gerekir.
Kod karartma haritası isteğe bağlıdır. Bu harita sağlandığında, kodu karartılmış sembollerin, kullanım kolaylığı için insanlar 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-profile}
- Takılı kalan kısmi uyanık kalma kilitleri