Uygulama Modülerleştirmesinden Sonra Referans Alınan Yöntem Sayısı Artırıldı


16

AS: 3.5.3; Android Gradle Eklentisi: 3.5.0; Kepçe: 5.6.2;

'Uygulama' modülünü birkaç küçük modüle böldükten sonra uygulamamızda başvurulan yöntem sayısında ciddi bir artış gözlemledik. Ancak garip olan şey, her bir sınıf tarafından başvurulan yöntemlerin eklenmesinin Android Apk Analyzer Tool'da belirtilen toplamdan daha az olmasıdır.

Test amacıyla, WebActivity.class dosyasını 'app' modülünden 'adapters' modülüne taşıdım ve başvurulan yöntem sayısı 181 yöntemle artırıldı.

Özetlemek:

app / WebActivity = 63546 Gerçek referanslı yöntemler ancak 65394 yöntemleri gösteriliyor . adaptor / WebActivity = 63543 Gerçek referans alınan yöntemler, ancak 65575 yöntem gösteriliyor .

Biz var ekleme / bölme 4 yeni modüllerin sonra neredeyse 10k arttı 'başvurulan yöntem sayımı' gözlemledi.

Kesin mesele nedir?

Uygulama modülerizasyonu başvurulan yöntem sayısını nasıl bu kadar yüksek bir şekilde artırabilir?

WebActivity'nin yalnızca iki farklı APK'den aldığım ekran görüntüleri, 'app' modülünden 'adaptör' modülüne taşındı ve 181 referanslı yöntem artırıldı:

'App' modülünde WebActivity resim açıklamasını buraya girin

WebActivity'yi 'adaptör' modülüne taşıdı resim açıklamasını buraya girin

Ekran görüntülerinde, neden her sınıf tarafından başvurulan yöntemlerin eklenmesi (kırmızı renkle işaretlenmiştir) Apk Analyzer'da verilen toplama eşit değil?


Bir sorun oluşturdum, buradan izleyebilirsiniz issuetracker.google.com/issues/146957168
Rohit Surwase

Yanıtlar:


9

Kod performansını ve ayar parametrelerini uzun zamandır okuyorum. Aslında, Android programları odak noktalarımızdan biri.

Önce bir çözüme ulaşmamıza yardımcı olan temel veya en önemli kavramları tanıtalım.

As Android Geliştirici ifade etti

modül bağımsız olarak oluşturulabilir, test edilebilir ve hata ayıklanabilir

Bu nedenle, Modüllerin kendi Gradle & Bağımlılıkları vardır ve bunu projede keşfedebilirsiniz Hierarchy Viewer.

Nitekim, Modülerleştirme Bakım konusuna önem vermektedir . Performans Önemlidir aksine Modülerleştirmenin bu önemli etkisi vardır:

  • Kalıtım Derinliğini Artırın

İşte bunu netleştirmek için çizdiğim bir diyagram. Gördüğünüz gibi, ayrık modül kullanırken, Yöntem A'yı çağırmak 2N micro secsiçin N micro secsayrık modül olmadan karşılaştırılır .

resim açıklamasını buraya girin

Bu soru akla gelen Referanslı Yöntemler miras Derinliği ile ilgili ne sayar?

Cevap: Modülerleştirme kullanımı Referanslı Yöntemler'i artırmasına rağmen, aslında uygulama performansını etkilemez ve olası ana sorun, çoğu durumda cahil olan kalıtım derinliğidir .

Modülerleştirmede artan Referans Metodlarının her Modül Derecesi ve Bağımlılığına bağlı olduğunu vurguluyorum.

Uygulama modülerizasyonu başvurulan yöntem sayısını nasıl bu kadar yüksek bir şekilde artırabilir?

Etki APK analizörünün önemli olduğu koşullar

Ayrıca, küçültme ve kod küçültmenin her birinin, kaynak kod derlendikten sonra bir DEX dosyasının içeriğini de önemli ölçüde değiştirebileceğini unutmayın.

Yukarıdaki resmi açıklamaya ek olarak, etkisi APK analizörünün olduğu başka bir koşul eklemek istiyorum:

geliştirici modülerleştirme konusunda ne kadar deneyimlidir?

modülerleştirme, mimarinin (geliştirici) nerede mutfak ve nerede dinlenme odası ve nerede WC olması gerektiğini tanımladığı bir ev gibidir . Mimari WC & Kitchen'ı birleştirmeye karar verirse ne olur? Evet bu bir felaket.

Bu, geliştirici çok deneyimli değilse modülerleştirme sırasında olabilir.


Ek bilgilere ek olarak OP sorularına cevap verme

Burada yorumlarda sorulan sorulara cevap veriyorum

Neden ayrı Gradle başvurulan yönteme eklenir? Ve ayrı bağımlılık için, nihai sonuç tek APK ise, o zaman 'app' ve özellik modülünde yinelenen bağımlılıkları başvurulan yöntem sayısına ekleyeceğini düşünmüyorum.

Modüller inşa edilebildiğinden, test edilebildiğinden ve hata ayıklanabildiğinden, kendi Gradle & Bağımlılıklarına sahip OLMALIDIR.

Çok modüllü projeye uyulurken, derleyici aşağıdakileri .dexiçeren çeşitli dosyalar oluşturur :

  • .dextümleşik bağımlılıklar için bir dosya
  • modüller .dexs

bağımlılıklar .dexdosya tüm modüllerin aşamaları bir entegre

Bir modül sınıfının nihai Referanslanan Mottod Sayısını nasıl etkilediğine bakalım ?!

orada 2 APK Başvurulan Yöntemler sayımlarda aynı sonucu ancak farkla s.

Şekil 1 şekil 2

Her ikisi de 1.7kçok yüksek olan Referanslı Yöntemler Sayısında farklılığa sahip boş aktivitelerdir ve işlevselliğine bağlıdır. Temel fark Modülünün Gradle'sındadır .

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}

Başka bir yapılandırılmış

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.2.0-alpha01'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
}

Her ne kadar sadece boş aktiviteler olsa da Gradle'daki minimal bir fark 1.7kReferanslanan Yöntem Sayımlarında farklılığa neden oldu .

Ve App Gradle

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation project(path: ':module')
}

büyük endişe neden bireysel olarak başvurulan yöntem sayısının eklenmesinin Apk Analyzer'da başvurulan toplam yöntem sayısından farklı olması?

Bu sadece IDE filtresi başka bir şey değil. Elbette, yalnızca bir .dexdosya seçerseniz Referans Yöntem Sayısı her satırın TOPLA değerine eşittir Referanslanan Yöntem Sayıları, ancak .dexdosyaları çoklu seçerseniz , Analizör tarafından tercih edilen Referanslardaki eşitlik nedeniyle TOPLA ve gerçek Sayı arasındaki farkı göreceksiniz filtreleyin.

ekran görüntülerinizde birden çok .dexdosya seçtiniz ve ardından Analizör eşitliği filtrelendi.

projemizde merkezi versiyonlar kullanıyoruz. Farklı versiyon şansı yok. Öyleyse, özellik modüllerinde aynı / kesin bağımlılıklar ve sürümleri olsa bile, başvurulan yöntem sayısını artıracağını düşünüyor musunuz?

Teorik olarak gereken DEĞİL Başvurulan yöntem sayımlarını arttırmaktadır. ANCAK , açıkladığım gibi, Geliştirici Deneyimi nihai sonucu büyük ölçüde etkiler.

Team Analyzer , yayınlanmadan önce performans sorunlarını kontrol etmeli ve çözmelidir.

  • koruma kuralları
  • küçültülmüş ve küçültülmüş kaynaklar
  • AndroidManifest.xml
  • sınıf ayarları

Şimdi Geliştirici Deneyimi ve kod bakımının nihai sonucu nasıl etkilediğini açıklığa kavuşturmak istiyorum . APK'nız Merkezi Bağımlılıklar kullanıyorsa EVEN

Figür 3

Yukarıdaki örnekte, i'v artış 5.1kSayısı Başvurulan Yöntemler BİLE ben vardı Merkezi bağımlılıklar !!!!!

Nasıl mümkün olabilir ?

Cevap: ben sadece proje dizinine işe yaramaz ve gizli bir .jardosya ekledi libs. gördüğünüz kadar kolay son sonucu etkiledim.

Gördüğünüz gibi Geliştirici Deneyimi nihai result.as bir sonuç etkiler, Pratik o başvurulan yöntemler sayar rağmen artırılması mümkündür Teorik Should DEĞİL .

Paralel derlemeyi devre dışı bırakarak yalnızca 'app' modülünü derlediğimde referans alınan yöntem sayımında neden bir fark yok? Sadece 'app' modülünün bağımlılıkları kullanılacak gibi azalmış olmalı, değil mi?

derlemenin başvurulan yöntemlerle hiçbir ilişkisi yoktur counts.it, geliştiricinin uymak istediği şeyleri karşılar.


Sonuç

Konunun etrafındaki tüm olasılıkları ele aldım. Gerçekten de, farklı durumlardan ortaya çıkabilir ve bu kılavuzu kullanarak bir geliştirici sorunu çözebilir.

  • Umarım Referanslanan Yöntemlerin neden arttığını ve bazı durumlarda neden büyük ölçüde artabileceğini bulmuşsunuzdur.
  • Modüllerin Gradle & Bağımlılıkları ve modülerleştirme modülleri vardır. bu nedenle, bu Yöntem Referansları.
  • Modülerleştirme aslında uygulama performansını cahil kılar, ancak uygulamanızın Bakımını daha iyi hale getirir.
  • Modülerleştirmede geliştirici deneyimi de nihai sonucu büyük ölçüde etkiler.

ÖNEMLİ NOT: ifadelerin neredeyse tamamı benim araştırma ve araştırmalarımdır. aslında, hatalar ve hatalar olabilir ve gelecekte daha fazla bilgi eklemek için güncellenecektir.



Teşekkürler Mr.AF, "Bu soru aklıma gelen Referanslı Yöntemler miras Derinliği ile ilgili ne sayar?" Diye cevap vermeyi umuyordum, ama cevap vermediniz. Lütfen neden kalıtım derinliğinin artan referans sayıldığını açıklayabilir misiniz? Bizim durumumuzda olduğu gibi, fazladan bir katman eklemedik, sadece 'uygulama' modülünü ayırdık. Bir özellik modülünün 'app' modülü aracılığıyla başka bir özellik modülüne erişmesi durumunda başvurulan yöntem sayısında artış olasılığı vardır, nedeni bu mu?
Rohit Surwase

@RohitSurwase yanıtı ifadenin geri kalan kısmıdır. Kalıtımın derinliği Yöntem Referanslarını, bunu modülerleştirmeyi ve modülerleştirmeyi çünkü Kalıtım derinliğini arttırmaz.
Mr.AF

@RohitSurwase, başka bir modüldeki başka bir özelliğe erişen bir özellik aslında başvurulan yöntemleri önemli ölçüde artırmaz. atıfta bulunulan yöntem sayısındaki artışın ana nedeni, her bir modülün ihtiyacı olan Gradle & Bağımlılıklarıdır.
Mr.AF

@RohitSurwase modül-modül ilişkisi hakkında iyi ipuçlarına dikkat çekiyor. Aslında, 2 modülün çok fazla ilişkisi ve başvurulan yöntemi varsa, daha iyi performans için birleştirilmeleri gerekir. aslında modül terim ve kavram olarak bağımsız olması gerekir.
Mr.AF

1
@RohitSurwase i saied, kullanılmayan kavanoz sizin durumunuz olmayabilir. Yani demek istediğim bir şey geliştirici deneyimi ve bu mümkün, farklı kaynaklardan ortaya çıkabilir. ve aramak için gereken tüm kaynakları listeledim
Mr.AF

2

Çözüm denenmemiş olsa da, kesinlikle ya da büyük olasılıkla işe yarayacak olsa da, kendi sorumu çözümüm aklımda tıkladı. :) Mr.AF tarafından verilen cevap nihai bir çözüme ulaşmak için çok faydalı oldu. Neden? ancak bundan nasıl kaçınılacağına veya bunun nasıl geliştirileceğine değil

Orijinal / gerçek başvurulan yöntem sayısını geri almanın bir yolu -

Uygulamayı nasıl modülerleştirdiğimize değil, bağımlılıkları nasıl eklediğimize bağlı. Eğer ' uygulama ' kullanarak bir bağımlılık eklersek, o bağımlılık modüle özel kalır ve başka hiçbir modül bunu kullanamaz. Ve aynı bağımlılığı ' api ' (kullanımdan kaldırılmış 'derlemeye') kullanarak eklersek, o zaman herkese açık hale gelir ve diğer bağımlı modüller bunu kullanabilir. Çok modüllü bir projede her modüle bağımlılık eklemek için 'uygulama' kullandığımız için, her modül bağımsız olarak gerekli tüm bağımlılıklara sahiptir, bu nedenle ayrı ayrı derlenebilir. Bu, yalnızca değiştirilmiş modüller derlenebildiğinden yapım / derleme süresinin azalmasına neden olur. Ancak, 'uygulama' kullanımı başvurulan yöntem sayısını artırır çünkü çok sayıda yinelenen başvurulan yöntem var.

Bu nedenle, derleme zamanı endişeniz değilse, ancak başvurulan yöntem sayısı ise, tüm modüllerin bağımlılık ağacını çizebilir ve temel modülde 'api' kullanarak yinelenen bağımlılık eklemekten kaçınabilirsiniz. Bu şekilde üst modül bile temel modül tarafından eklenen bağımlılıkları kullanabilir ve bu da kopyaları önler. Unutmayın, bu yapım süresini artıracaktır.

Hata ayıklama ve sürüm oluşturma bağımlılıklarını ayırt edebilirsek her ikisini de başarabiliriz . Hata ayıklama derlemesi için 'application' kullanarak tüm bağımlılıkları ve 'api' kullanarak yalnızca derleme derlemesi için gerekli ve optimize edilmiş bağımlılıkları ekleyin . Bu şekilde hata ayıklama derlemesi daha hızlı olacak ve sürüm derlemesi daha yavaş olacaktır.

Not: Hata ayıklama ve sürüm oluşturma için ayrı bağımlılıkların nasıl sağlanacağını anladıktan sonra bu yanıtı güncelleyeceğim.


Ben sevdim. iyi malzemeler.
Mr.AF

0

'Com' paketinizdeki tüm farkı görüyorum. Tam sınıfların küçüldüğünü genişletebilir ve karşılaştırabilirsiniz. En son R8 ile oluşturursanız, bazı kodları varsayılan olarak kaldırabilir. Bazı sınıfları modül küçültücüye koyduğunuzda, genel sınıfların / yöntemlerin kaldırılıp kaldırılamayacağını veya başka bir modülde kullanımda kalması gerekip gerekmediğini bilmiyorum. resim açıklamasını buraya girin


Evet, 'com' dahil olmak üzere her paketi genişletip kontrol ettim. En büyük endişe, bireysel olarak başvurulan yöntem sayısının eklenmesinin neden Apk Analyzer'da başvurulan toplam yöntem sayısından farklı olmasıdır?
Rohit Surwase
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.