Bu doküman, uygulamanızdaki önemli performans sorunlarını belirlemenize ve düzeltmenize yardımcı olur.
Temel performans sorunları
Bir uygulamanın performansının düşmesine neden olabilecek birçok sorun vardır. Ancak uygulamanızda karşılaşabileceğiniz bazı yaygın sorunlar şunlardır:
- Başlangıç 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. Sıfırdan başlatma, başlatılan uygulama sistem belleğinde olmadığında gerçekleşir. Bu durum, uygulamanın yeniden başlatmadan sonraki ilk başlatılması veya uygulama işlemi durdurulduğunda kullanıcı veya sistem tarafından yapılabilir.
Buna karşılık, hazır durumda başlatma, uygulama arka planda çalışırken gerçekleşir. Baştan başlatma, her şeyi depolama alanından yüklemesi ve uygulamayı başlatması gerektiğinden sistemden en fazla çalışmayı gerektirir. Baştan başlatma işlemlerinin 500 ms veya daha kısa sürmesini sağlamaya çalışın.
P95 ve P99 gecikmeleri, ortanca gecikmeye çok yakın. Uygulama başlaması uzun sürer ve kötü bir kullanıcı deneyimine yol açar. Uygulamanın başlatılmasının kritik yolunda kilit anlaşmazlığı yaşanabilir ve tutarsızlıklar ortaya çıkabilir. Bunun nedeni, işlemler arası iletişimler (IPC'ler) ve gereksiz G/Ç işlemleridir.
- Kaydırma engeli
Takılma, sistem istenilen 60 Hz veya daha yüksek ritimde ekrana çizilecek kareleri zamanında oluşturup sağlayamadığında ortaya çıkan görsel kesintiyi tanımlayan terimdir. 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 birçok yeni cihaz, kaydırma gibi kullanıcı etkileşimleri sırasında 90 Hz modunda çalışır. Bazı cihazlar 120 Hz'ye kadar daha yüksek hızları destekler.
Bir cihazın belirli bir zamanda kullandığı yenileme hızını görmek için Hata ayıklama bölümünde Geliştirici Seçenekleri > Yenileme hızını göster'i kullanarak yer paylaşımını etkinleştirin.
- Sorunlu 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. Bunun nedeni, yalnızca ayırma işlemlerinin Android Runtime (ART) tarafından yapılmasının değil, daha sonra bu nesnelerin serbest bırakılmasının (çöp toplama) da zaman ve çaba gerektirmesidir. Hem ayırma hem de toplama işlemi, özellikle geçici nesneler için çok daha hızlı ve verimlidir. Geçmişte mümkün olduğunda nesne ayırmaktan kaçınmak en iyi uygulama olarak kabul edilse de uygulamanız ve mimariniz için en uygun seçeneği belirlemenizi öneririz. 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, iç döngünüzde çok sayıda nesne ayırıyorsanız performans sorunlarına yol açabileceğini unutmayın.
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 bildirim dahil olmak üzere yaygın başlangıç 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üren akışlar.
- Aşağıdaki hata ayıklama araçlarını kullanarak önceki akışlar sırasında neler olduğunu inceleyin:
- Perfetto: Cihazda neler olup bittiğini görmenizi sağlar. verileri daha iyi anlamanızı sağlar.
- Bellek Profiler: Yığın üzerinde hangi bellek ayırmalarının yapıldığını görmenizi sağlar.
- Simpleperf: Belirli bir süre boyunca en fazla CPU kullanan işlev çağrılarının alev grafiğini gösterir. 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. Ancak kullanıcıların gerçekte ne gördüğünü anlamak ve gerilemelerin ne zaman gerçekleşebileceğini belirlemek için otomatik testte ve sahada metrik toplamayı ayarlamak önemlidir:
- Başlatma akışları
- Alan metrikleri: Play Console başlatma süresi
- Laboratuvar testleri: Macrobenchmark ile başlatmayı test etme
- Jank
- Alan metrikleri
- Play Console çerçevesi temel metrikleri: Play Console'da metrikleri belirli bir kullanıcı yolculuğuyla sınırlayamazsınız. 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, belirli bir kullanıcı yolculuğundaki takılmadaki değişimi anlamanın bir yoludur. Karelerin çizilmesinin ne kadar sürdüğünü vurgulayanRenderTime
metrikleri, gerileme veya iyileştirmeleri belirlemek için sarsıntılı karelerin sayısından daha önemlidir.
- Alan metrikleri
Uygulama bağlantısı 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ı doğrulamalarının başarısız olmasına neden olabilecek nedenler aşağıda verilmiştir.
- Intent filtresi kapsamları: Yalnızca uygulamanızın yanıt verebileceği URL'lerin intent filtrelerine
autoVerify
ekleyin. - Doğrulanmamış protokol geçişleri: Doğrulanmamış sunucu tarafı ve alt alan adı yönlendirmeleri güvenlik riski olarak kabul edilir ve doğrulama işleminde başarısız olur. Bu, tüm
autoVerify
bağlantılarının başarısız olmasına neden olur. Ö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 edin gürültü kaynaklarını bastırmak için kullanılır. Aşağıdaki bölümlerde, test kurulumu hazırlamak için uygulayabileceğiniz APK'ya ve sisteme özgü bazı adımlar (bazıları kullanım alanına özeldir) gösterilmektedir.
İ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 düzeyi 29) ve sonraki sürümleri çalıştıran cihazlar, sürüm derlemelerinde profillemeyi etkinleştirmek için manifest dosyalarında profileable android:shell="true"
kullanabilir.
Ü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 planda anında (JIT) etkinlik önemli performans yükü oluşturabilir ve test çalıştırmaları arasında APK'yı yeniden yüklüyorsanız bu etkinliğe sık sık ulaşırsınız. 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
Modu, uygulamayı kullanım sırasında toplanan kullanılan kod yollarının profiline göre derleyebilir. 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
Makro karşılaştırma, derleme modunu doğrudan 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. Aynı cihaz ve işletim sistemi sürümünde A/B karşılaştırmaları çalıştırın. Aynı cihaz türünde bile performansta önemli farklılıklar olabilir.
Köklenmiş cihazlarda mikro karşılaştırmalar için lockClocks
komut dosyası kullanmayı düşünebilirsiniz. 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.
Uygulama lansmanı, DoU testi ve takılma testi gibi kullanıcı deneyimine odaklanan testler için lockClocks
komut dosyası kullanmanızı önermeyiz ancak mikro karşılaştırma testlerinde gürültüyü azaltmak için gerekli olabilir.
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 örnek izlemede gösterildiği gibi, ilk etkinlik tarafından herhangi bir kare çizilmeden bir activityStart
hemen başka bir activityStart
tarafından takip edilir.
Bu durum hem bildirim giriş noktasında hem de normal bir uygulama başlangıç giriş noktasında gerçekleşebilir ve genellikle yeniden yapılandırarak çözülebilir. Örneğin projenin zamanlamasıyla ilgili başka bir etkinlik çalıştırılmadan önce kurulumu gerçekleştirmek için bu etkinliğin kullanılması durumunda, yeniden kullanılabilir bir bileşene veya kitaplığa dönüştürmenizi sağlar.
GC'leri sık tetikleyen gereksiz ayırmalar
Systrace'te, beklenenden daha sık çöp toplama işlemi (GC) gerçekleştiğini görebilirsiniz.
Aşağıdaki örnekte, uzun süren bir işlem sırasında her 10 saniyede bir, uygulamanın zaman içinde gereksiz ancak tutarlı bir şekilde ayırma işlemi gerçekleştirdiğinin bir göstergesidir:
Bellek Profilleyici'yi kullanırken belirli bir çağrı yığınının, ayırmaların büyük çoğunluğunu yaptığını da fark edebilirsiniz. Tüm tahsisleri agresif bir şekilde ortadan kaldırmanız gerekmez. Aksi takdirde kodun bakımı zorlaşır. Bunun yerine tahsislerin hotspot'ları üzerinde çalışarak başlayın.
Bozuk kareler
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, arabelleğe alma özelliğini kullanarak bir kareyi "kurtarabilir". Ancak, sorunlu kareleri uygulamanızın bakış açısından belirlemek için bu ayrıntıların çoğunu göz ardı edebilirsiniz.
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:
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:
Bu normal ritimde bir kesinti gördüğünüzde, 5. resimde gösterildiği gibi sarsıntılı bir kare olur:
Bunları tespit ederek alıştırma yapabilirsiniz.
Bazı durumlarda, hangi görünümlerin şişirildiği veya RecyclerView
'ün ne yaptığı hakkında daha fazla bilgi edinmek için bir izleme noktasını yakınlaştırmanız gerekir. 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.
Sık karşılaşılan 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
öğesinin her seferinde tamamen yeniden oluşturulmasına neden olabilirsiniz. İç 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öntemlerine yer verilmiştir. Görüntüleyin sistem izleme ve Studio profil aracı.
Systrace ile uygulama başlatma sorunlarını giderme
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.
Aşağıdaki aşamalarda başlatma türlerinin anlamını netleştirebilirsiniz:
- Soğuk başlatma: Kayıtlı durum içermeyen yeni bir işlem oluşturarak başlayın.
- Hazır başlatma: İşlemi yeniden kullanırken etkinliği yeniden oluşturur veya işlemi kaydedilen durumda yeniden oluşturur.
- Sıcak başlatma: Etkinliği yeniden başlatır ve şişirme işleminin başından başlar.
Cihazdaki Sistem İzleme uygulaması ile sistem izleme kayıtları almanızı öneririz. Android 10 ve sonraki sürümler için Perfetto'yu kullanın. Android 9 ve önceki sürümlerde Systrace'i kullanın. Ayrıca, izleme dosyalarını web tabanlı Perfetto izleme görüntüleyicisiyle görüntülemenizi öneririz. Daha fazla bilgi için Sisteme genel bakışı inceleyin. izleme.
Dikkat etmeniz gereken bazı noktalar şunlardır:
- İzleyici çekişmesi: İzleyici tarafından korunan kaynaklar için rekabet, uygulamanın başlatılmasında önemli gecikmeler oluşturabilir.
Senkronize bağlayıcı işlemleri: Uygulamanızın kritik yolunda gereksiz işlemleri arayın. Gerekli bir işlem pahalıysa ilgili platform ekibiyle iletişim kurup
Eşzamanlı GC: Bu durum yaygındır ve nispeten düşük bir etkiye sahiptir. Ancak bu durumu sık sık yaşıyorsanız Android Studio bellek profilleyicisini kullanarak bu konuyu incelemeyi düşünebilirsiniz.
G/Ç: Başlatma sırasında gerçekleştirilen G/Ç'yi kontrol edin ve uzun duraklar arayı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 izleme işleyicisi aracılığıyla RFD tarafından tanımlanan başlangıç zamanlarını ayıklayabilirsiniz. Bu işlem sonucunda 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, cihazı prize takmanıza veya adb
'e bağlamanıza gerek kalmadan cihazdan iz kaydetmenize olanak tanır.
Android Studio Memory Profiler'ı kullanma
Bellek basıncını incelemek için Android Studio Bellek Profil Aracı'nı kullanabilirsiniz neden olabilir. Nesne tahsislerinin canlı görüntüsünü sağlar.
GC'lerin neden ve ne sıklıkta gerçekleştiğini izlemek için bellek profilleyiciyi kullanarak uygulamanızdaki bellek sorunlarını düzeltebilirsiniz.
Uygulama belleğini profillemek için aşağıdaki adımları uygulayın:
Bellek sorunlarını algılama.
Odaklanmanızı istediğiniz kullanıcı yolculuğunun bellek profilleme oturumunu kaydedin. Şekil 7'de gösterildiği gibi, nesne sayısında artış olup olmadığına bakın. GC'lere yönlendirir.
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.
Bu verileri sıralamanın birden fazla yolu vardır. Aşağıda, her bir görünümün sorunları analiz etmenize nasıl yardımcı olabileceğine dair bazı örnekler verilmiştir.
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, her saniye "Vertex" adlı sınıfta 2.000 nesne oluşturan bir uygulama görürseniz bu uygulama, Ayrımlar sayısını her saniye 2.000 artırır ve sınıfa göre sıralarken bu uygulamayı görürsünüz. Çöp oluşturmamak için bu nesneleri yeniden kullanmak istiyorsanız bir bellek havuzu uygulayın.
Çağrı yığınına göre düzenle: Bir döngü içinde veya çok fazla ayırma çalışması yapan belirli bir işlevin içinde olduğu gibi, belleğin ayrıldığı yoğun bir yolun nerede olduğunu bulmak istediğinizde kullanışlıdır.
Sığ Boyut: Yalnızca nesnenin kendisinin belleğini izler. Çoğunlukla yalnızca ilkel değerlerden oluşan basit sınıfları izlemek için kullanışlıdır.
Tutulan Boyut: Nesne ve referanslar nedeniyle toplam belleği gösterir veriler yer alır. Karmaşık nesnelerden kaynaklanan bellek baskısını izlemek için kullanışlıdır. Bu değeri almak için Şekil 10'da gösterildiği gibi tam bir bellek dökümü alın ve Şekil 11'de gösterildiği gibi Saklanan Boyut sütunu eklenir.
Optimizasyonun etkisini ölçün.
GC'ler daha belirgindir ve belleğin etkisini ölçmek daha kolaydır. optimize edebilirsiniz. Bir optimizasyon bellek baskısını azalttığında daha az GC görürsünüz.
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 daha uzun süre geçtiğini görebilirsiniz.
Bellek iyileştirmelerinin nihai etkileri şunlardır:
- Uygulama sürekli olarak bellek baskısına maruz kalmıyorsa bellek yetersizliği nedeniyle kapatılma olasılığı azalır.
- Daha az GC'ye sahip olmak, özellikle P99'da sarsıntı 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-optimization}
- Donmuş kare
- Macrobenchmark yazma