Android’de APK boyutunu küçültmek için R8 kullanma

Başvurunuzun bir sonraki milyar kullanıcıya ulaşıp ulaşmayacağına karar vermede uygulama büyüklüğü önemli bir rol oynar. Çoğu durumda, kullanıcılar cep telefonlarında daha az yer kaplar. Yani, APK büyüklüğünüz büyükse, kullanıcılarınızı kaybedersiniz. APK boyutunu mümkün olduğunca azaltmak önemli bir görev haline gelir.Küçük her zaman daha iyidir.

Bu blogda, uygulamamızdaki R8’i kullanarak APK boyutunu küçültmeyi öğreneceğiz. Bu blogda aşağıdaki konular ele alınacaktır:

  • R8 Küçültme Nedir?
  • Uygulamanızda R8 Küçültme nasıl etkinleştirilir?
  • Küçülenme nasıl çalışır?

Öyleyse başlayalım.

R8 Küçültme Nedir?

R8 küçültme, uygulamamızın kod miktarını düşürdüğümüz bir işlemdir ve bunu yaparak APK boyutu otomatik olarak küçülür. Bu nedenle, küçültülmüş APK boyutlu uygulamaların insanların telefonunda tutulması daha olasıdır. Tek yapmamız gereken Android uygulamamızdaki metin dosyalarını veya metni (örneğin kodu) azaltmak.

APK boyutunu küçültmek için üç farklı tekniğimiz var:

  1. Ağaç Sarsıntısı: Ağaç Sarsıntısı, ulaşılamaz kodun Android projemizden kaldırılması işlemidir. Ulaşılamaz koddan kurtulmak için bazı statik analizler yapar ve yetersiz nesneyi kaldırır.
  2. Optimizasyon: Bu, kodu kodunu optimize etmek için kullanılır. Ölü kod kaldırma, kullanılmayan argüman kaldırma, seçici satır içi, sınıf birleştirme vb.
  3. Tanımlayıcı Yeniden Adlandırma: Bu süreçte, sınıf adını ve diğer değişken adlarını gizleriz. Örneğin, sınıfın adı “MyAwesomeClass” ise, “abc” ya da daha küçük boyutta başka bir şeye gizlenecektir.

Fakat birçoğunuz, eğer bir başvuruda bulunursam, neden kullanmayacaksam bazı ekstra kod satırları ekleyeceğimi düşünüyorsunuz? Sonuç olarak, eğer bu istenmeyen kod satırlarını eklemezsem, R8 uygulama boyutunu nasıl küçültür? Peki, bu R8 küçülmesini kullanmanın arkasındaki sebep nedir?

Cevap basit:

  • Üçüncü taraf kütüphanesi: Her uygulama bir tür üçüncü taraf kütüphanesi gerektirir. Ancak başvurunuzda, o üçüncü taraf kütüphanesinin küçük bir bölümünü kullanıyor olabilirsiniz ve parçanın geri kalanı sizin için uygun değildir. Peki neden bu kod satırlarını saklıyorsunuz? Herhangi bir daralma olmadan, tüm kütüphane kodları uygulamanızda saklanır. Uygulamanızı Kotlin’e yazsanız bile, o zaman Kotlin Standard Library’yi eklemeniz gerekir ve bu da sırayla APK boyutunu artırır.
  • Kod optimizasyonu: Uygulamanızda istenmeyen kod satırları olmasa bile, bazı optimizasyon tekniklerini kullanarak sizin tarafınızdan yazılan kodu optimize edebilirsiniz.

Uygulamanızda R8 Küçültme nasıl etkinleştirilir?

Uygulamanızda küçülen R8 etkinleştirmek için set minifyEnabled için gerçek uygulamanızın ana yılında build.gradle dosyası.

android {
    ...
    buildTypes {
        release {
            minifyEnabled false
        }
    }
}

Tek bir Aktivite uygulaması yaparak ve ardından R8 küçültme kullanarak ve ardından R8 küçültmeyi kullanmadan önce ve sonra bazı üçüncü taraf kitaplıkları dahil ederek APK boyutunu kontrol etmeye çalışarak APK boyutunu bulmaya çalışın. Ama bu küçülme işe yarıyor mu? Bulalım.

Küçülenme nasıl çalışır?

APK boyut küçültme için kullanılan algoritmalar erişilemeyen kodu izler ve bu kodları APK’den kaldırır. Bu giriş noktalarının yardımı ile yapılır. Böylece, R8 bu giriş noktasıyla başlar ve erişilebilen kodların tümüne gider ve sonunda erişilemez kodu kaldırır. Bu giriş noktalarını tanımlamak için, korunma kuralları adı verilen bir şey var. Aynı bir örnek verelim:

class com.mindorks.JavaHelloWorld {
    //unreachable code
    private void iAmUnused() {
        System.out.println("I am of no use :( ");
    }

    //reachable code
    private static void reachableExample() {
        System.out.println("Hello, MindOrks :) ");
    }

    //main function
    public static void main(String[] args) {
        reachableExample();
    }
}


//This is the entry point
-keep class com.mindorks.JavaHelloWorld {
    public static void main(java.lang.String[]);
}

Yukarıdaki kodda, R8 daralması başladığında, R8 giriş noktasından izlemeye başlayacaktır, yani ana fonksiyon çağrılacak ve ana fonksiyondan , reachableExample () metodu çağrılacak ve son olarak “Merhaba, MindOrks” yazdıktan sonra 🙂 “izleme durdurulacak. Böylece, iAmUnused () yöntemine erişilemiyor ve kaldırılacak. Ayrıca, aynı zamanda, rechableExample () yönteminin adı a () veya b () gibi daha kısa bir şeye indirgenecektir . Ve son olarak, R8 , ana işlevdeki reachableExample () kodunun satırını alabilir . Böylece, son kod şöyle olacaktır:

class com.mindorks.JavaHelloWorld {
    
    //main function
    public static void main(String[] args) {
        System.out.println("Hello, MindOrks :) ");
    }
}


//This is the entry point
-keep class com.mindorks.JavaHelloWorld {
    public static void main(java.lang.String[]);
}

Benzer şekilde, Android’de Etkinlikler, Hizmetler, İçerik Sağlayıcılar, Yayın alıcıları gibi çeşitli giriş noktalarına sahip olabiliriz ve bu giriş noktalarını ele almak için aapt2 aracı kullanılır. Örneğin, bildirim dosyamızda MainActivity veya başka bir etkinliği giriş noktamız olarak tanımlıyoruz.

Aapt2 araçları tarafından sağlanan bu giriş noktalarının yanı sıra, Android Platformu için gereken birkaç şey var ve bunlar yapılandırma dosyasında Android Studio tarafından sağlanıyor. Uygulamanızın ana build.gradle dosyasına aşağıdaki satırı ekleyin :

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')

Ancak, bir sorun var, kodunuz bazı yansıma kodları içerdiğinde, kod izleyerek R8 tarafından tanınmıyor. Bu nedenle, bu kodu da kaldırır ve yapmamalı. Örneğin,

class Company(val name: String)

fun printJson() {
    val myGson: Gson()
    val compnay = Company("MindOrks")
    print(myGson.toJson(compnay))
}

//output: {}

Yukarıdaki kodda, çıktı boş bir JSON nesnesidir. Bunun nedeni dosyalanmış “ad” yazıldığından ancak asla okunmamasından kaynaklanmaktadır. Burada Gson, yansıma tekniklerini kullanır, bu nedenle R8 bu alanın gerçekte okunduğu ve kodu kaldırdığını görmez. Bu nedenle, bundan kaçınmak için R8’e “isim” adlı değeri saklamasını söyleyecek bazı saklama kurallarına sahip olmanız ve silmeyin. Genel olarak, tüm bu saklama kurallarını “proguard-rules.pro” adlı bir dosyaya koyar ve uygulamanızın ana build.gradle dosyasına aşağıdaki satırları ekleriz :

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 
        'proguard-rules.pro'

Comments

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

GIPHY App Key not set. Please check settings

Yükleniyor…

0

Ne düşünüyorsun?

Rubik küpleri 1 dk. kısa sürede çözen algoritma geliştirildi. | Deepcubea Algoritması

Memory Heap Dumps verileri nasıl kullanılır?