Merhaba Android Temel Başlıklar (Kısa kısa) v1 yazısının devamı niteliğindedir. Keyifli okumalar 🙂

5- Jack and Jill Build System

Aslında Android N’le beraber Jill de hayatımıza girmiş oluyor. 🙂

Jack and Jill’e geçmeden sistem nasıl çalışıyor önce onun üstünden geçelim.

Screen Shot 2016-04-17 at 23.27.25

Android build sisteminde apk oluşana kadar default olarak çalışan mekanizmaya önce göz atacak olursak, Asset’ler apk’da olduğu gibi tutuluyor. AndroidManifest ya da layoutlar gibi xml dosyaları Aapt(Android Asset Packaging Tool) ile compile ediliyor. Bu arada R.java dosyası da oluşuyor. Bu sayede resource’lara referanslar üzerinden erişebiliyoruz.

Java Compiler sayesinde, source dosyaları ve library’ler, class dosyalarına çevriliyor. Dex tool da class dosyalarını dalvik byte code’a çeviriyor. Sonrasında bu outputlarla artık apk oluşturulabilir.

Screen Shot 2016-04-17 at 23.35.18

Eğer proguard kullansaydık, nasıl değişecekti? Yine class dosyalarının oluşturulmasına kadar süreç aynı. Ama bu noktada proguard araya giriyor. Hem obfuscation işlemi hem de kullanılmayan sourceların oluşacak apk’ya katılmaması için bir optimizasyon yapılıyor. Bu işlem bizim verdiğimiz bir konfigürasyon dosyasına göre yapılıyor. İşlem sonunda bir de mapping dosyası oluşturuluyor. Böylece apk’yı decompile edersek source’lara tekrar ulaşabiliyoruz. Bu sefer optimized kodlar dex compiler’dan geçiriliyor. Hem uygulamanın size’ı düşmüş oluyor hem de daha güvenli tabi ki.

Screen Shot 2016-04-17 at 23.40.44

Jack and Jill Build Sistemi aslında experimental bir tool chain.

Jack üstteki imajda da görüldüğü gibi, java compiler yerine, java dosyalarını dex formatına çeviren bir toolchain. Jack’in, jack isimli kendi library formatı var. Repackinf, shrinking, obfuscation, multidex gibi birçok özelliği tek bir tool’la yapıyor. Verdiğimiz proguard talimatlarını da kullanıyor. Araya ayrı bir step girmiyor. Jill ise varolan .jar dosyalarının .class dosyalarının jack formatına çevrilmesini sağlıyor.

Jack’i Android Studio’da nasıl kullanırız dediğimizde, aşağıdaki resimdeki gibi gradle dosyasında tanımlayarak basitçe kullanabiliyoruz. Android Studio 1’den itibaren ve Buil Tool 21.1.1’den itibaren kullanılabilir durumda.

Screen Shot 2016-04-17 at 23.52.35

Eğer commandline’dan kullanmak istersek ise, aşağıdaki gibi kullanabiliriz.

Jack usage:

java -jar <SDK>/build-tools/21.1.1/jack.jar –help

Jill usage:

java -jar <SDK>/build-tools/21.1.1/jill.jar –help

Jack’de Java Annotationları destekleniyor. Bytecode processor olarak sadece Jill kullanılabiliyor. Başka bir JVM de kullanamıyoruz. Jack and Jill’de sadece Jill kullanabiliyoruz.

Hiç bir şey kullanılmamış, proguard, dexguard ve Jack and Jill kullanılmış uygulamarın build performanslarını karşılaştırdığımızda birbirine yakın sonuçlar elde ediyoruz. Sadece dexguard’ın optimize edilmiş buildi diğerlerine oranla biraz daha uzun sürüyor. Runtime performanslarda ise Jack diğerlerine oranla daha başarılı. Son olarak, dexguard, proguard ve Jack’in application size’ı küçültme oranları birbirine çok yakın olmakla beraber Dexguard az bi farkla daha başarılı.

Android N Preview’le beraber Java 8’in bazı özelliklerini de kullanabiliyoruz. Ancak Java 8’e geçtiğimizde Jack toolchain’i de kullanma ihtiyacımız oluşuyor. Android Studio’da kullanabilmek için aşağıdaki şekilde gradle dosyasında tanım yapmak gerekli. Yani aslında Android N’in official olmasıyla beraber Jack toolchain de experimental olmaktan çıkmış olacak. Heyecanla bekliyoruz. 🙂

android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Referanslar: