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ş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:
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 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".
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ızreportFullyDrawn
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.
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.
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ı:
İ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.
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
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.