Ustalaşmanız gereken Android soğuk başlatma optimizasyonu

Önsöz

Olay, sözleşmenin yayınlanmasından iki gün önce meydana geldi ve çevrimiçi hale geldi. XX Cloud'un mobil testi sırasında soğuk çalıştırma hızının ortalamanın altında olması sorununa yol açtı.Daha önce optimizasyonu denedim, ancak etkisinin çok açık olmadığını gördüm. Geliştiriciler, soğuk başlatma optimizasyon problemini incelemek için biraz boş zamanın avantajlarından yararlanıyor.

Uygulama başlatma süreci

"Uygulama başlangıç zamanı" resmi belgesinde Uygulama başlangıcının açıklaması hakkında bilgi edinebiliriz. Uygulama başlangıcı, soğuk başlatma, sıcak başlatma ve sıcak başlatma olarak ikiye ayrılır. Soğuk başlatma, daha karmaşık bilgiler içeren sıfırdan bir uygulamadır. Bu sefer esas olarak uygulamanın soğuk başlangıcını analiz ediyor ve optimize ediyoruz. Uygulama soğuk başlatıldığında, aşağıdaki üç görevi yerine getirmesi gerekir:

  • Uygulamayı yükleyin ve başlatın;
  • Uygulama başlatıldıktan hemen sonra boş bir başlangıç penceresi görüntülenir;
  • Bir Uygulama programı oluşturma süreci;

Bu üç görev yürütüldükten sonra, sistem bir başvuru süreci oluşturur, ardından başvuru süreci bir sonraki adımı yürütür:

  • Uygulama nesnesi oluşturun;
  • Ana Konuya Başlayın;
  • Başlangıç sayfasının Aktivitesini oluşturun;
  • Yük Görünümü;
  • Ekranı düzenleyin
  • İlk çizimi gerçekleştirin;

Uygulama süreci ilk çizimi tamamladıktan sonra, sistem işlemi o anda görüntülenen arka plan penceresini başlangıç sayfasının Etkinliği ile değiştirir ve kullanıcı şu anda Uygulamayı kullanabilir. Aşağıdaki şekil, sistemin ve uygulamaların iş akışını göstermektedir.

Yukarıdaki şekilden ve yukarıdaki adımlardan, başvuru sürecinin oluşturulduğunu bilebiliriz, o zaman kesinlikle bizim Uygulama yaşam döngüsü , Uygulamanın uygulama süreci oluşturulduğunda, ana iş parçacığı ilk sayfamız MainActivity ve MainActivity'nin yaşam döngüsünü yürütün . Kilit noktaları bilinçli olarak cesaretlendirdim, optimize edebileceğimiz kısım bu. Nasıl optimize edeceğimizi analiz etmeden önce, uygulamamızın soğuk çalıştırma için optimize edilmesi gerekip gerekmediğini anlayabiliriz.

Not: Aslında bunlar yüzeyde gördüğümüz şeyler.Eğer içine iyice girmemiz gerekirse, Zygote Fork sürecini, ActivityManagerService kaynak kodunu vb. Analiz etmeliyiz, bu makalede ayrıntılara girmeyeceğiz ve ilgili kitapları herkese tavsiye etmeyeceğiz. Luo Shengyang'ın "Android Sistem Kaynak Kodu Senaryo Analizi", Liu Wangshu'nun "Android Gelişmiş Şifre Çözme".

Başlangıç zamanı algılama

Peki uygun başlangıç zamanı nedir? Resmi belgede, soğuk başlatma 5 saniye veya daha uzun olduğunda Android vitals, uygulamanızın soğuk başlatma için optimize edilmesi gerektiğini düşüneceği açıklanmaktadır. Bununla birlikte, Android vitals, Google Play için bir uygulama kalitesi test aracıdır, bu yüzden herkes bunu anlar, ancak Alibaba Cloud'un mobil testini benim gibi kullanabilirsiniz.Alibaba Cloud tarafından sağlanan verilere göre, medyan soğuk başlatma endüstri göstergesi 4875.67'dir. ms, uygun şekilde karşılaştırabilirsiniz. Tamam, uygulamamızın soğuk başlama saati tespit edilip edilmediğini konuşalım.

Gösterilen Zaman

Yukarıdaki Şekil 1'de gösterilen Görüntülenen Zaman. Android 4.4 (API düzeyi 19) ve daha yüksek sürümlerde, logcat, Görüntülendi adlı bir günlük mesajı içerir. Bu değer, başlatma işlemi ile ekrandaki karşılık gelen etkinliğin tamamlanması arasında geçen süreyi temsil eder. Zaman miktarı.

ADB komutları

adb kabuğu başlatıyorum -W /

Son yöntem olan Displayed Time kullanılarak log baskı tablosunda, Displayed log'u görüyoruz, ardından ihtiyacımız olan /, doğrudan kopyalayıp kullanabiliyoruz ve sonra AS Terminaline yapıştırıp belirlediğimiz sayfayı yazdırıyoruz. Başlangıç zamanı verileri.

Durum: tamam Etkinlik: com.xx.xxx/com.xx.xxxx.welcome.view.WelcomeActivity Bu Zaman: 242 Toplam Süre: 242 Bekleme Süresi: 288 Tamamlayınız
  • ThisTime: Çağrı sürecindeki son Aktivitenin başlangıcını, bu Aktivitenin startActivityAndWait çağrısının sonuna kadar ifade eder;
  • TotalTime: Çağrı sürecindeki ilk Aktivitenin başlangıç zamanını, son Aktivitenin startActivityAndWait'in sonuna kadar ifade eder.
  • WaitTime: startActivityAndWait yöntemini çağırmak zaman alıcıdır;

reportFullyDrawn

Bazı özel sahnelerde, sadece başlatma sayfasının çizim tamamlanma zamanını geri aramakla kalmayabiliriz, aynı zamanda tam bir zaman olarak sayılmadan önce açılış sayfasının açılış ekranı reklam arayüz verilerini geri çağırmamız bile gerekir.O halde reportFullyDrawn'ı kullanabiliriz.

public class WelcomeActivity, MvpActivity'yi genişletir < WelcomePresenter > WelcomeMvp.View { @Override korumalı void onCreate (@Nullable Bundle registeredInstanceState) { super.onCreate (SavedInstanceState); setContentView (R.layout.activity_welcome); // veri iste mvpPresenter.config (); } @Override public void finishRequest () { // Veri geri çağırma reportFullyDrawn (); } }

Not: Bu yöntem minSdkVersion API19 + gerektirir, bu nedenle SDK sürümünü ayarlamanız veya değerlendirmeniz gerekir.

İzleme

Traceview, Android cihazlar için çok kullanışlı bir performans analiz aracıdır.Programın performansını detaylı bir arayüz üzerinden takip etmemize ve her fonksiyonun zaman alan ve arama sürelerini net bir şekilde görebilmemize olanak tanır.

Systrace

Systrace, API'nin arama sırasını ve her iş parçacığındaki zaman alan durumu sezgisel olarak görüntüler.

Traceview ve Systrace, DDMS panelinin her iki aracıdır, ancak artık AS3.0'ın üzerindeki sürümler artık önerilmemektedir, bu nedenle burada ayrıntılara girmeyeceğim. İlginizi çekiyorsa, son makalemi okuyabilirsiniz "Android Uygulama Optimizasyonunun Düzgünlüğü Bu iki aracın kullanımını ayrıntılı olarak açıklayan Derece Uygulaması ".

Hugo

github.com/JakeWharton ...

JakeWharton'ın hugo'yu, karşılık gelen sınıf veya işlev tarafından tüketilen zamanı açıklamalar yoluyla elde etmek için kullanabiliriz. Başlangıç sayfası Activity yaşam döngüsünün ayrıntılarını ortaya çıkarmak için kullanabiliriz.

Optimizasyon uygulamasına başlayın

Kullanıcı deneyimi optimizasyonu

Ben şahsen soğuk başlatma optimizasyonunun ana deneyiminin başlangıçta beyaz / siyah ekranı ortadan kaldırmak olduğunu düşünüyorum, çünkü kullanıcılar için beyaz / siyah ekranın ilk izlenimi yavaş ve takılı kalıyor. Hedefe ulaşmak için başlangıç sayfasının temasını belirleyebiliriz.

< style name = "WelcomeTheme" parent = "Theme.AppCompat.Light.NoActionBar.FullScreen" > < item name = "android: windowBackground" > @ drawable / shape_welcome < / öğe > < item name = "android: windowDrawsSystemBarBackgrounds" > yanlış < / öğe > < / stil >

windowDrawsSystemBarBackgrounds, bazı sistem işlem çubukları için bir ayardır. Sırada, bu pencerenin arka plan renginin düzeni var.

< katman listesi xmlns: android = " android: opacity = "opaque" > < öğe android: drawable = "@ android: renkli / beyaz" / > < eşya > < bit eşlem android: src = "@ drawable / welcome_bg" android: yerçekimi = "merkez" / > < / öğe > < / layer-list >

Başlangıç sayfasındaki reklamlar görüntülendikten sonra ana sayfaya atlayın ve ardından manifest dosyasında veya kodda ayarlanabilen genel stilimize geri dönüyoruz.

< aktivite ··· android: theme = "@ style / AppBaseFrameTheme" / >

Başlangıç sayfasının temasını ayarladıktan sonra, beyaz ekran / siyah ekran silinecek ve kullanıcı, başlangıç şemasını görüntülemek için Uygulamanın simgesine tıklar ve kullanıcıya hızlı bir başlangıç "illüzyonunu" verir. Aynı zamanda, başlangıç sayfası ile ana sayfa arasındaki geçişi daha doğal hale getirmek için burada animasyon kullanılabilir.

Uygulama başlatma optimizasyonu

Yukarıdaki Şekil 1'deki analiz ve özetten, optimizasyon noktası Application'ın yaşam döngüsü hakkında cesur bir ipucu verdim ve sonra bu bölümü optimize etmek için geri döndük.

1. Uygulama # attachBaseContext ()

Uygulama başlangıcı attachBaseContext () üzerinden geçecek - > onCreate (); Şu anda attachBaseContext'in yaşam döngüsünden ne düşünüyorsunuz? Evet, MultiDex taşeronluk mekanizmasıdır. Muhtemelen herkes, yöntemlerimizin sayısı 65535'i aştığından ve taşeronluk işlendiğinden, beyaz / siyah ekranların başlatılması probleminin ortaya çıktığını görecektir.Alt sözleşme mekanizması, yavaş soğuk başlatma için önemli bir nedendir.Şimdi bazı uygulamalar eklenti yöntemlerini benimsiyor. MultiDex'in neden olduğu beyaz ekran sorununu önlemek için, bu bir yöntem olmasına rağmen, geliştirme maliyeti gerçekten yüksek ve birçok uygulama için gereksizdir. MultiDex optimizasyonundan bahsedelim. İlk olarak, MultiDex iki kısma ayrılabilir: çalışma zamanı ve derleme zamanı:

  • Derleme süresi: İlk dex'i azaltmak için ana dex'te bulunan sınıfların sayısını azaltmak için Uygulamadaki sınıfları belirli bir strateji ile çoklu dex'e bölün;
  • Çalışma Zamanı: Uygulama başladığında, sanal makine yalnızca ana dex'teki sınıfları yükler. Uygulama başlatıldıktan sonra, Multidex.install komutunu kullanarak ClassLoader'daki dexElements'i diğer dex'i yüklemek için yansıtma mekanizması aracılığıyla değiştirin;

İnternetteki birçok pratik analizden, çoğunlukla eşzamansız yöntemler kullanıyorlar. Uygulama önce ana dex paketini yükleyeceği için, alt yüklenici işini bağımsız olarak halledebiliriz.Başlangıç sayfası ve ana sayfa için gerekli olan kitaplıklar ve bileşenler gibi ana sınıfları, ana dex paketinin ince bir şekilde bölünmesini sağlamak için ana dex'e ayırırız. Spesifik çalışma ve yazma yöntemi için, İnternet'teki MultiDex başlangıç optimizasyonu makalesine başvurabilirsiniz, ancak herkes ana dex'in taşeronluk sürecine dikkat etmelidir, ana dex optimizasyon işlemlerimiz serimiz tarafından azaltılmıştır, bu nedenle ana dex'in boyutu artırılmıştır. NoClassDefFoundError olasılığı, şu anda uygulama başlangıcımızın başarısız olma riskine neden olabilir, bu nedenle optimizasyondan sonra iyi bir test işi yapmalıyız.

2. Uygulama # onCreate ()

AttachBaseContext () 'den sonra, onCreate () yaşam döngüsüne ulaşılır. Muhtemelen, uygulamalarımızın çoğu burada kullandığımız üçüncü taraf kitaplıklarını ve bileşenlerini başlatacaktır. Sürümün sürekli yinelemesinden dolayı, üçüncü taraf kitaplıklarının başlatılması doğrudan onCreate () 'de yazılır. Büyük miktarda başlatma çalışması yaşam döngüsünün çok ağır olmasına neden olur. Bu üçüncü taraf kitaplıklarını sınıflandırmalıyız. Aşağıdakiler, Uygulama başlangıcımız tarafından düzenlenen çalışmamın sınıflandırmasıdır:

Yukarıdaki şekle bakıldığında, çeşitli üçüncü taraf araçlarının başlatılması ve iş mantığının başlatılması, başlangıç süresini etkiler. Önce onları dört kısma ayırdık.

  • OnCreate () 'de ve ana süreçte başlatılmalıdır
  • Geciktirilebilir, ancak Uygulamada başlatılması gerekir
  • Başlangıç sayfasının yaşam döngüsü geri aramasının başlatılmasına kadar ertelenebilir
  • Kullanıldığında başlatmayı geciktirin

Kendi projenizin her bir başlangıcını kendi projenize göre listeleyebilir ve ardından sınıflandırabilirsiniz. Spesifik işlem kodunu buraya göndermemiş olsam da, yeni bir iş parçacığı oluşturmanın veya bir IntentService oluşturmanın çok basit olduğunu düşünmüyorum, ancak burada not edilmesi gereken şeyler en optimize soğuk başlangıç çünkü burada da adım attım. çukur. GrowingIO örneğini ele alalım.O zaman, proje GIO'nun çok eski bir versiyonunu kullanıyordu. O sırada, alt iş parçacığı operasyonunda GIO'nun başlatılması gerçekleştiriliyordu.Paket yayınlanmadan hemen önce, operasyon departmanı GIO'nun SDK versiyonunu yükseltmeyi teklif etti. Yapacak bir şey yoksa, doğrudan paketleyin.Çevrimiçi olduktan sonra, yeni sürümün daire içine alınmış veri bulunmadığına dair işlem geri bildirimi.İncelemeden sonra, GIO'nun yeni sürümünün alt iş parçacığında başlatılamadığı bulundu. Bu dersten, soğuk başlangıç optimizasyonuyla ilgilendiğiniz için, kopyalayıp yapıştırdığınız birkaç kod satırını kaçırmamanız gerektiğini düşünüyorum.Bunlar, özel analiz gerektiren özel durumlar. Özetleyeyim Odaklanma

  • Yavaş başlangıç, iş parçacıkları başlatmak beyinsiz değildir ve sonra kodu takın ve tamamdır, doğru ilacı yazmanız gerekir;
  • Threading ayrıca Thread, ThreadPoolExecutor, AsyncTask, IntentService arasından seçim yapılabilecek bir bilimdir;
  • Diyelim ki yeni bir İş Parçacığınız var, ancak bellek sızıntısı sorununu düşünmediniz, delikleri yamalarken çukur kazmayın;
  • Bazı üçüncü taraf SDK'ların ana iş parçacığında başlatılması gerektiğini unutmayın;
  • Uygulama çok işlemcili ise, bazı üçüncü taraf SDK'larının işlemi aynı paket adıyla başlatmanızı gerektirdiğini unutmayın;
  • Aslında, birçok proje var, yıllar süren sürüm yinelemesinden sonra kod çözülmedi.Bu eski kodların ve işe yaramaz kodların sıralanması ve sıralanması gerekiyor;

Başlangıç Sayfası Etkinliğinin Optimizasyonu

  • Yerleşim optimizasyonu Başlangıç sayfamız Faaliyetimiz; başlangıç diyagramı kontrolü, açılış ekranı reklam diyagramı kontrolü, açılış ekranı reklam video kontrolü ve ilk kurulum tanıtım diyagram kontrolünü içerir. Düzen optimizasyonu için, başlangıç diyagramı kontrolü dışında, Uygulama başladığında diğer kontrollerin hiçbiri başlatılmamalıdır.Şu anda ViewStub kullanabiliriz. Belirtilen iş senaryosu için, belirtilen denetimi başlatın.
  • G / Ç işlemlerinden kaçının Veritabanı okuma ve yazma, SharedPreferences # apply () gibi G / Ç işlemlerinin gerçek zamanlı olmadığını biliyoruz. Bu işlemlerin ana iş parçacığının yürütülmesini engelleyip engellemediğine dikkat etmeliyiz.Aynı zamanda, başlatırken disk okuma ve yazma işlemlerini doğru yapıp yapmadığımızı algılayabilen StrictMode katı modunu kullanabiliriz.
  • Resim bitmapinin yükleme hızına ve kodlama formatına dikkat edin.Başlangıç sayfasının çoğunun resimlerin gösterimi olduğunu bilebiliriz, öyleyse resimdeki ayrıntıları nasıl kazabiliriz? Bu, çeşitli üçüncü taraf resim yükleme kitaplıklarının seçimidir. Glide, Picasso, Fresco vb. Tercihlerin yanı sıra PREFER_ARGB_8888, PREFER_RGB_565 seçimlerini de kendi projenize göre yapabilirsiniz.
  • VectorDrawable Nesnelerinin Vektör Grafiklerinde Kullanımı Vektör grafiklerinin özü, zamandan ve alandan tasarruf etmektir. Bazı kullanıcılar için başlangıç resmi bir resim olmayabilir, çok basit, sadece bir logo.Şu anda vektör grafiklerinin kullanımını düşünebiliriz.
  • Activity'deki başlangıç yaşam döngüsünün geri çağrısının Application # onCreate () içinde optimize edildiğini ve bazı gereksiz ağ isteklerinin karşılama sayfasına taşındığını, ancak bu ağ isteği işlemini doğrudan başlangıç sayfasına kopyalayamayacağımızı unutmayın. OnCreate () 'de Activity # onWindowFocusChanged (boolean hasFocus)' u Aktivite yaşam döngüsünde akıllıca kullanabiliriz.Bu, tüm kontroller başlatıldıktan sonra gerçek geri çağırmadır.Ağ işlemlerini buraya koyabiliriz ve tabii ki Servisi de kullanabiliriz.
  • Soğuk başlatma optimizasyon özeti

    Soğuk çalıştırma optimizasyonu için, adım adım analiz etmemiz gerekiyor .. Düzen optimizasyonundan farklı olarak, darboğaz kelimesi birçok kez resmi belgelerde görünerek, soğuk çalıştırma optimizasyon yolumuzun düz olmayacağına işaret ediyor. Android Studio'nun CPU profil oluşturucusundan iyi bir şekilde yararlanın (bu işlevin kullanımını ayrıntılı olarak analiz etme şansımız var), çünkü birçok çevrimiçi özet Traceview ve Systrace üzerinden geçmektedir, ancak bu ikisi AS3.0 sürüm yükseltmesinde terk edilmiştir ve yan taraf bizi yansıtır. Başkalarının çevirilerini analiz etmek yerine, resmi belgeleri sık sık okumalı ve Android'deki değişiklikleri ilk bakış açınızdan düşünmelisiniz. Son olarak, herkes birbirini cesaretlendiriyor. Mevcut Android pazarında rekabet giderek daha şiddetli hale geliyor. Rakip ürünlerle karşılaştırmada nasıl kazanabiliriz, ayrıntıları tamamlamak için adım adım ilerlememizi gerektiriyor.

    [Ekli] İlgili çerçeve ve bilgiler

    Bilgi koleksiyonu

    Takip edin + özel mesajı ücretsiz olarak "Android bilgileri" yanıtlayın!

    Önceki Android gelişmiş mimari materyallerini, kaynak kodunu, notlarını ve videolarını almak için gruba katılın. Gelişmiş kullanıcı arayüzü, performans optimizasyonu, mimar kursları, NDK, hibrit geliştirme (ReactNative + Weex) WeChat uygulamaları, Flutter'ın çok yönlü Android gelişmiş uygulama teknolojisi ve grupta sorunları birlikte tartışmak ve çözmek için teknik uzmanlar var.

    "Prenses Lanling" iki yıl ertelendi ama arkasında yürek burkan bir hikaye var
    önceki
    Peki "Hannah" nın drama versiyonunun son performansı nedir?
    Sonraki
    Model oyun kontrolü: gbf, Zaku modelini kara savaş tipi Zaku'ya değiştirdi
    Maimai: Sosyal ağ sitelerinin para kazanma ikilemini aşın
    Birçok terminal üreticisiyle olan belirsizlikte, Intelin oyun ekolojisi gizlidir
    Google neden Flutter'ı yerel bir atılım olarak kullanıyor?
    Model oyun kontrolü: HGBF Emerald Witch
    "Yenilmezler 4" kaybettiklerimizi kurtarmak değil, sahip olduğumuz her şey için
    Apple, bir günden kısa sürede 300.000 takipçiyle Instagram'a katıldı
    Bir Japon çizgi roman filmini zorla itin, ön taraf taze ve arka kısıtlı, buna gücü yetenler dikkatlice izlemeli
    Teknik bir görüşmeci olarak neden sizi geçtiniz (makalenin sonunda görüşme materyalleri alın)
    Model oynatma kontrolü: ayrıntıları ekle MG MSN-001A1
    Koç Wang, nasıl Gwent Ustası olunacağını öğretir
    Bu reklamın kahramanı insan değil!
    To Top