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.
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:
- 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
- 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")
- 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.
Çö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.