Android

Derlemenizi hızlandırın: Geçişsiz R dosyaları

Geçişsiz R dosyaları, AGP 4.2’deki tüm modüllerde kullanılabilir hale geldi. Geçişsiz R dosyaları, yapılarınızın aşamalı olarak daha hızlı ve AAB/APK’nizin daha küçük olmasını sağlar. Bu gönderi, uygulamanızı geçişli olmayan R dosyalarıyla nasıl uygulayacağınızı ve oluşturacağınızı açıklayacaktır.

Geçişsiz ne?

Matematikte, geçişsizlik geçişli ilişkiler olmayan ikili ilişkilerin bir özelliğidir. Bu, geçişli olmayan herhangi bir ilişkiyi veya hiçbir zaman geçişli olmayan bir ilişkiyi tanımlayan anti-geçişsizliğin daha güçlü özelliğini içerebilir.

https://en.wikipedia.org/wiki/Intransitivity

Bu matematik alıntı bize hiç yardımcı oluyor mu? Muhtemelen değil. Bunu deneyelim: Eğer A bağlıdır B ve B bağlıdır C, A hakkında bilmiyor C. Android dünyasında, geçişsiz R dosyaları:

Geçişli olmayan R sınıfları, her kitaplığın R sınıfının ad alanını etkinleştirir, böylece R sınıfı yalnızca kitaplığın kendisinde bildirilen kaynakları içerir ve kitaplığın bağımlılıklarından hiçbirini içermez, böylece o kitaplık için R sınıfının boyutunu azaltır.

Bu blog yazısı, R dosyasının nasıl çalıştığı ve ilgili geçmişle ilgili değil, arka planla ilgileniyorsanız tavsiye ederim bu blog yazısı burada.

Geçişsiz modüller

modül ise A bağlıdır B ve B bağlıdır C. Kaynaklara nasıl başvurabiliriz? Bakalım:

Modül A kendi kaynaklarına başvurabilir (normal gibi):

R.string.hello_world

Modül A Modüle başvurabilir B kaynaklar (tam nitelikli paket):

com.my.moduleB.R.string.hello_neighbour

Modül A Modül referans olamaz Ckaynakları.


Birden çok modüle sahip uygulamalar için daha hızlı derlemeler oluşturmak için Android Gradle eklentisiyle (>4.2) geçişsiz R sınıflarını kullanabilirsiniz. … Bu, daha güncel yapılara ve buna karşılık gelen derlemeden kaçınmanın faydalarına yol açar.

https://developer.android.com/studio/releases#refactor-nontransitive-rclasses

Geçişsiz R sınıflarının faydaları?

  • Dahil olmak üzere AAB/APK boyutunda azalma DEX alan referans sayısı
  • Değişiklikler yapıldığında daha az bağımlılık eklenebileceğinden artımlı oluşturma hızında azalma
  • Modülerlikte artış, bağımlılıklar daha belirgin hale gelir
  • Karmaşıklıkta azalma, kaynaklar geçişli bağımlılıklardan gelemez
  • Daha az kod dahil edildiğinden tam derleme süresinde azalma

Haydi Yapalım şunu!

ayarlarınızı düzenleyerek bu ayarı kendiniz açabilirsiniz. /gradle.properties dahil edilecek dosya:

android.nonTransitiveRClass=true

hakkında okumuş olabilirsiniz android.namespacedRClass geçmişte. Ağustos 2020’de unutmayın; android.namespacedRClass özellik olarak yeniden adlandırıldı android.nonTransitiveRClass. Burada gösterildiği gibi.

VEYA

Android Studio otomatik yeniden düzenleyicisini kullanabilirsiniz, bu, yukarıdaki ayarı açar ve bulduğu R referanslarını tam olarak nitelendirmeye çalışan modüllerinizde arama yapar.

Bu yeniden düzenleyicinin Android Studio Arctic Fox | 2020.3.1 “geçişli olmayan R dosyaları için otomatik yeniden düzenleme”. Burada gösterildiği gibi.

Android Studio > Refactor > Geçişsiz R Sınıflarına Geç…

Bu otomatik yeniden düzenleme bir gümüş kurşun değildir, bazı kaynak referanslarını yanlış alabilir, yani R sınıfından önce yanlış paket adını ekler veya hiç birini seçemez veya modülünüze bir tane ekler. bağlılığı yoktur. Deneyimlerime göre, bu sorunlar derleme sırasında yakalanır ve yeniden düzenleme aracının başlattığı işlemi tamamlamak için aşağıdaki üç çözüm adımından birini seçebilirsiniz:

Bu yapıldıktan sonra, projenizi oluşturmanız ve hataları düzeltmeniz gerekecektir. Hatalar birkaç biçimde gelebilir:

  1. Başka bir modülden bir kaynak kullanıyorsunuz.
    Düzeltmek: tam nitelikli paketi ekleyin veya R dosyasını içe aktarın veya (yalnızca Kotlin) bir takma ad kullanın.

    // Fully qualifed package
    val foo = com.my.moduleB.R.string.hello_neighbour
    // Import then use string.hello_neighbour
    import com.my.moduleB.R
    // Alias then use RB.string.hello_neighbour
    import com.my.moduleB.R as RB

  2. Başka bir modülden bir kaynak kullanıyorsunuz, ancak o modüle bağımlılık bildirmiyorsunuz.
    Düzeltmek: #1 olarak yapın, ancak bağımlılığı da gradle’a ekleyin.

    implementation project(":libraries:moduleB")

  3. Başka bir modülden bir kaynak kullanıyorsunuz, ancak o modüle bağımlılık bildirmiyorsunuz ve bir bağımlılık bildirmek istemiyorsunuz.
    Düzeltmek: Buradaki çözüm, referans oluştur ve aynı adı kullanın veya istediğiniz şeyin yeni bir kaynağını kopyalayın/oluşturun.
Uygulama başka bir “geçişli” modüldeyken modülünüzde bir referans oluşturun.

Çözüm

Hepsi bu kadar, benim için söylemesi oldukça kolay ama pratikte projenizin boyutuna bağlı olarak, önünüzde uzun saatler olabilir, kaynaklarınızın nereden geldiğini ve doğru olanın tam olarak ne olduğunu hata ayıklama/arama yapabilirsiniz. kullanılacak paket adı. Açtığınız tüm yeni projeler için şiddetle tavsiye ederim nonTransitiveRClass satırdaki serpinti ile uğraşmak zorunda kalmadan önce.

İlgili Makaleler

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Başa dön tuşu