Android Yapılandırma Unsurları ve Proje Yapısı

Yeni bir Android projesi oluşturduğunuzda karşınıza çıkan dosya ve klasör yapısını tanımak, bu yapıda her öğenin işlevini bilmek projeye daha hakim olmanızı sağlayacaktır. Bu yazıda Android Studio temelinde Android proje yapısının temellerini bulabilirsiniz.

Gradle nedir?

Gradle Android uygulaması geliştirme aşamalarını otomatize eden bir build sistemi olup test,debug ve release işlemlerini daha kolay hale getirmektedir.

Android için tercih edilmesinin sebebi de içinde xml, resim ve font dosyaları gibi Android projesinde gereken diğer bileşenleri barındıran paketlerin oluşturulabilmesidir.Yani Maven projelerinde sadece Java içerebilen .jar çıktıları kullanılabilirken Gradle’da içerisinde Java, resim, font ve xml içeren .aar çıktıları kullanılabilirsiniz.

Android Derleme Süreci

Derleme süreci, projenizi bir Android Uygulama Paketine (APK) dönüştüren birçok araç ve süreçten meydana gelir.Kodların compile edilmesinden apk dosyası oluşmasına kadar olan süreci Gradle ve Android Plugin yürütür.

Android Plugin Nedir?

Android derleme sistemi olarak Gradle’ı temel alır .Android Plugin ise Gradle’a Android uygulamalarını oluşturmaya özel çeşitli özellikler ekler.

Android Studio’yu güncellediğinizde, Android Plugin’i en son kullanılabilir sürüme otomatik olarak güncellemek için bir uyarı alabilirsiniz. Güncellemeyi kabul etmeyi seçebilir veya projenizin yapı gereksinimlerini temel alarak başka bir sürümü manuel olarak belirtebilirsiniz.

Android Plugin’i, Android Studio’daki File > Project Structure > Project menüsünden veya Project build.gradle dosyasından güncelleyebilirsiniz. Eklenti sürümü, Android Studio projesinde oluşturulan tüm modüller için geçerlidir.

Aşağıdaki örnek, derleme için Android eklentisini build.gradle dosyasından 3.0.1 sürümüne ayarlar:

Aşağıdaki tabloda birbiriyle uyumlu çalışan Android Plugin ve Gradle versiyonları belirtilmiştir. En iyi derleme performansını almak için her zaman en güncel Gradle ve Android Plugin versiyonu kullanılmalı.

Gradle nasıl güncellenir?

Gradle sürümünü Android Studio’daki File > Project Structure > Project menüsünden veya gradle-wrapper.properties dosyasındaki Gradle dağıtım referansını düzenleyerek değiştirebilirsiniz.

Aşağıdaki örnek, gradle-wrapper.properties dosyasında Gradle sürümünü 4.1 olarak ayarlar.

Derleme Süreci’ne Geri Dönelim

●Derleyiciler, kaynak kodunuzu Android cihazlarda çalışan bayt kodu ve derlenmiş kaynakları içeren DEX (Dalvik Executable) dosyalarına dönüştürür.

●APK Packager, DEX dosyalarını ve derlenmiş kaynakları tek bir APK’da birleştirir.

●Uygulamanızın bir Android cihazına yüklenmeden veya dağıtılmadan önce, APK’nın imzalanması gerekir.

●APK Paketleyici, APK’nızı debug yada release anahtarını kullanarak imzalar:

●Eğer uygulamanızın debug versiyonunu oluşturuyorsanız,Android Studio sizin için APK’nızı debug keystore ile imzalar.

●Şayet uygulamanızı dağıtıma çıkacaksanız,APK’nızı realese olarak derlemeniz ve release keystore ile imzalamanız gerekir.

●Paketleyici, APK’yı oluşturmadan hemen önce,uygulamanızın Android cihazlarda daha az ram harcaması için zipalign aracını kullanır ve uygulamanızı optimize eder.

●Tüm bu işlemlerin sonunda elinizde artık bir Debug Apk ya da Release Apk vardır.

Android Derleme Yapılandırmaları

Android projenizi oluşturup uygulama çıktısını alana kadar olan süreçte,projenizi oluşturan bazı temel yapılandırmalar bulunmakta. Bunları Android ekibi aşağıdaki şekilde sıralıyor :

  • Build Types
  • Product Flavors
  • Build Variants
  • Manifest Entries
  • Dependencies
  • Signing
  • Proguard
  • Multiple APK Support

Build Types

Build Types, Gradle uygulamasının uygulamanızı oluştururken ve paketlerken kullandığı belirli özellikleri tanımlar ve genellikle geliştirme sürecinizin farklı aşamaları için yapılandırılır.

Örneğin, debug türü hata ayıklama seçeneklerini etkinleştirir ve APK’yı debug keystrore ile imzalar.

Release türü ise daha önce de bahsettiğimiz gibi uygulamanızı küçültür, kodlarınızı çözümlenemez hale getirmek için şifreler ve APK’nızı release keystore’u ile imzalar.

Uygulamanızı oluşturmak için en az bir derleme türü tanımlamanız gerekir.Android Studio, varsayılan olarak debug ve release türlerini oluşturur.

Android dosya yapısı içindeki her modüle için bulunan build.gradle dosyasında yapı tipleri oluşturabilir ve yapılandırabilirsiniz.Yeni bir modül oluşturduğunuzda, Android Studio otomatik olarak sizin için debug ve release türlerini oluşturur.Yapılandırma dosyasında debug yapı tipi görünmeyebilir. Görünmese dahi Android Studio varsayılan debug ayarlarını kullanır.Debug yapı tipinde değişikliğe gitmek isterseniz, debug yapı tipini yapılandırmanıza ekleyebilirsiniz.

Aşağıdaki örnekte, debug yapı tipi için bir applicationIdSuffix belirtilmiştir. “staging” adında yeni bir yapı türü tanımlanıp, bu yapı türünde debug ayarları kullanılmıştır.

Product Flavors

Product Flavors, uygulamanızın ücretsiz ve ücretli sürümleri gibi kullanıcılara yayınlayabileceğiniz farklı sürümler oluşturmanızı sağlar.

Product Flavors,oluşturarak kodlarınızı ve kaynaklarınızı farklı sürümler için özelleştirebilirsiniz.Product Flavors, isteğe bağlıdır ve bunları manuel olarak oluşturmanız gerekir.

Product Flavor oluşturma işlemi Build Type oluşturma işlemi ile benzerdir.Product Flavor’lar uygulama modülüne ait olan build.gradle içinde yer alır.

build.gradle ‘da android kod bloğu içinde productFlavors bloğu oluşturarak Product Flavor’ları tanımlayabilirsiniz.Product Flavor’lar defaultConfig ile aynı özellikleri destekler. Çünkü aslında defaultConfig de ProductFlavor class’ından türemiştir. defaultConfig’i bir base ve default product flavor gibi düşünebilir ve genel bazı ayarları burada yapabiliriz.

Aşağıdaki örnekte, demo ve full şeklinde iki tane product flavor oluşturulmuş ve her biri için applicationID ve versionName tanımlanmıştır.

Build Variants

Build Variants, Build Type ve Product Flavor’ların çaprazlanması ile oluşan yapılardır.

Örneğin demo ve full olmak üzere iki tane product flavor’ınız var. Bunların her biri için de debug ve release build type’larımız olsun.

Oluşan demo-debug,demo-release,full-debug ve full-release yapıları birer build variant’tır.

Manifest Entries

Build variant yapılandırmasındaki manifest dosyasının bazı özellikleri için değerler belirtebilirsiniz.Bu değerler, main manifest dosyasındaki mevcut değerleri geçersiz kılar.

Bu özelliği, her bir build variant için farklı bir uygulama adı, minimum SDK sürümü veya hedef SDK sürümü tanımlamak istediğinizde kullanabilirsiniz.

Dependencies

Android Studio’daki Gradle derleme sistemi, yapınıza bağımlılık olarak harici modülleri veya diğer kütüphane modülleri eklenmesini kolaylaştırır.

Bağımlılıklar makinenizde veya uzak bir depoda bulunabilir ve ihtiyaç duyulan geçiş bağımlılıkları da otomatik olarak eklenir.

Projenize bir bağımlılık eklemek için, modülünüze ait olan build.gradle dosyanızın dependencies bloğunu kullanabilirsiniz.

Örneğin, bir uygulama modülü için aşağıdaki build.gradle dosyası üç farklı bağımlılık türü içerir:

Bağımlılığınız, local kütüphanenizde veya modülünüzde değilse Gradle, build.gradle dosyanızın repositories bloğunda belirtilen kaynakları tarar.

Varsayılan olarak, yeni Android Studio projeleri, aşağıda gösterildiği gibi jcenter() bağımlılığıyla gelir. Project build.gradle :

Signing

Yapı sistemi, yapılandırma ayarlarında imzalama ayarlarını belirtmenize olanak tanır ve APK’larınızı build sırasında otomatik olarak imzalayabilir.Yapı sistemi, varsayılan kimlik bilgilerini kullanarak debug sürümünü varsayılan anahtar ve sertifika ile imzalar.

Release versiyonu için ise bir imzalama yapılandırması açıkça tanımlamadıkça, derleme sistemi release sürümünü imzalamaz.

Signing işlemi nasıl yapılır?

Uygulama imzalama işlemi manuel olarak Build menüsü altındaki Generate Signed Apk sekmesinden yapılır. Eğer bir keystore.jks dosyanız yoksa, bu sekme altından yeni keystore dosyası oluşturup adımları takip edin.

Eğer elinizde bir keystore dosyanız varsa bunu build.gradle içinde tanımlayabilir. Ve istediğiniz build type içinde kullanabilirsiniz.

Modül düzeyinde build.gradle dosyasını açın ve storeFile, storePassword, keyAlias ve keyPassword alanlarıyla signingConfigs {} bloğunu oluşturun.Ardından bu nesneyi istediğiniz build type bloğuna tanımlayabilirsiniz.

Proguard

Yapı sistemi, her derleme varyantı için farklı bir ProGuard kuralları dosyası tanımlamanızı sağlar.Yapı sistemi, ProGuard’ı oluşturma sürecinde sınıflarınızı küçültmek ve gizlemek için kullanır.

Proguardı aktif hale getirmek için modül gradle’da bulunan build type içerisinde minifyEnabled true yapıyoruz.

getDefaultProguardFile (‘proguard-android.txt’) yöntemi, Android eklentisi ile paketlenmiş olan varsayılan ProGuard ayarları dosyasını alır.Projenizi çalıştırdığınızda, eklenti Android project/build/ intermediates/ Proguard-files/ dizinindeki kuralların bir kopyasını oluşturur.Bu kopya project yapısında proguard-rules.pro şeklinde oluşur. Bu dosyayı daha sonra kendi kurallarınızı ekleyerek güncelleyebilirsiniz.Her built type ve product flavor için farklı proguard kuralları belirleyebilirsiniz.

Bir çok kütüphane kullandığımızı düşünürsek tek bir proguard dosyası kullanmak yerine her kütüphanenin kendi proguard dosyasını barındıran bir proguard klasörü kullanmak istersek yapı şu şekilde olmalıdır.

Bu yapıda modül içerisine açtığımız proguard klasörüne eklediğimiz tüm .pro uzantılı dosyalar proguard kurallarına katkıda bulunuyor.

Build sonrasında proguard build/outputs/mapping klasörü altında şu dosyaları üretir:

  • dump.txt: Apk içerisindeki tüm sınıfların yapısını içerir.
  • mapping.txt: Orjinal ve obfuscated sınıf, method vs isimleri arasında eşleştirme bilgisi içerir.
  • seeds.txt Obfuscate edilmemiş sınıf, method vs isimlerini tutar. Kurallarla engellediğimiz sınıf isimleri burada yer alıyor.
  • usage.txt kod içerisinden kaldırılan alanların isimlerini tutar.

Build Configuration Files

Yeni bir projeye başladığınızda, Android Studio otomatik olarak yandaki dosya yapısını sizin için oluşturuyor.

Bir Android uygulaması için standart proje yapısının bir parçası olan birkaç Gradle derleme yapılandırma dosyası vardır. Uygulamanızı yapılandırmaya başlamadan önce, bu dosyaların her birinin kapsamını,amacını ve temel DSL ögelerini bilmeniz gerekir.

settings.gradle

Ana proje dizininde bulunan settings.gradle dosyası, Gradle’e uygulamanızı oluştururken içerecekleri modülleri bildirir. Çoğu proje için, dosya basittir ve sadece aşağıdaki gibi tek bir modül içerir.

include ‘:app’

Project build.gradle

Ana proje dizininde bulunan en üst düzey build.gradle dosyası, projenizdeki tüm modüllere uygulanan yapılandırmaları tanımlar.

Varsayılan olarak bu build.gradle, projedeki tüm modüller için ortak olan Gradle depolarını ve bağımlılıkları tanımlamak için buildscript bloğunu kullanır.

Birden fazla modül içeren Android projeleri için, proje düzeyinde belirli özellikleri tanımlamak ve bunları tüm modüllerde paylaşmak yararlı olabilir. Üst düzey build.gradle dosyasındaki ext bloğu sayesinde bu tanımlamaları yapabilirsiniz.

Daha sonra bu tanımlamaları modül build.gradle dosyasında kullanabilirsiniz.

Modül build.gradle

Her proje/modül dizinde yer alan modül düzeyinde build.gradle dosyası, içinde bulunduğu modül için yapı ayarlarını yapılandırmanıza izin verir.Modül için build type yada product flavor tanımlaması yapabilir.Onlara ilişkin değişiklikler yapabilirsiniz.

Ayrıca proje build.gradle dosyasındaki ayarları ezebilirsiniz.

Gradle properties files

Gradle kök proje dizininizde bulunan ve Gradle derleme araç takımı için ayarları belirtmek için kullanabileceğiniz iki özellik dosyası içerir.

  • local.properties : SDK yüklemesinin yolu gibi yapı sistemi için yerel ortam özelliklerini yapılandırır. Bu dosyanın içeriği Android Studio tarafından otomatik olarak oluşturulduğundan ve local geliştirici ortamına özgü olduğundan, bu dosyayı manuel olarak değiştirmemeli veya sürüm kontrol sisteminizde kontrol etmemelisiniz.
  • gradle.properties : Bu dosya ile Gradle’ın derleme için kullanacağı maksimum ram boyutu gibi proje çapında Gradle ayarlarını yapılandırabileceğiniz yerdir.

Aşağıdaki kod satırını gradle.properties dosyasına ekleyerek uygulamanın derlenirken kullanacağı ram boyutunu 2048MB olarak belirtebilirsiniz. Bu boyutu kendi ihtiyacınıza göre değiştirebilirsiniz.

org.gradle.jvmargs=-Xmx2048m

Android Modül Yapısı

Varsayılan olarak, Android Studio proje dosyalarınızı Android görünümünde görüntüler.Bu görünüm, diskteki gerçek dosya hiyerarşisini yansıtmaz.Kolaylaştırılmış ve projele dosyaları arasında gezinmeyi kolaylaştıran bu yapıda uygulanan bazı kurallar şu şekilde:

  • Tüm projenin yapısal dosyaları (build.gradle,gradle.properties vb) Gradle Script sekmesi altında görüntülenir.
  • Modül düzeyinde tüm manifest dosyaları manifests klasörü içinde görüntülenir.
  • Alternatif kaynak dosyaları tek bir klasör altında görüntülenir. Örneğin aynı ikonun farklı çözünürlükteki seçenekleri tek bir klasör altında listelenir.

Her bir Android uygulama modülünde dosyalar aşağıdaki şekilde listenir:

manifests : AndroidMafest.xml dosyalarını içerir.

java : Java kaynak kodlarını ve unit testlerini içerir.

res : Klasörlere ayrılmış şekilde layoutlar, stringler, bitmap görüntüleri vb gibi tüm kod olmayan kaynakları içerir.

Res klasörü

Uygulamanızın kaynaklarını ayırmanıza ve sıralamanıza yardımcı olan klasörler içerir.Kaynaklar temel olarak kaynak kodu dışındaki tüm gerekli dosyaları ifade eder.

Örneğin, bir uygulama geliştirirken uygulama logosu, fotoğraflar, sesler, videolar veya animasyonlar gibi kaynak dosyaları eklemeniz gerekir. Her dosya türü Android geliştirme standartlarına uymak için kendi klasörüne eklenmelidir.

Yeni bir uygulama oluşturmak için Android Studio’yu kullandığınızda, bazı klasörler sizin için otomatik olarak oluşturulur.

Ancak projenizde kullanabildikleriniz yalnızca bunlar değildir.

Aşağıda res klasörü içinde yapıları görebilisiniz.

drawable : Uygulamanızda kullandığınız resim,ikon,arkaplan gibi tüm görsel içerikler bu klasörde bulunur.

layout : Uygulama sayfalarının ya da bileşenlerinin tasarımı bulunur. Uygulama ilk oluşturulduğunda activity_main.xml dosyası hazır olarak bulunur. Bu MainActivity.java class’ınızın tasarımıdır.

values : Bu klasörde uygulamanızda kullanacağınız sabit değerleri tutabilisiniz. Uygulama ilk oluşturulduğunda colors.xml, strings.xml ve

styles.xml dosyaları bu klasör içinde otomatik oluşturulmuştur. Colors.xml’da uygulamanızda kullanacağınız renkleri tutabilir. Yine strings.xml de sabit değerlerinizi tutup bunları farklı diller için özelleştirebilirsiniz. Bunlar dışında

arrays.xml ya da attrs.xml yapılarını da kullanabilirsiniz. Arrays.xml’de listeler, attrs.xml’de uygulamanızda kullanacağınız farklı temalar oluşturabilirsiniz.

mipmap : Bu klasörde uygulamanızın launcler ikonu bulunur.

animator : Animasyonların bulunduğu klasördür.

anim : İki animasyon arasındaki ara animasyonların bulunduğu klasördür.

menu : Uygulamanızda kullandığınız menüleri içeren klasördür.

raw : .raw formatındaki müzik ve videoların bulunduğu klasördür.

xml : Bu kullanımlar dışında tanımlayabileceğiniz herhangi bir tanımlama için kullanabilirsiniz.

font : Ttf, otf ,ttc veya XML uzantılarına sahip yazı tipi dosyaları bulunur.

color : Özelleştirilmiş color tanımlamalarının olduğu klasördür. Aksiyonlara göre renk tayin edebilirsiniz. values/colors.xml ile arasındaki farkı sonraki örnekte görebilirsiniz.