Bu belge, uygulamanızdaki önemli performans sorunlarını belirleyip düzeltmenize yardımcı olur.
Temel performans sorunları
Bir uygulamanın kötü performans göstermesine neden olabilecek pek çok sorun vardır, ancak uygulamanızda dikkat etmeniz gereken bazı yaygın sorunlar şunlardır:
- Başlatma gecikmesi
Başlatma gecikmesi, uygulamaya dokunma arasında geçen süredir giriş noktasını ve kullanıcının verilerini tıklayın.
Uygulamalarınızda aşağıdaki başlangıç hedeflerini hedefleyin:
500 ms'den kısa sürede baştan başlatma. Baştan başlatma, uygulama etkinken başlatılması, sistemin belleğinde yoktur. Bu durum, uygulamanın yeniden başlatmadan sonraki ilk başlatılması veya uygulama işlemi durdurulduğunda kullanıcı veya sistem tarafından yürütülmesidir.
Öte yandan uygulama halihazırda çalışıyorken hazır başlatma görebilirsiniz. Soğuk başlatma, sistemde en fazla çalışma yapılmasını gerektirir çünkü Bunun için depolama alanındaki her şeyi yükleyip uygulamayı başlatması gerekir. Şunları deneyin: 500 ms veya daha kısa sürmesini sağlayabilirsiniz.
P95 ve P99 gecikmeleri ortanca değere çok yakındır. Uygulama başlaması uzun sürer ve kötü bir kullanıcı deneyimine yol açar. Süreçler arası iletişimler (IPC'ler) ve uygulama başlatmanın kritik yolunda kilit anlaşmazlığı görülebilir ve tutarsızlığa yol açabilir.
- Kaydırma engeli
Jank, çerçeveleri oluşturamaz ve bunları sisteme çekmek için ekranda istenen 60 Hz veya daha yüksek ritimde oynatın. Jank en çok belirgin şekilde animasyonlu akış yerine kesintilerle karşılaşıyoruz. Jank Dili hareket, bir veya daha fazla kare için yol boyunca durakladığında görünür. uygulamasının içeriği oluşturması, sistemdeki bir karenin süresinden daha uzun sürer.
Uygulamalar 90 Hz yenileme hızlarını hedeflemelidir. Geleneksel oluşturma hızları 60 Hz'dir. Ancak yeni cihazların çoğu, kullanıcı etkileşimleri sırasında 90 Hz modunda çalışır. anlamına gelir. Bazı cihazlar 120 Hz'e kadar olan daha yüksek hızları destekler.
Bir cihazın belirli bir zamanda hangi yenileme hızını kullandığını görmek için Geliştirici Seçenekleri > Hata ayıklama bölümünde yenileme hızını göster bölümüne ekleyin.
- Düzgün olmayan geçişler
Bu durum, sekmeler arasında geçiş yapma veya yükleme gibi etkileşimler sırasında belirgindir yeni bir etkinliktir. Bu tür geçişler akıcı animasyonlar olmalıdır. gecikmeler veya görsel titremeler olabilir.
- Güç verimsizlikleri
İş yapmak pil şarjını azaltır ve gereksiz işler yapmak pili azaltır hayat.
Kodda yeni nesneler oluşturulmasından kaynaklanan bellek ayırmaları, ve sistemde kayda değer bir iş yüküne yol açıyor. Çünkü yalnızca özelleştirilmiş ayırmalar için Android Çalışma Zamanı (ART) çabası gerekir, ancak bu nesnelerin daha sonra serbest bırakılması da (çöp toplama) zaman gerektirir ve çaba sarf etmeniz gerekir. Hem ayırma hem de toplama çok daha hızlı ve verimlidir. özellikle de geçici nesneler için. Eskiden her ne kadar mümkün olduğunca nesne ayırmaktan kaçının. Daha iyi performans için ve mimariniz açısından en mantıklı olanı seçin. Tahsislerde tasarruf ART’nin ne olduğu düşünüldüğünde, kaçınılmaz kod riski en iyi uygulama değildir. yeter.
Ancak bu işlem çaba gerektirir; bu nedenle, performans sorunları oluşturabilirsiniz.
Sorunları belirleme
Performans sorunlarını belirlemek ve düzeltmek için aşağıdaki iş akışını öneririz:
- Aşağıdaki kritik kullanıcı yolculuklarını belirleyin ve inceleyin:
- Başlatıcı ve bildirimler de dahil olmak üzere yaygın başlatma akışları.
- Kullanıcının veriler arasında gezindiği ekranlar.
- Ekranlar arasındaki geçişler.
- Gezinme veya müzik çalma gibi uzun süreli akışlar.
- Aşağıdakileri kullanarak önceki akışlar sırasında neler olduğunu incelemek
hata ayıklama araçları:
- Perfetto: Cihazda neler olup bittiğini görmenizi sağlar. verileri daha iyi anlamanızı sağlar.
- Bellek Profil Aracı: Hangi bellek ayırmalarının gerçekleştiğini görmenize olanak tanır bir mesaj alırsınız.
- Simpleperf: Hangi işlev çağrılarının belli bir zaman aralığında en yüksek CPU'yu kullanabilir. Bir nesneyi tanımladığınızda Systrace'te çok uzun zaman alıyor ama nedenini bilmiyorsunuz, Simpleperf ek bilgi sağlayabilir.
Bu performans sorunlarını anlamak ve hata ayıklamak için manuel olarak bağımsız test çalıştırmalarında hata ayıklayabilir. Bu adımın önceki adımları, birleştirilmiş veri. Bununla birlikte, kullanıcıların gerçekte ne gördüklerini anlamak ve regresyonların ne zaman meydana gelebileceğini belirlemek için, metrikleri otomatik testlerde ve sahada toplama:
- Başlatma akışları
- Alan metrikleri: Play Console başlatma süresi
- Laboratuvar testleri: Macrobenchmark ile test başlatma
- Jank Dili
- Alan metrikleri
- Play Console çerçeve verileri: Play Console'da çerçeve boyutunu daraltamazsınız. belirli bir kullanıcı yolculuğuna indirdiniz. Yalnızca genel olumsuzlukları rapor eder bir platformdur.
FrameMetricsAggregator
ile özel ölçüm: Şunları kullanabilirsiniz: Belirli bir dönemde jank metriklerini kaydetmek içinFrameMetricsAggregator
iş akışını takip edin.
- Laboratuvar testleri
- Macrobenchmark ile kaydırma.
- Macrobenchmark,
dumpsys gfxinfo
komutlarını kullanarak kare zamanlamasını toplar bir kampanya oluşturun. Bu, iş kırılım yapılarını oluşabilecek olumsuzlukları gidermenize yardımcı olur.RenderTime
gösteren metriklerden daha fazlasını öneriyoruz. regresyonları tanımlamak için stabil karelerin sayısından daha önemlidir düşünme egzersizlerini teşvik edersiniz.
- Alan metrikleri
Uygulama Bağlantıları doğrulama sorunları
Uygulama Bağlantıları, web sitenizin URL'sine dayalı olarak doğrulanan derin bağlantılardır size ait olabilir. Uygulama Bağlantısı'nın olası nedenleri şunlardır: olabileceğini unutmayın.
- Amaç filtresi kapsamları: Amaç filtrelerine yalnızca şu ayrıntıyı taşıyan URL'ler için
autoVerify
ekleyin: yanıt verebilir. - Doğrulanmamış protokol anahtarları: doğrulanmamış sunucu tarafı ve alt alan adı yönlendirmeleri
olarak değerlendirilmesi ve doğrulamanın başarısız olması anlamına gelir. Tüm bu ihtiyaçları
autoVerify
bağlantı başarısız. Örneğin, bağlantıları HTTP'den HTTPS'ye yönlendirirken, URL'lerini doğrulamanız gerekmeden example.com'dan www.example.com'a neden başarısız olduğunu görebilirsiniz. Amaç ekleyerek Uygulama Bağlantılarını doğruladığınızdan emin olun filtrelerine dokunun. - Doğrulanamayan bağlantılar: Test amacıyla doğrulanamayan bağlantılar eklemek bu, sistemin uygulamanız için Uygulama Bağlantılarını doğrulamamasına neden olur.
- Güvenilir olmayan sunucular: Sunucularınızın, istemci uygulamalarınıza bağlanabildiğinden emin olun.
Uygulamanızı performans analizi için ayarlama
Doğru, tekrarlanabilir ve işlem yapılabilir reklamlar elde etmek için doğru karşılaştırma verileri elde edebilirsiniz. Üretime yakın bir sistemde test ederek gürültü kaynaklarını bastırmak için kullanılır. Aşağıdaki bölümlerde, test kurulumu hazırlamak için atabileceğiniz, APK'ya ve sisteme özgü adımların sayısı ve bazıları kullanım alanına özgüdür.
İzleme noktaları
Uygulamalar, kodları için özel izleme etkinlikleri kullanabilir.
İzler yakalanırken, izleme işlemi yaklaşık olarak Bölüm başına 5 μsm olduğundan her yöntemin yanına koyun. Daha büyük parçaları izleme 0,1 ms'den yüksek bir değer, performans sorunlarına dair önemli bilgiler sağlayabilir.
APK ile ilgili dikkat edilmesi gereken noktalar
Hata ayıklama varyantları, yığın örneklerinde sorun giderme ve simgeselleştirme açısından faydalı olabilir.
ancak performansı ciddi şekilde etkiler. Android 10 (API) çalıştıran cihazlar
29. Seviye) ve daha yüksek seviyeler için profileable android:shell="true"
manifest'ini kullanabilirsiniz.
Üretim düzeyindeki kod küçültme yapılandırmanızı kullanın. Seçtiğiniz düzenleme moduna bu durum performans üzerinde önemli bir etkiye sahip olabilir. Biraz ProGuard yapılandırmaları izleme noktalarını kaldırdığından bu kuralları yapılandırmaya çalışın.
Derleme
Uygulamanızı cihazda bilinen bir durumla derleyin (genellikle speed
veya
speed-profile
. Arka plandaki tam zamanında (JIT) etkinlik, önemli düzeyde
ve APK'yı yeniden yüklediğinizde bu rakama sıklıkla ulaşıyorsunuz
test çalıştırmaları arasında seçim yapın. Aşağıda bu işlemi gerçekleştirmek için kullanılabilecek bir komut verilmiştir:
adb shell cmd package compile -m speed -f com.google.packagename
speed
derleme modu, uygulamayı tamamen derler. speed-profile
mod, uygulamayı kullanılan kod yollarının profiline göre derler.
toplanan kişisel veriler. Profilleri tutarlı bir şekilde toplamak zor olabilir.
ve doğru şekilde. Bu nedenle, bu araçları kullanmaya karar verirseniz,
yardımcı olur. Profiller şu konumda bulunur:
/data/misc/profiles/ref/[package-name]/primary.prof
Macrobenchmark doğrudan derleme modunu belirtmenizi sağlar.
Sistemle ilgili olarak göz önünde bulundurulması gerekenler
Düşük düzey ve yüksek doğrulukta ölçümler için cihazlarınızı kalibre edin. A/B'yi çalıştır karşılaştırmalar yapabilirsiniz. Önemli değişiklikler bile olsa performanstaki değişiklikler olabilir.
Root erişimli cihazlarda lockClocks
komut dosyası kullanarak
Mikro Karşılaştırmalar. Bu komut dosyaları, diğer işlevlerinin yanı sıra şunları yapar:
- CPU'ları sabit bir frekansa yerleştirin.
- Küçük çekirdekleri devre dışı bırakın ve GPU'yu yapılandırın.
- Termal kısıtlamayı devre dışı bırakın.
Kullanıcı deneyimi odaklı testler için lockClocks
komut dosyası kullanmanızı önermeyiz
ve jank testi gibi görünse de gerçek zamanlı olarak
Mikrobenchmark testlerinde gürültüyü azaltma.
Mümkün olduğunda Macrobenchmark, Bu da ölçümlerinizdeki gürültüyü azaltabilir ve ölçümün doğruluğunu engelleyebilir.
Yavaş uygulama başlatma: Gereksiz trambolin etkinliği
Trambolin etkinlikleri, uygulamanın başlatma süresini gereksiz yere uzatabilir.
bunu yaparken uygulamanızın da bunu yapıp yapmadığını
bilmeniz önemlidir. Aşağıdaki örnekte gösterildiği gibi
iz varsa, bir activityStart
hemen ardından başka bir activityStart
geliyor
ilk etkinlik sırasında herhangi bir kare çizilmeksizin.
.
Şekil 1. Trambolin etkinliğini gösteren bir iz.
Bu durum hem bildirim giriş noktasında hem de normal uygulama başlatmada gerçekleşebilir çoğu zaman yeniden düzenleme yaparak bu sorunu çözebilirsiniz. Örneğin projenin zamanlamasıyla ilgili başka bir etkinlik çalıştırılmadan önce kurulumu gerçekleştirmek için bu etkinliği kullanmanız gerekir. yeniden kullanılabilir bir bileşene veya kitaplığa dönüştürmenizi sağlar.
GC'leri sık tetikleyen gereksiz ayırmalar
Çöp toplamaların (GC'ler) sizden daha sık gerçekleştiğini görebilirsiniz. fayda sağlar.
Aşağıdaki örnekte, uzun süreli bir işlem sırasında her 10 saniyede bir uygulamanın gereksiz yere sürekli olarak ayırma yapabileceğinin göstergesi zaman:
.
Şekil 2. GC etkinlikleri arasındaki boşluğu gösteren bir iz.
Ayrıca, anahtar kelimelerin çok büyük bir kısmını belirli bir çağrı yığınının ayırmaları gerektiğini lütfen unutmayın. Her şeyi ortadan kaldırmanız gerekmez agresif bir şekilde ayırmaları gerektiğini unutmayın. Bu, kodun bakımını zorlaştırabilir. Bunun yerine tahsislerin hotspot'ları üzerinde çalışarak başlayın.
Janky çerçeveler
Grafik ardışık düzeni göreceli olarak karmaşıktır. Grafiklerle ilgili bazı farklılıklar olabilir. kullanıcının nihayetinde karenin düşüp düşmeyeceğini belirler. Bazı durumlarda, platform "kurtarabilir" bir kare oluşturabilirsiniz. Ancak çoğu bu nüansları kullanarak sorunlu kareleri belirleyebilirsiniz.
Uygulamada çok az işlem yapmadan kareler çizildiğinde
60 FPS'de 16,7 ms'lik bir kadansta Choreographer.doFrame()
izleme noktası meydana gelir
cihaz:
.
Şekil 3. Sık hızlı kareleri gösteren bir iz.
Uzaklaştırıp izde gezinirseniz bazen karelerin ama daha fazla zaman harcanması gerekmediğinden kendilerine ayrılan 16,7 ms süreyi aşar:
.
Şekil 4. Sık sık hızlı kareleri gösteren ve düzenli aralıklarla
iş yeri.
Bu düzenli kadansta bir kesinti gördüğünüzde bu, gösterildiği gibi stabil bir karedir Şekil 5'te:
.
Şekil 5. Çirkin bir çerçeveyi gösteren iz.
Bunları tespit ederek alıştırma yapabilirsiniz.
.
Şekil 6. Daha hantal kareleri gösteren bir iz.
Bazı durumlarda, aşağıdakiler hakkında daha fazla bilgi için izleme noktasını yakınlaştırmanız gerekir:
hangi görüntülemelerin olduğundan yüksek olduğunu veya RecyclerView
adlı çocuğun ne yaptığını öğrenin. Başka durumlarda,
araştırmanız gerekebilir.
Titreyen çerçeveleri belirleme ve bunların nedenlerini ayıklama hakkında daha fazla bilgi için Yavaş oluşturma bölümüne bakın.
Yaygın RecyclerView hataları
RecyclerView
yedekleme verilerinin tamamını gereksiz yere geçersiz kılmak
uzun kare oluşturma sürelerine ve gecikme yaşanmasına yol açar. Bunun yerine, görevlerin sayısını en aza indirmek için
yalnızca değişen verileri geçersiz kılar.
Maliyetli notifyDatasetChanged()
durumundan kaçınmanın yolları için Dinamik verileri sunma konusuna bakın.
çağrılarına neden olur. Bu da içeriğin tamamen yerine güncellenmesine neden olur.
İç içe yerleştirilmiş her RecyclerView
öğesini düzgün şekilde desteklemezseniz
dahili RecyclerView
her seferinde tamamen yeniden oluşturulabilir. İç içe yerleştirilen her,
iç RecyclerView
için bir RecycledViewPool
ayarlanmış olmalıdır:
görüntülemeler iç RecyclerView
arasında geri dönüştürülebilir.
Yeterli veriyi önceden getirmemek veya zamanında getirmemek, kullanıcı bir reklam öğesi için beklemek zorunda kaldığında, daha fazla veri içerir. Bu teknik açıdan olumsuz olmasa da kullanıcı deneyimini önemli ölçüde iyileştirebilir, bu sayede kullanıcı deneyimini kullanıcının beklemek zorunda kalmamasını sağlamak üzere önceden dışı verilerdir.
Uygulamanızda hata ayıklama
Aşağıda, uygulamanızın performansıyla ilgili hata ayıklama yöntemleri yer almaktadır. Görüntüleyin sistem izleme ve Studio profil aracı.
Systrace ile uygulama başlatmada hata ayıklama
Uygulama başlatma işlemine genel bakış için Uygulama başlatma süresi başlıklı makaleye göz atın sistem izlemeye genel bir bakış için aşağıdaki videoyu izleyin.
Başlangıç türlerini aşağıdaki aşamalarda netleştirebilirsiniz:
- Sıfırdan başlatma: Kayıtlı durumu olmayan yeni bir işlem oluşturmaya başlayın.
- Hazır başlatma: İşlemi yeniden kullanırken etkinliği yeniden oluşturur veya işlemi kaydedilen durumda yeniden oluşturur.
- Çalışır durumda başlatma: Etkinliği yeniden başlatır ve enflasyon düzeyinde başlar.
Systra'ları Cihazdaki Sistem İzleme uygulamasıyla yakalamanızı öneririz. Android 10 ve sonraki sürümlerde Perfetto'yu kullanın. Android 9 ve önceki sürümlerde şunu kullanın: Systrace. İzleme dosyalarını web tabanlı Perfetto iz görüntüleyici. Daha fazla bilgi için Sisteme genel bakışı inceleyin. izleme.
Dikkat etmeniz gereken bazı noktalar şunlardır:
- Anlaşmazlığı izleyin: Monitörle korunan kaynaklar için rekabet, uygulamanın başlatılmasında önemli ölçüde gecikme yaşar.
Eşzamanlı bağlayıcı işlemleri: Hesabınızdaki gereksiz işlemleri en iyi yolu belirlemektir. Gerekli bir işlem pahalıysa, ilgili platform ekibiyle iletişim kurup
Eşzamanlı GC: Bu yaygın bir durumdur ve nispeten düşüktür. Ancak bu sorunla sık karşılaşıyorsanız Android Studio belleği veya profil aracı.
G/Ç: Başlatma sırasında gerçekleştirilen G/Ç'yi kontrol edin ve uzun tezgahlar olup olmadığına bakın.
Diğer iş parçacıklarında önemli etkinlik: Bunlar kullanıcı arayüzü iş parçacığını etkileyebilir, bu nedenle başlatma sırasında arka planda çalışmaya dikkat edin.
Başlatma tamamlandığında reportFullyDrawn
numaralı telefonu aramanızı öneririz:
daha iyi bir uygulama başlatma metriği raporlamasına ilişkin bakış açısı sunar. Saat
konusunda daha fazla bilgi için bölümünü tam ekran olarak görüntüleyebilirsiniz.reportFullyDrawn
Perfetto iz işlemcisini kullanarak RFD tarafından tanımlanmış başlangıç zamanlarını ayıklayabilir,
ve kullanıcı tarafından görülebilen bir izleme etkinliği yayınlanır.
Cihazda Sistem İzlemeyi kullan
Sistem izleme adlı sistemi yakalamak için Sistem İzleme adlı sistem düzeyinde uygulamayı kullanabilirsiniz.
izin verir. Bu uygulama, sürpriz olmadan cihazdaki izleri kaydetmenize olanak tanır.
adb
adlı cihaza takmak zorunda kalıyorsunuz.
Android Studio Bellek Profili Aracı'nı kullanma
Bellek basıncını incelemek için Android Studio Bellek Profil Aracı'nı kullanabilirsiniz neden olabilir. Ayrıca canlı bir bir görünüm oluşturabilirsiniz.
GC'lerin neden ve ne sıklıkta gerçekleştiğini izlemek için Bellek Profili Aracı.
Uygulama belleğini profillemek için aşağıdaki adımları uygulayın:
Bellek sorunlarını algılama.
Odaklanmak istediğiniz kullanıcı yolculuğuna ait bellek profili oluşturma oturumunu kaydedin. Şekil 7'de gösterildiği gibi, nesne sayısında artış olup olmadığına bakın. GC'lere yönlendirir.
. Şekil 7. Nesne sayısı artırılıyor.
. Şekil 8. Çöp toplama.
Bellek baskısına neden olan kullanıcı yolculuğunu belirledikten sonra nedenlerin doğru olup olmadığını kontrol edin.
Bellekte baskı olan sıcak noktaları teşhis edin.
Hem Ayırmaları hem de Şekil 9'da gösterildiği gibi Sığ Boyut.
. Şekil 9. Allocations ve Shallow" değerleri Boyut.
Bu verileri sıralamanın birden fazla yolu vardır. Bu proje yönetiminde her görünümün sorunları analiz etmenize nasıl yardımcı olabileceğini öğreneceksiniz.
Sınıfa göre düzenle: Belirli sınıfları bulmak istediğinizde veya bellek havuzundan önbelleğe alınan ya da yeniden kullanılan nesneleri oluşturmak için kullanılır.
Örneğin, "Vertex" her saniye, Tahsis sayısını 2.000 ve sınıfa göre sıralama yaparken bunu görebilirsiniz. Şunu yeniden kullanmak istiyorsanız: bu nesneleri boşa çıkarmamak için bir bellek havuzu uygulayın.
Çağrı yığınına göre düzenle: Burada, sıcak ve yoğun bir şekilde belleğin ayrıldığı yol (bir döngünün içinde veya bir çok fazla ayırma çalışması yapan belirli bir işlevdir.
Sığ Boyut: Yalnızca nesnenin kendisinin belleğini izler. Faydalı içeren basit sınıfları izlemek için geliştirilmiştir.
Tutulan Boyut: Nesne ve referanslar nedeniyle toplam belleği gösterir veriler yer alır. Hafızayı takip etmek için basınç oluşur. Bu değeri elde etmek için tam bellek alın dökümünü alır ve Korunan Boyut bir sütun olarak eklenir; Şekil 11'de gösterilmiştir.
. Şekil 10. Tam bellek dökümü.
Şekil 11. Tutulan Boyut sütunu.
Optimizasyonun etkisini ölçün.
GC'ler daha belirgindir ve belleğin etkisini ölçmek daha kolaydır. optimize edebilirsiniz. Optimizasyon, bellek baskısını düşürdüğünde daha az GC
Optimizasyonun etkisini ölçmek için profil oluşturucu zaman çizelgesinde süre ile sınırlıdır. Bu durumda, GC'ler arasında sürenin daha uzun olduğunu görebilirsiniz.
Bellek iyileştirmelerinin nihai etkileri şunlardır:
- Uygulama sürekli olarak güncelleme yapmazsa bellek yetersizliği nedeniyle kapatma işlemleri muhtemelen azalır bellek baskısına uğrar.
- Daha az GC'ye sahip olmak, özellikle P99'da jank metriklerini iyileştirir. Bu çünkü GC'ler CPU anlaşmazlığına neden olur ve bu da, oluşturma görevlerinin ertelenmesi gerekebilir.
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Uygulama başlatma analizi ve optimizasyonu {:#app-startup-analysis-OPT}
- Donmuş kare
- Macrobenchmark yazma