Uygulamanızı R8 ile küçültme

Daha küçük indirme boyutuna ve yükleme…

SimpleDateFormat, DateFormat java sınıfını genişleten bir java sınıfıdır. Yerelleştirme duyarlı bir biçimde normalleştirme, biçimlendirme ve ayrıştırma tarihi için kullanılır.
SimpleDateFormat, DateFormat java sınıfını genişleten bir java sınıfıdır. Yerelleştirme duyarlı bir biçimde normalleştirme, biçimlendirme ve ayrıştırma tarihi için kullanılır.

Daha küçük indirme boyutuna ve yükleme ayak izine sahip uygulamaların, özellikle gelişmekte olan pazarlarda kurulma ve yüklü kalma olasılığı çok daha yüksektir. R8 derleyicisi ile artık küçültme, karartma ve optimizasyon yoluyla bunu başarmak için daha kapsamlı bir desteğe sahipsiniz.

Bu gönderide, R8’de bulunan özelliklere, kod boyutunda beklediğiniz küçülmeye ilişkin bir genel bakış sunuyoruz ve bu özelliklerin R8’de nasıl etkinleştirileceğini gösteriyoruz.

R8 ile küçülen özellikler

R8, Android uygulamanızın boyutunu küçültmek için tasarlanmış dört özellik sunar:

  • Ağaç sallama : Ulaşılamayan kodları ve başlatılmamış türleri bulmak ve kaldırmak için statik kod analizini kullanma.
  • Optimizasyon : Ölü kodu kaldırarak, seçici satır içi, kullanılmayan argüman kaldırma ve sınıf birleştirme yoluyla kodu boyut için optimize etme.
  • Tanımlayıcı yeniden adlandırma aka şaşırtma : Kısa adlar kullanma ve paket ad alanını ezme.
  • Hata ayıklama bilgilerinin azaltılması : Hata ayıklama bilgilerinin kurallaştırılması ve satır numarası bilgilerinin sıkıştırılması.

R8’in küçülmesine neden ihtiyacımız var?

Bir uygulama yazdığınızda, tüm kodlar bir amaca hizmet etmeli ve uygulamadaki özellikleri uygulamalıdır. Ancak çoğu uygulama Jetpack , OkHttp , Guava , Gson ve Google Play Services gibi üçüncü taraf kitaplıkları kullanır ve Kotlin’de yazılan uygulamalar her zaman Kotlin standart kitaplığını içerir . Bu üçüncü taraf kitaplıklarından birini kullandığınızda, uygulamanızda genellikle her bir kitaplığın yalnızca çok küçük bir kısmı kullanılır. Küçültmeden, tüm kitaplık kodu uygulamanızda tutulur.

Ayrıntılı kod bazen okunabilirliği ve sürdürülebilirliği geliştirdiği için kodunuz olması gerekenden daha büyük olabilir: örneğin, başkalarının kodunuzu gözden geçirmesini ve anlamasını kolaylaştırmak için anlamlı değişken adları ve oluşturucu deseni kullanmaya çalışabilirsiniz. Ancak bu kalıplar, kod boyutu pahasına gelir – çoğu zaman, kendi yazdığınız kod, küçültmek için bolca fırsat sunar.

Uygulamanızın R8 küçültülmesini etkinleştirin

R8’in, uygulamanızın minifyEnableana build.gradledosyasında sürüm derlemeleri için uygulamanızı küçültmesini sağlamak için , aşağıdaki gibi:

android {
  buildTypes {
    release {
      minifyEnabled true
    }
  }
}

minifyEnableAdın sizi şaşırtmasına izin vermeyin – R8’in küçülmesini etkinleştirir.

R8, uygulamanızın boyutunu ne kadar küçültecek?

R8, uygulamanızın boyutunu önemli ölçüde azaltabilir. Örneğin, geçen yılki Google I/O uygulaması küçülmeden önce 150.220 yöntem ve 3 dex dosyasıyla 18.55 MB idi. Küçültüldükten sonra uygulama 45.831 yöntem ve 1 dex dosyası ile 6.45 MB’a düşürüldü. 

Temel küçültme algoritması

Basit olması için Java programlama dilindeki bağımsız bir program örneğini ele alalım:

-keep class com.example.JavaHelloWorld {
      public static void main(java.lang.String[]);
}

R8 küçültme algoritması aşağıdaki gibi çalışır:

  • İlk olarak, programın iyi bilinen giriş noktalarından erişilebilen tüm kodları izler – bu giriş noktaları R8 tutma kuralları tarafından tanımlanır . Örneğin, bu Java kodu örneğinde, R8 ana yöntemde başlayacaktır.
  • Örnekte, R8 ana yöntemden selamlama yöntemine kadar izler. Karşılama yöntemi çalışma zamanını çağırır, bu nedenle izleme burada durur.
  • İzleme tamamlandığında R8, kullanılmayan kodu kaldırmak için ağaç sallama adlı bir optimizasyon kullanır. Örnekte, ağaç sallama, kullanılmayan yöntemi kaldırır, çünkü R8’in izleme adımı, bu yönteme iyi bilinen herhangi bir giriş noktasından ulaşılamadığını algılar.
  • Ardından R8, tanımlayıcıları DEX dosyalarında daha az yer kaplayan daha kısa adlarla yeniden adlandırır. Örnekte, R8, karşılama yöntemini daha kısa adla yeniden adlandırabilir a:
class com.example.JavaHelloWorld {
  private static void a() {
    System.out.println("Hello, world!");
  }


  public static void main(String[] args) {
    a();
  }
}

Son olarak kod optimizasyonları uygulanır. Bunlardan biri, daha az koda yol açtığında satır içidir. Bu örnekte, yöntemin gövdesini adoğrudan main içine taşımak , kodu küçültecektir:

class com.example.JavaHelloWorld {

  public static void main(String[] args) {
    System.out.println("Hello, world!");
  }
}

Gördüğünüz gibi, ortaya çıkan kod orijinalinden çok daha küçük.

R8 küçültme için bir uygulama hazırlama

Bağımsız bir Java programı gibi, bir Android uygulamasının da bir dizi iyi bilinen giriş noktası vardır: etkinlikler, hizmetler, içerik sağlayıcılar ve yayın alıcıları. aapt2 aracı, Android Manifest dosyanıza dayalı saklama kuralları oluşturarak bu giriş noktalarını sizin için yönetir.

Bu iyi bilinen giriş noktalarına ek olarak, Android uygulamaları için gereken başka standart saklama kuralları da vardır. Bu kurallar, yapınızı yapılandırırken belirttiğiniz varsayılan bir yapılandırma dosyasında Android Gradle Eklentisi tarafından sağlanır:

android {
  buildTypes {
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
    }
  }
}

Uygulama kodunda yansıma

Yansıma, kodunuzu izlerken R8’in tanımadığı kod giriş noktalarıyla sonuçlanır. Yansımanın üçüncü şahıs kitaplıklarında da olabileceğini ve üçüncü şahıs kitaplıkları uygulamanızın etkin bir parçası olduğundan, uygulama geliştiricisi olarak siz, kendi kodunuzda olduğu kadar bu kitaplıklarda gerçekleştirilen yansıtmadan da etkin bir şekilde sorumlu olursunuz. Kitaplıklar kendi kuralları dahil edilmiş olarak gelebilir, ancak birçok kitaplığın Android ile veya küçültme düşünülerek yazılmadığını unutmayın, bu nedenle ek yapılandırmaya ihtiyaç duyabilirler.

Bir alan adı verilen nameve mainbir örnek oluşturan ve bu örneği JSON’a seri hale getiren bir yönteme sahip bir Kotlin sınıfı örneğini alın:

class Person(val name: String)

fun printJson() {
   val gson = Gson()
   val person = Person("Søren Gjesse")
   println(gson.toJson(person))
}

Kodu küçülttükten sonra, programı çalıştırmak boş bir JSON nesnesi verir {}. Bunun nedeni, R8’in alan adını yalnızca yazıldığı gibi görmesi (Kişi yapıcısında gerçekleşir), ancak asla okumamasıdır, bu nedenle R8 onu kaldırır. Kişi, boş JSON nesnesine neden olan hiçbir alan olmadan biter. Ancak, saha edilir GSON serileştiriciye tarafından okunan, ama R8 bu alan okunduğunda o görmemesi için GSON, bunu yapmak için yansıma teknikleri kullanır.

Alanı korumak nameiçin proguard-rules.pro dosyanıza bir saklama kuralı ekleyin :

-keep class com.example.myapplication.Person {
    public java.lang.String name;
}

Bu kural, R8’e Person sınıfında name adlı alana dokunmamasını söyler. Bu yerindeyken, kodu çalıştırmak, beklenen JSON nesnesini verir {“name”:”Cem Yüksel”}.

Son olarak, projenizi kurarken proguard-rules.prodosyayı build.gradleyapılandırmanıza eklediğinizden emin olun :

android {
  buildTypes {
    release {
      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

One Comment

Yükleniyor…

0

Ne düşünüyorsun?

Android Studio’da Language Injection

Facebook Ray-Ban Stories akıllı güneş gözlükleri piyasada.