Optimizasyonları kademeli olarak kullanmaya başlayın

R8, performansı ve boyutu iyileştirmek için varsayılan olarak birçok optimizasyon yapar ancak bu optimizasyonlar uygulamanız için hemen işe yaramayabilir. Büyük bir uygulamada R8'i (veya tam modu) ilk kez etkinleştiriyorsanız optimizasyonları aşamalı olarak uygulamayı deneyin: Kod karartma özelliğini geçici olarak devre dışı bırakın ve R8'i uygulamanızdaki tüm kod yerine kod bölümlerinde tek seferde etkinleştirin. Bu artımlı yaklaşımı yerel geliştirme sırasında uygulamanızı öneririz ancak dahili kalite kontrolü testi sırasında veya hatta üretimde kademeli kullanım olarak da kullanabilirsiniz. Atacağınız adımlar, istediğiniz zaman çizelgesine ve yayın öncesi test kapsamınıza olan güveninize bağlıdır.

Optimizasyonları sınırlama

R8; kod kaldırma, kod yeniden yazma ve kaynak kaldırma gibi birçok türde optimizasyon yapar. Optimizasyon türlerinin bazı üst düzey açıklamalarını aşağıda bulabilirsiniz:

  • Kod daraltma (veya ağaç sallama): Referans verilmeyen kodları kaldırır.
  • Kod karartma (veya tanımlayıcı küçültme): sınıf ve yöntemlerin adlarını kısaltır
  • Optimizasyon: Kodu yeniden yazar (ör. satır içi yerleştirme)

Hata olasılığını azaltmak için bu optimizasyonlardan yalnızca bazılarını etkinleştirerek başlayabilirsiniz.

Yalnızca ağaç sallamayı etkinleştir

Ağ ayıklama olarak da bilinen kod daraltma, referans verilmeyen kodları kaldırır. En basit yöntem olduğu için yalnızca ağaç sallamayla başlamanızı öneririz.

Yalnızca ağaç sallamayı etkinleştirmek için diğer optimizasyon türlerini devre dışı bırakmak üzere proguard-rules.pro dosyanıza aşağıdakileri ekleyin. Karıştırmayı devre dışı bırakmak, yığın izlemelerinin çok daha kolay okunmasını sağladığı için önemlidir.

-dontobfuscate // Use temporarily to turn off identifier minification
-dontoptimize // Use temporarily to turn off optimization

R8'in kodu optimize etme özelliğini büyük ölçüde sınırlandırdığı için bu yapılandırmayı nihai olarak göndermek istemezsiniz ancak düzeltilmesi gereken sorunları olan büyük bir kod tabanında R8'i ilk kez kullanırken mükemmel bir başlangıç noktasıdır.

Uyumluluk modunu kullanma

R8 varsayılan olarak tam modda çalışır. Tam mod, önemli ölçüde daha iyi performans ve boyut tasarrufu sağlar ancak ilk kez küçültmeyi etkinleştirirken geçici olarak devre dışı bırakıp bunun yerine uyumlu modu kullanabilirsiniz.

Uyumluluk modunu kullanmak için gradle.properties dosyanızda aşağıdaki ayarı kullanın:

android.enableR8.fullMode = false // Use temporarily to disable full mode

Optimizasyonların geri kalanını etkinleştirme

Ağ oluşturma işleminin uygulamanız için işe yaradığını onayladıktan sonra karartma, optimizasyon ve R8 tam modunu yeniden etkinleştirmek için önceki ayarları kaldırabilirsiniz. Kod karartma işleminin hata ayıklamayı daha zor hale getirebileceğini unutmayın. Bu nedenle, önce ağaç sallama sorunlarını ele almanızı öneririz.

Yığın izlemelerin kodunu gösterme hakkında daha fazla bilgi için Orijinal yığın izlemeyi kurtarma başlıklı makaleyi inceleyin.

Optimizasyon kapsamını sınırlama

Tamamen optimize edilmiş bir derleme, her kitaplık ve paketteki tüm kodu optimize eder. Bu nedenle, R8'i ilk kez açtığınızda sorunlarla karşılaşmak yaygındır. Uygulamanın bir bölümünde optimizasyonla ilgili bir sorun bulursanız R8'i tamamen kapatmayın. Aksi takdirde, diğer tüm yerlerdeki avantajlardan yararlanamazsınız. Bunun yerine, R8'i yalnızca uygulamanızın soruna neden olan bölümlerinde geçici olarak devre dışı bırakın.

Paket genelindeki saklama kurallarını kullanma

Uygulamanızın bazı bölümlerinde R8'i geçici olarak devre dışı bırakmak için paket genelindeki tutma kurallarını kullanmanızı öneririz. Bu optimizasyon sorunlarını daha sonra düzeltmek için her zaman geri dönmeniz gerekir. Bu genellikle sorunlu alanlarda geçici olarak uygulanan bir çözümdür.

Örneğin, uygulamanızın bir kısmı Gson'u yoğun şekilde kullanıyorsa ve optimizasyonla ilgili sorunlara neden oluyorsa ideal çözüm, daha fazla hedefli tutma kuralı eklemek veya codegen çözümüne geçmek olacaktır. Ancak uygulamanın geri kalanını optimize etmenin önünü açmak için Gson türlerinizi tanımlayan kodu özel bir alt pakete yerleştirebilir ve proguard-rules.pro dosyanıza aşağıdaki gibi bir kural ekleyebilirsiniz:

-keep class com.myapp.json.** { *; }

Kullandığınız bir kitaplıkta dahili bileşenlere yansıtma varsa kitaplığın tamamı için benzer şekilde bir saklama kuralı ekleyebilirsiniz. Saklanacak uygun paketi bulmak için kitaplığın kodunu veya JAR/AAR dosyasını incelemeniz gerekir. Bu işlemin uzun süre boyunca sürdürülmesi önerilmez ancak uygulamanın geri kalanının optimizasyonunun engelini kaldırabilir:

-keep class com.somelibrary.** { *; }

Paket genelindeki saklama kurallarını kaldırma

Uygulamanız paket genelindeki tutma kurallarıyla doğru şekilde çalışmaya başladıktan sonra geri dönüp hedefli tutma kuralları eklemeniz veya tutma kuralını zorunlu kılan yansıma kullanımını ya da kitaplığı kaldırmanız gerekir.

Örneğin, yalnızca alakalı sınıfları tutmak için AndroidX'te belirli bir sınıfı genişleten tüm kuralların tutulması oldukça yaygındır. Yansıtma, genellikle yalnızca belirli soyut sınıfları genişleten, belirli arayüzleri uygulayan veya belirli bir çalışma zamanı ek açıklamasına sahip sınıflara sahip sınıfları veya yöntemleri hedeflemelidir. Bunların her biri, nihai ve tamamen optimize edilmiş uygulamanızda paket genelinde tutma kurallarına ihtiyaç duymamak için tutma kurallarını tanımlamanın desteklenen yollarıdır.