Alipay istemci mimarisi analizi: Çöp toplama işleminin Android istemci başlatma hızı optimizasyonu

1. Giriş

"Alipay İstemci Mimarisinin Analizi" serisi, Alipay'in müşterisinin mimari tasarımıyla başlayacak ve müşteriyi içinde dağıtacak " Konteynerli çerçeve tasarımı "," Ağ Optimizasyonu "," Performans başlangıç optimizasyonu "," Otomatik günlük toplama "," RPC bileşen tasarımı "," Mobil uygulama izleme, teşhis, konumlandırma "Ve herkesin Alipay'in istemci mimarisindeki yinelemesini ve optimizasyon sürecini daha iyi anlamasına yol açan diğer özel uygulamalar.

Bu bölüm, Alipay Android istemcisi başlatma hızının optimizasyonu altında "çöp toplama" nın belirli fikirlerini tanıtacaktır.

Uygulama başlatma süresi, mobil uygulamaların kullanıcı deneyiminin önemli bir parçasıdır. Sıradan mobil uygulamalarla karşılaştırıldığında, Alipay çok büyüktür ve kaçınılmaz olarak başlatma hızını etkileyecektir. Alipay'de bazı geleneksel optimizasyon yöntemleri tamamlanmıştır. Bu makale, başlangıç Alipay'in başlangıç hızını daha da optimize etmek için GC seviyesi.

2. arkaplan

C diliyle karşılaştırıldığında, Java dilinin bazı özellikleri vardır.Örneğin, geliştiricilerin bellek ayırma ve kurtarmayı düşünmelerine gerek yoktur.Ancak, işlem belleği yönetimi önemli bir bağlantıdır. Uzlaşmanın sonucu, Java dilinin tasarımcılarının nesneleri ayırmasıdır. Ve geri dönüşüm Java sanal makinesine yerleştirilir. Burada bir kavramı açıklığa kavuşturmayı umuyorum: GC'nin bir fiyatı vardır. Bu fiyat şunları içerir: Java programlarının yürütülmesini engellemek, CPU kaynaklarını kullanmak, ek bellek kullanmak, vb. Google mühendisleri GC'nin uygulamalar üzerindeki etkisinin farkındadır. Bu nedenle, GC günlüğü varsayılan olarak Logcat'e gönderilir.Logcat'te aşağıdaki GC günlüklerinin çıktısını sıklıkla görebiliriz:

GC_EXPLICIT: Dalivk, geliştiricilere GC'yi aktif olarak tetikleyen bir API sağlar. Okuyucular, bu API'nin kullanımını deneyimlemek için Google Haritalar'ın tasarımına başvurabilir

GC_FOR _ALLOCK: Nesne tahsisi başarısız olduğunda tetiklenen GC'dir.Bu GC, GC sona erene kadar uygulamanın tüm Java iş parçacıklarını askıya alır.

GC_CONCURRENT: Java sanal makinesi tarafından yığının mevcut durumuna göre tetiklenen GC'dir.Bu GC Dalvik'te ayrı bir GC iş parçacığında çalışır ve zamanın bir bölümünde Java uygulamasının çalışmasını etkilemez.

Alipay başlangıcı tipik bir kritik yol senaryosudur. Mümkün olduğunca az GC_ CONCURRENT görmek istiyoruz (GC_ FOR_ ALLOCK da mümkünse minimuma indirilmelidir). Bununla birlikte, Logcat aracılığıyla çok kötü GC davranışını göreceğiz pek çok GC_ FOR_ ALLOCK ve şok edici Java dizisi WAIT_ FOR_ CONCURRENT_ GC tarafından engellenir. Aşağıdaki şekilde gösterildiği gibi, bu GC'ler tarafından harcanan zamanı basitçe sayarak, GC'nin uygulama başlatma süresini ciddi şekilde etkilediği sonucuna varabiliriz.

Ücretsiz üst düzey Android verileri artı grubu edinin: 185873940

3. Tasarım fikirleri

Alipay bir Android sistemi uygulamasıdır Dalvik'in GC davranışını etkileyerek başlangıç süresini nasıl kısaltabilir? Bu sorun iki adıma ayrılabilir:

3.1 Alipay kendi Dalvik davranışını etkileyebilir mi?

3.2 Dalvik nasıl iyileştirilir ve başlangıç süresi nasıl kısaltılır

İlk sorunun cevabı evet.Android sisteminin tasarım fikri, her Android uygulamasının bağımsız bir Dalvik örneğine sahip olmasıdır. Uygulama başlatıldıktan sonra, kendi işlem alanındaki kod ve veriler değiştirilebilir, böylece Alipay, Dalvik'i bellekte değiştirebilir Kütüphane dosyası libdvm.so Dalvik'in davranışını etkiler.

İkinci problemin zorluğu girdi-çıktı oranındadır: işlem uzayını değiştirecek kod ve veriler ikili yönelimlidir ve zorluk, kaynak kodunkinden çok daha fazladır Yani, biraz daha karmaşık olan Dalvik iyileştirme çalışması imkansızdır.

Yukarıdaki iki noktaya dayanarak, bir hipotez önerilmektedir: Başlangıçta GC bastırma, geliştirici aktif olarak GC bastırmayı durdurana veya OOM GC bastırmayı durdurana kadar yığının büyümesine izin verir. Bu, daha fazla bellek kullanan bir "zaman için alan" stratejisidir Başlatma süresinin kısaltılması karşılığında tüketim. Bu strateji iki temelde uygulanabilir: Birincisi, cihaz üreticisinin bellekteki Dalvik kitaplık dosyalarını şifrelememesi, diğeri ise cihaz üreticisinin Google'ın Dalvik kaynak kodunu değiştirmemiş olmasıdır (veya küçük bir miktar değişiklik). Beyaz liste yöntemi tüm cihazları kapsayabilir, ancak uygulama ve bakım maliyetleri çok yüksektir.

4. GC bastırmanın gerçekleştirilmesi

GC bastırmanın öncülü, Dalvik'in tanıdık olması ve GC'nin davranışını nasıl değiştireceğini bilmesidir.Çözüm kabaca aşağıdaki gibidir: İlk olarak, atlama dalını değiştirmek gibi kaynak düzeyinde GC'yi bastırmak için bir modifikasyon yöntemi bulun ve ikincisi, ikili kodda A dalı koşullu sıçramasını bulun "Yönerge parmak izi" ve dalı değiştirmek için kullanılan ikili kodun override_A olduğu varsayılır. Uygulama başladıktan sonra, libdvm.so dosyasını bellekte tarayın, değiştirilen konumu "talimat parmak izine" göre bulun ve ardından override_A ile üzerine yazın. Burada not edilmesi gerekenler şudur: , "Talimat parmak izi" tanımı, derleyici ve silah komut seti hakkında biraz bilgi gerektirir. GC bastırmanın gerçekleştirilmesi temel olarak aşağıdaki 4 bölümü gerçekleştirir:

(1) Yumuşak sınır algılamayı iptal edin

(2) GC iş parçacığının uyanmasını iptal edin

(3) GC rutin işlevini iptal edin

(4) OOM, GC bastırmanın gerçekleştirilmesini durdurur

4.1 Yazılım sınırı algılamayı iptal etme:

Softlimit tespitini iptal etmenin amacı, nesnelerin tahsisini maksimize etmektir.Aşağıdaki şekil, softlimit kontrolüne karşılık gelen arm komut parçasını gösterir. DvmHeapSourceAlloc fonksiyonunda bulunur. OXE057, "return NULL" dalına karşılık gelir. "Return NULL" dalını asla girmek istemiyorsak, Cmp komutunun sonucu değiştirilebilir Spesifik uygulamada, "0X42" yi "talimat parmak izi" olarak tanır ve bunu "cmp r0, r0" olarak değiştiririz, böylece softlimit kontrolü iptal edilebilir.

Ücretsiz üst düzey Android verileri artı grubu edinin: 185873940

4.2 GC iş parçacığı uyandırmayı iptal etme

GC iş parçacığı uyandırmayı iptal etmenin amacı, sık GC iş parçacığı uyandırmasının neden olduğu iş parçacığı titremesini önlemektir. Aşağıdaki şekil karşılık gelen C ++ kodu ve kol talimatı parçasıdır. Bu kod ayrıca dvmHeapSourceAlloc fonksiyonunda da bulunur. Spesifik uygulamada, pthreadcondsignal @ plt adresini elde etmek için libdvm.so'nun dynstr, dynsym, rel.plt ve plt alanlarını tarayacağız ve ardından atlama hedef adresini hesaplamak için dvmHeapSourceAlloc'daki tüm dal atlamalarını geçeceğiz.

Pthreadcondsignal @ plt ve mevcut şube hedef adresi yapılandırmasını bulursanız, sadece bu talimatı silin.

Ücretsiz üst düzey Android verileri artı grubu edinin: 185873940

4.3 GC rutin işlevini iptal etme

İptal GC rutin işlevi kanca teknolojisi ile gerçekleştirilir.GC gizlemesini doStartSuppressGC ve doStopSuppressGC olmak üzere iki yerel arabirime kapsülledik ve geliştiricilerin Java'da çağırması için uygun olan JNI arabirimine daha da kapsülledik. Genel uygulama yöntemi, geliştiricinin, Alipay'in belirli bir sahnede çok sayıda GC'yi tetikleyeceğini ve bu GC'nin kullanıcı deneyimini etkilediğini (yavaş yanıt süresi veya animasyon donması) ve ardından doStartSuppressGC ve doStopSuppressGC'yi bu sahneden önce ve sonra eklemesidir.

Alipay soğuk başlatma senaryosunu örnek olarak ele alırsak, Quinox konteynerinin attachBaseContext işlevine doStartSuppressGC'yi ve ana sayfa yüklemesinin sonuna doStopSuppressGC'yi ekliyoruz.

4.4 OOM stop GC bastırmanın gerçekleştirilmesi

Alipay'in başlatılması sırasında yalnızca GC'yi bastırmayı düşünürseniz, Alipay'in başlatılması OOM'u tetiklemek için yeterli olmadığından, GC bastırmayı durdurmak için OOM'nin gerçekleştirilmesini düşünmenize gerek yoktur. Ancak, GC bastırmanın daha fazla senaryoya uygulanabilecek temel bir modül haline geleceğini umuyoruz. Program doStopSuppressGC'yi çağırmadan önce OOM'yi tetiklerse, OOM oluşmadan önce GC bastırmayı durdurmanız gerekir. Dal atlama yönündeki önceki basit değişikliğin aksine, OOM oluşmadan önce yeni bir dal sıçraması enjekte edilmelidir.Bu yeni dalın kodu tarafımızdan uygulanmaktadır. Yeni dalın ana işlevi, doStopSuppressGC'yi çağırmak, ardından enjekte edilen yeni dalı kaldırmak ve son olarak OOM'u yürütmek için Dalvik'e geri dönmektir.

Ücretsiz üst düzey Android verileri artı grubu edinin: 185873940

Uygulama aynı zamanda geleneksel kanca teknolojisini kullanır. DvmCollectGarbageInternal kanca işlevinde:

Koşullar karşılanmadığında, GC'yi iptal etme amacına ulaşmak için doğrudan geri dönün;

Koşullar karşılandığında, kancayı iptal edin ve orijinal dvmCollectGarbageInternal'ı çalıştırın.

Açık kaynak ikili enjeksiyon çerçevesi, uygulamada kullanılır: https://github.com/crmulliner/adbi.

Hotspot işlevinde bu çerçeve tarafından sağlanan pre_hook ve post_hook'u kullanmanın performans ek yükünün çok büyük olduğu burada belirtilmelidir. Bu makaledeki tasarım, pre_hook'u yalnızca bir kez kullanacaktır, bu nedenle performans sorunu yoktur.

Bunu gördükten sonra okuyucular sorabilir, bu "talimat parmak izi" yöntemi güvenilir mi? Cevabım, gözden kaçan yargıların doğruluğu etkilemediği ve yanlış yargıların teorik olarak var olduğu, ancak olasılığın son derece küçük olduğu (yanlış yargı, yanlış koda "komut parmak izinin" konumuna atıfta bulunur). Bir yanlış yargı olsa bile, yine de son garanti katmanına sahibiz - altyapı grubundaki öğrenciler tarafından uygulanan afet tolerans mekanizması. Yanlış karar, programın anormal olmasına ve normal başlatmayı tamamlayamamasına neden olduğunda, Alipay'i yeniden başlatın ve sonraki başlangıçta doğrudan GC engellemesinden vazgeçin.

5. Etki

Ücretsiz üst düzey Android verileri artı grubu edinin: 185873940

Yukarıdaki şekildeki başlangıç zamanı verileri, dahili Android 4.x test cihazında elde edilir (hata ayıklama sürümünü belirtmek için bir etiket izni yoktur). Grafikten, Alipay'in istemci terminalinin başlama süresi% 15 ila% 30 kısaltıldı.

6. Özet

Bu bölüm sayesinde, Alipay'in "çöp toplama" mekanizması ve Android istemci başlatma performansının optimizasyonu altındaki belirli uygulamaları hakkında bir ön anlayışa sahibiz. Alan kısıtlamaları nedeniyle, birçok teknik noktayı tek tek geliştiremiyoruz. Ve almak için ilgili teknik temel dikkat + özel mesaj yanıtı "Android verileri" gerekir!

Grupta ileri teknoloji Android hakkında birçok ücretsiz bilgi videosu da var, dikkat etmeniz gerekiyor + özel mesaj yanıtı almak için "Android bilgileri"!

Android öğrenme zihin haritası:

Video bilgileri:

Android başlangıç performansı optimizasyonunun tasarım fikirleri ve belirli uygulamalarıyla ilgili olarak, geri bildirimlerinizi bekliyoruz ve birlikte tartışmak ve fikir alışverişinde bulunmaktan memnuniyet duyarız.

3D görüntüleme teknolojisi geliyor, fintech hangi değişiklikleri başlatacak?
önceki
Model oyun kontrolü: çöl avcısı, kamuflaj ağır topçu
Sonraki
190417 Yeterince eminim, güzelliğin tamamlanması, Taeyeon ruj testi renk resimli hitinin "Elle Korea" Nisan sayısına bağlı.
Model oyun kontrolü: RG panda renk eşleştirme GP01
"En insana benzeyen robotu" yakından hissedin, yetkili Sophia'nın önümüzdeki yıl seri üretileceğini söyledi.
MVP moduna dayalı "Android Mimarisi" Retrofit2 + RXjava paketi
"Her şey yolunda" Ming Yu, Mingzhe'yi bir ev satın alma konusunda iki kez düşünmeye ikna etti, Mingcheng fonları yatırıma yönlendirmek istedi ve buna karşı çıktı
Analog oyun kontrolü: SD sahne, Unicorn ve Neo Zeon arasındaki etkileşim
190417 Hayırseverlik etkinliklerinin çekimlerine katılan uzun zamandır görülemeyen Choi Soo-young yayınlandı
Android Framework Framework Serisinin DisplayManagerService'i (1)
007 dizisi "007 Goldfinger" filmindeki aktris Tanya Maret 77 yaşında öldü.
Model oyun kontrolü: sınırsız boyutsal özgürlük, en yakışıklı ve özgür mü?
190417 Deng Lun Lisesi eski fotoğrafları ortaya çıktı, yeşil, sevimli, güneşli ve yakışıklı
Çin'in en iyi pazarlama hizmeti platformu işe almaktır, cesaretiniz varsa gelin!
To Top