Bu dokümanda, Android uygulamalarıyla ilgili en iyi uygulama kılavuzuna uyguladığınız varsayılmaktadır depolama alanı yönetimi gibi Uygulamanızın belleğini yönetin.
Giriş
Bellek sızıntısı, bilgisayar çalışırken ve programının, artık ihtiyaç duyulmayan, ayrılmış belleği bırakmaması. Sızıntı uygulamanın işletim sisteminden, sahip olduğundan daha fazla bellek istemesine uygulamayı kilitleyebilir. Bir dizi uygunsuz uygulama Android uygulamalarında bellek sızıntılarına neden olabilir; örneğin, dinleyicilerin kaydını iptal etmeme gibi sorunların çözümüne yardımcı olabilir.
Bu belgede, kırılımını önlemek, tespit etmek, ve kodunuzdaki bellek sızıntılarını giderin. Bu bölümdeki yöntemleri denediyseniz bir bellek sızıntısı olduğundan şüphelenilmesi için Google SDK'larıyla ilgili sorunları bildirme
Destek ekibiyle iletişime geçmeden önce
Bir anı sızıntısını Google Destek Ekibi'ne bildirmeden önce aşağıdaki talimatları uygulayın: hata ayıklama adımlarıyla birlikte anlatıldığı gibi, ve hatanın kodunuzda olmadığından emin olun. Bu adımlar sorununuzu çözebilir ve yoksa Google Destek Ekibi'nin ihtiyacı olan bilgileri size yardımcı olur.
Bellek sızıntılarını önleme
Bu en iyi uygulamaları izleyerek Google SDK'larını kullanan kodda bellek sızıntıları.
Android uygulamaları için en iyi uygulamalar
Android uygulamanızda aşağıdakilerin hepsini yaptığınızdan emin olun:
- Kullanılmayan kaynakları serbest bırakın.
- Artık gerekli olmadığında dinleyicilerin kaydını iptal edin.
- Gerekmediğinde görevleri iptal edin.
- Kaynakları serbest bırakmak için yaşam döngüsü yöntemlerini yönlendirin.
- SDK'ların en son sürümlerini kullanma
Bu uygulamaların her birine ilişkin ayrıntılar için aşağıdaki bölümlere bakın.
Kullanılmayan kaynakları serbest bırakın
Android uygulamanız bir kaynak kullandığında, artık ihtiyacınız yok. Aksi takdirde kaynak, belleği kullanmaya devam eder. ve başvurunuz üzerlerinde bile kalmaya devam edecektir. Daha fazla bilgi için Etkinlik yaşam döngüsü inceleyebilirsiniz.
GeoSDK'larda eski GoogleMap referanslarını yayınlayın
Google Map uygulamasının, NavigationView veya MapView. Bir Google Haritası'nın, Alındığı NavigationView veya MapView. Siz bir Googleharitasının önbelleğe alınmamasını veya referansın NavigationView#onDestroy veya MapView#onDestroy çağrıldığında serbest bırakılır. Eğer NavigationSupportFragment, MapSupportFragment veya kendi parçanızı kullanarak sarmaladığını düşünelim. Bu durumda referans, Fragment#onDestroyView.
class NavFragment : SupportNavigationFragment() {
var googleMap: GoogleMap?
override fun onCreateView(
inflater: LayoutInflater,
parent: ViewGroup?,
savedInstanceState: Bundle?,
): View {
super.onCreateView(inflater,parent,savedInstanceState)
getMapAsync{map -> googleMap = map}
}
override fun onDestroyView() {
googleMap = null
}
}
Artık ihtiyaç olmadığında dinleyicilerin kaydını iptal edin
Android uygulamanız düğme gibi bir etkinlik için bir işleyici kaydettiğinde veya görünümün durumunda bir değişiklik fark ederseniz, dinleyicinin kaydını iptal ettiğinizden emin olun. Böylece, uygulamanın etkinliği izlemesi gerekmiyor. Aksi takdirde uygulamanız tamamlandıktan sonra bile hafızayı kullanmaya devam eder. görüntüleyebilirsiniz.
Örneğin, uygulamanızın Navigasyon SDK'sını kullandığını ve
aşağıdaki dinleyiciye varış etkinliklerini dinlemesini söyleyin:
addArrivalListener
varış etkinliklerini dinleme yöntemini kullandığında,
removeArrivalListener
.
var arrivalListener: Navigator.ArrivalListener? = null
fun registerNavigationListeners() {
arrivalListener =
Navigator.ArrivalListener {
...
}
navigator.addArrivalListener(arrivalListener)
}
override fun onDestroy() {
navView.onDestroy()
if (arrivalListener != null) {
navigator.removeArrivalListener(arrivalListener)
}
...
super.onDestroy()
}
Gerekmediğinde görevleri iptal et
Android uygulaması, indirme veya indirme gibi eşzamansız bir görev başlattığında ağ isteğini yerine getiriyorsa, tamamlandığında görevi iptal ettiğinizden emin olun. Görev, iptal edilmezse uygulamadan sonra bile arka planda çalışmaya devam eder işledik.
En iyi uygulamalarla ilgili daha fazla bilgi için Uygulamanızın belleğini yönetme inceleyebilirsiniz.
Kaynakları serbest bırakmak için yaşam döngüsü yöntemlerini yönlendirme
Uygulamanız Navigasyon veya Haritalar SDK'sını kullanıyorsa
kaynakları navView
adresine yönlendirmek için yaşam döngüsü yöntemlerini (kalın olarak gösterilmiştir) navView
adresine yönlendirin. Şunları yapabilirsiniz:
bunu Navigasyon SDK'sında NavigationView
ya da Haritalar'da MapView
kullanarak yapın veya
Gezinme SDK'sı. Ayrıca SupportNavigationFragment
veya
Doğrudan NavigationView
ve MapView
kullanmak yerine SupportMapFragment
,
tıklayın. Destek parçaları, yaşam döngüsünün yönlendirilmesini sağlar
yöntemlerine göz atın.
class NavViewActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
navView = ...
navView.onCreate(savedInstanceState)
...
}
override fun onSaveInstanceState(savedInstanceState: Bundle) {
super.onSaveInstanceState(savedInstanceState)
navView.onSaveInstanceState(savedInstanceState)
}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
navView.onTrimMemory(level)
}
/* Same with
override fun onStart()
override fun onResume()
override fun onPause()
override fun onConfigurationChanged(...)
override fun onStop()
override fun onDestroy()
*/
}
SDK'ların en son sürümlerini kullanın
Google SDK'ları sürekli yeni özellikler, hata düzeltmeleri ve performans iyileştirmeleri. Bunları almak için uygulamanızdaki SDK'ları güncel tutun gider.
Bellek sızıntılarında hata ayıklama
Geçerli tüm bu dokümanın önceki bölümlerinde hata ayıklamak için bu işlemi uygulayın.
Başlamadan önce Android'in nasıl yönettiğini öğrendiniz. hafızada bulabilirsiniz. Bilgi için Android Bellek yönetimine genel bakış.
Bellek sızıntılarında hata ayıklamak için şu işlemi uygulayın:
- Sorunu yeniden oluşturun. Bu adım, hata ayıklamak için elzemdir.
- Bellek kullanımının beklenip beklenmediğini kontrol edin. Lütfen bir sızıntı gibi görünen kullanım artışı aslında bellekten ibaret değil. gereklidir.
- Üst düzeyde hata ayıklayın. Kullanabileceğiniz birçok yardımcı program vardır. dört yöntem var. Bellek sorunlarının giderilmesine yardımcı olan üç farklı standart araç seti Android'de: Android Studio, Perfetto ve Android Debug Bridge (adb) komut satırı yardımcı programları.
- Uygulamanızın bellek kullanımını kontrol etme. Yığın dökümü alın ve ve analiz etmenize yardımcı olur.
- Bellek sızıntılarını düzeltme.
Aşağıdaki bölümlerde bu adımlar ayrıntılı olarak ele alınmaktadır.
1. Adım: Sorunu yeniden oluşturun
Sorunu yeniden oluşturamadıysanız öncelikle senaryoları düşünün bu durum hafıza sızıntısına neden olabilir. Doğrudan bir görsele bakarken yığın dökümü çalışabilir. Ancak, Uygulama başlatılırken veya zaman içinde başka bir rastgele noktayla bir yığın dökümü görürseniz o durumda sızıntıyı tetikleyecek koşulları etkinleştirmemiş olabilirsiniz. Dikkatlice Farklı senaryolarla çalışarak sorunu yeniden oluşturun:
Hangi özellik grubu etkinleştirilir?
Hangi kullanıcı işlemi dizisi sızıntıyı tetikler?
- Bu diziyi etkinleştirmek için tekrar tekrar denediniz mi?
Uygulama hangi yaşam döngüsü durumlarında döngüsünü gerçekleştirdi?
- Farklı yaşam döngüsü durumlarında birden fazla yineleme denediniz mi?
Sorunu en son SDK sürümünde yeniden oluşturabildiğinizden emin olun. İlgili içeriği oluşturmak için kullanılan sorun giderilmiş olabilir.
2. Adım: Uygulama için bellek kullanımının beklenip beklenmediğini kontrol edin
Her özellik ek bellek gerektirir. Farklı senaryolarda hata ayıklarken bunun beklenen bir kullanım olup olmadığını veya gerçekten olabilir. Örneğin, farklı özellikler veya kullanıcı görevleri için şu olasılıklar:
Olası bir sızıntı: Senaryoyu birden fazla yinelemeyle etkinleştirme zamanla bellek kullanımında bir artışa neden olur.
Beklenen bellek kullanımı: Bellek, senaryodan sonra geri yüklenir durdurulur.
Muhtemelen beklenen bellek kullanımı: Bellek kullanımı şu süreyle devam eder: zaman azalır. Bu durum, sınırlı bir önbellekten veya beklenen diğer nedenlerden kaynaklanıyor olabilir. bellek kullanımından kaynaklanır.
Uygulama davranışı beklenen bellek kullanımı ise sorun bu soruna çözüm bulmanız gerekir. Yardım için bkz. Uygulamanızın belleğini yönetin.
3. Adım: Üst düzeyde hata ayıklayın
Bellek sızıntısını ayıklarken yüksek düzeyde başlayıp daha sonra ayrıntılı inceleme yapın potansiyel riskleri daralttığınızda Aşağıdaki üst düzey kodlardan birini kullanın: :
Android Studio Bellek Profil Aracı (Önerilen)
Android Debug Bridge (adb) komut satırı yardımcı programları
Android Studio Bellek Profil Aracı
Bu araç, tüketilen belleğe ilişkin görsel bir histogram sunar. Yığın dökümleri ve tahsis izleme de aynı arayüzden tetiklenebilir. Bu olacaktır. Daha fazla bilgi için bkz. Android Studio Bellek Profil Aracı.
Perfetto Bellek Sayaçları
Perfetto, hassas kontrol sahibi olmanızı sağlar. fazla zaman harcıyor ve bunları tek bir histogramda sunuyor. Örneğin, daha fazla bilgi için Perfetto Bellek Sayaçları.
Android hata ayıklama köprüsü (adb) komut satırı yardımcı programları
Perfetto ile takip edebileceğiniz içeriklerin çoğu adb
komut satırı yardımcı programıdır. Birkaç önemli
örnekler:
Meminfo, belirli bir zamandaki ayrıntılı bellek bilgilerini görüntüleme.
Procstats, toplu hale getirilmiş bazı önemli istatistikleri görebilirsiniz.
Burada dikkat edilmesi gereken çok önemli bir istatistik,
maksimum fiziksel bellek ayak izidir.
(maxRSS) oluşturun. MaxPSS doğru olmayabilir. Örneğin,
öğrenmek için
adb shell dumpsys procstats --help –start-testing
işareti.
Ayırma izleme
Ayırma izleme, belleğin ayrıldığı yığın izlemeyi (stack trace) serbest bırakılmadığı takdirde de. Bu adım özellikle de sudaki sızıntıları takip ederken yerel koda karşılık gelir. Bu araç yığın izlemeyi tanımladığından, kök nedende hızla hata ayıklamak veya sorunun kaynağını tekrar sorun. Tahsis izlemeyi kullanma adımları için Ayırma izlemeyle yerel kodda bellek hatalarını ayıklayın.
4. Adım: Yığın dökümü ile uygulamanızın bellek kullanımını kontrol edin
Bellek sızıntısını tespit etmenin bir yolu, uygulamanızın yığın dökümünü almaktır ve sızıntı olup olmadığını kontrol edin. Yığın dökümü, tüm nesnelerin anlık görüntüsüdür bir depolama alanı kullanır. Bellek sızıntılarını teşhis etmek için kullanılabilir sorunları çözebilir.
Android Studio, GC tarafından düzeltilemeyen bellek sızıntılarını algılayabilir. Fotoğraf çekerken Android Studio, bir etkinlik veya parça olup olmadığını kontrol eder. hâlâ erişilebilir olan ancak zaten kaldırılmış olan bir dosya seçin.
- Yığın dökümü yakalayın.
- Bellek sızıntılarını bulmak için yığın dökümünü analiz edin.
- Bellek sızıntılarını düzeltme.
Ayrıntılar için aşağıdaki bölümleri inceleyin.
Yığın dökümü yakalayın
Yığın dökümünü yakalamak için Android Debug Bridge (adb) veya Android Studio Bellek Profil Aracı.
Yığın dökümünü yakalamak için adb kullanma
Yığın dökümünü adb için aşağıdaki adımları uygulayın:
- Android cihazınızı bilgisayarınıza bağlayın.
- Bir komut istemi açın ve adb araçlarının bulunduğu dizine gidin.
Yığın dökümünü yakalamak için şu komutu çalıştırın :
adb shell am dumpheap my.app.name $PHONE_FILE_OUT
Yığın dökümünü almak için şu komutu çalıştırın:
adb pull $PHONE_FILE_OUT $LOCAL_FILE.
Yığın dökümü yakalamak için Android Studio'yu kullanma
Android Studio Bellek Profil Aracı'nı kullanarak yığın dökümünü yakalamak için şu talimatları uygulayın: Android'deki adımlar Yığın dökümü yakalama bölümüne ekleyin.
Bellek sızıntılarını bulmak için yığın dökümünü analiz etme
Yığın dökümünü yakaladıktan sonra Android Studio Memory'i kullanabilirsiniz Profil Aracı'nı kullanabilirsiniz. Bunu yapmak için şu adımları uygulayın:
Android projenizi Android Studio'da açın.
Çalıştır'ı, ardından Hata ayıkla yapılandırmasını seçin.
Android Profiler sekmesini açın.
Bellek'i seçin.
Yığın dökümünü aç'ı ve oluşturduğunuz yığın dökümü dosyasını seçin. Bellek profil aracı, uygulamanızın bellek kullanımının bir grafiğini gösterir.
Yığın dökümünü analiz etmek için grafiği kullanın:
Kullanılmayan nesneleri belirleyin.
Çok fazla bellek kullanan nesneleri tanımlamak.
Her bir nesnenin ne kadar bellek kullandığını görebilirsiniz.
Bellek sızıntısının kapsamını daraltmak veya kaynağını bulmak için bu bilgileri kullanın. ve düzeltebilirsiniz.
5. Adım: Bellek sızıntılarını düzeltin
Bellek sızıntısının kaynağını belirledikten sonra bunu düzeltebilirsiniz. Android uygulamalarınızdaki bellek sızıntılarını düzeltmek, performansı iyileştirmeye yardımcı olur ve kararlılığını kontrol edin. Senaryoya bağlı olarak, ayrıntılar değişiklik gösterir. Ancak, aşağıdaki öneriler yardımcı olabilir:
Uygulamanızın, belleği Android konusu Uygulamanızın belleğini yönetin.
Kullanılmayan kodları veya kaynakları uygulamanızdan kaldırın. Android uygulamalarıyla ilgili ayrıntılar için Android uygulamaları için en iyi uygulamalar başlıklı makaleyi inceleyin.
Diğer hata ayıklama araçları
Bu adımlar tamamlandıktan sonra, şu araçları deneyin:
Ayırma izlemeyle yerel kodda bellek hatalarını ayıklama
Doğrudan yerel kodu kullanmasanız bile, bazı yaygın Android kitaplıkları Google SDK'ları dahil. Bellek sızıntınızın yerel kodda olduğunu düşünüyorsanız zaman çizelgesi çeşitli araçlardan hata ayıklamak için kullanabilirsiniz. İkisinden biriyle atama izleme Android Studio veya heapprofd (Perfetto ile de uyumludur) inceleyerek bir riskin olası nedenlerini genellikle hata ayıklamanın en hızlı yoludur.
Ayırma izlemesi ayrıca, bir veri sayfasındaki büyük bir kısmı ancak yığında bulunabilecek hassas bilgileri içermez.
LeakCanary ile sızıntıları tespit edin
LeakCanary, Android uygulamalarındaki bellek sızıntılarını tanımlamak için kullanılan güçlü bir araçtır. LeakCanary'yi uygulamanızda kullanma hakkında daha fazla bilgi edinmek için şu adresi ziyaret edin: LeakCanary.
Google SDK'larıyla ilgili sorunları bildirme
Bu dokümandaki yöntemleri denediyseniz ve bellek sızıntısı olduğundan şüpheleniyorsanız için aşağıdaki bilgilerin mümkün olduğunca çoğunu içeren müşteri desteğine başvurun: yapın:
Bellek sızıntısını yeniden oluşturma adımları Adımlar karmaşık kodlama gerektiriyorsa sorunu çoğaltan kodu örnek uygulamamıza kopyalamak işe yarayabilir ve sızıntısı.
Sorunun yeniden oluşturulduğu, uygulamanızdan yakalanan yığın dökümleri. Yakalama yığını zamanla ilgili dökümler oluşturur. Bu da, önemli bir artış gördük.
Yerel bellek sızıntısı bekleniyorsa ayırmayı paylaşın çıktı takibini yapıyor heapprofd.
Sızıntı durumunu yeniden oluşturduktan sonra alınan bir hata raporu.
Bellekle ilgili kilitlenmelerin yığın izlemeleri.
Önemli not: Yığın izleme (stack trace) genellikle tek başına yeterli değildir hatasını ayıklayın, bu nedenle diğer formlardan birini de düşünülebilir.