👨🏼💻Android Geliştirme İçin Best Practices
Günümüz mobil dünyasında android yazılımlı cihazların kullanımı oldukça yaygın hale gelmiştir. Bu, android yazılımlarını en iyi şekilde geliştirmede çok önemli hale getirdi. Android geliştirirken nelere dikkat edilmesi gerektiğine bir göz atalım.
Sadece kodu yazmak yeterli değil, etkili bir şekilde yazmak asıl zorluktur.
- Kod Kalitesine Dikkat Edilebilir
Kodlamanın bir sanat olduğunu düşünürsek, kişi doğru kodlamaya başladığında lezzeti aldığı lezzette artmaya başlar. Üstelik ne kadar yaratıcı kodladığınız, ne kadar iyi geliştirici olduğunuzu gösterir. Kod kaliteniz her zaman önemlidir. Uzun kod yazmak hiçbir zaman akıllıca bir adım olmadığından, yalnızca daha fazla hata olasılığını artırmakla kalmaz, çok fazla zaman harcar ve çok fazla karmaşıklık yaratır. Kodunuza en iyi görünümü vermek için öncelikle bir uzmanın kodunu inceleyebilir, yaklaşımını analiz edebilir ve bunu değiştirmeye çalışabilirsiniz.
- Design Pattern Kullanılabilir
Tasarım kalıpları, yazılım tasarımında belirli bir bağlamda yaygın olarak ortaya çıkan sorunlara yeniden kullanılabilir çözümler sunar. Bir soruna olası bir çözüm olmanın yanı sıra, üzerinde anlaşmaya varılmış kalıplara aşina olduğunuzda, ekipler halinde çalışmak daha kolay hale geldiğinden geliştiriciler arasında iletişime yardımcı olur. Günümüz de MVC, MVP, MVVM, MVI, Clean Architecture gibi birçok mimarimiz var. Bunların arasından seçim yaparken popüler olan mimariden değil de, projenize uygun olan mimariyi seçmelisiniz. Dolayısıyla bu mimarilerden herhangi biri proje gereksinimlerinizi karşılıyorsa ve standart kodlama yönergelerini izliyor ve kodunuzu temiz tutuyorsanız, hiçbir mimari kötü değildir.
- User Experience Konusu Oldukça Önemli
Bir kullanıcının uygulamanızla etkileşimi oldukça önemlidir. Son zamanlarda mobil cihazlarda daha iyi deneyimlere yönelik taleplerde bir artış olduğu konusunda hepimiz hemfikir olduğumuzu düşünüyorum. Uygulamalarımızın deneyimini iyileştirmek için dikkat etmeniz gereken bazı noktalar göz atacak olursak:
- Mükemmel UI&UX Tasarımı: Bir uygulamanın kullanıcı dostu olma hissi ve deneyimi iyi bir ui&ux tasarımı ile başlar. Google materyal tasarımı(material dessign) ilkelerine uygun bir uygulama geliştirilmesi oldukça önemlidir.
- Handling Configuration Changes: Yapılandırma değişiklikleri, çoğu Android geliştiricisinin için bir acı gibi görünüyor. Cihazınızı döndürdüğünüzde ve ekran yön değiştirdiğinde, Android genellikle uygulamanızın mevcut aktivitelerini ve fragment ları yok eder ve onları yeniden oluşturur. Bu, uygulamanın kaynakları yeni yapılandırmaya göre yeniden yükleyebilmesi için yapılır ve bu temelde yeniden başlamak gibidir. Bu senaryonun yanlış işlenmesi, kötü bir kullanıcı deneyimi örneğidir ve birçok kullanıcıyı kaybetmenize neden olabilir. Google’ın 2017'de yayınladığı mimari bileşenlerin bir parçası olan viewModel ile, uygulamanızın yön değişikliği konusunda veri kaybı yaşamamasını sağlayabilirsiniz. ViewModel, kullanıcı arayüzü ile ilgili verileri yaşam döngüsünde bilinçli bir şekilde depolamak ve yönetmek için tasarlanmıştır. Bununla birlikte verileriniz yapılandırma değişikliklerinden kurtulabilirsiniz.
- Agile Çalışılabilirsiniz
Çevik(Agile) proje geliştirme metodolojisi, mobil uygulama geliştirme söz konusu olduğunda geleneksel diğer yaklaşımlara kıyasla birkaç önemli avantaj sunar. Geliştirme ve müşteri ekipleri arasında uyumu daha kolaylaştırır ve tüm paydaşlar arasında sürekli ve üretken bir ortaklığı mümkün kılar. Çevik model, müşteriler için geliştirme sürecine tam şeffaflık sağlar ve geliştirme ekiplerinin, müşteri geri bildirimlerini uygulama geliştirme sürecine katma esnekliği sağlar. Bu, projenin müşterinin vizyonuyla uyumlu kalmasını ve bu hizalamayı sürdürmek için süreç boyunca değişikliklerin kolayca yapılabilmesini sağlar. Bir projeyi daha küçük modüllere veya sprintlere bölmek, geliştirme sürecini hızlandırmak için birden fazla ekibin görevlendirilebilmesini sağladığı gibi, bir MVP’yi daha hızlı başlatmanıza ve sonraki yinelemelerde karar vermeye yardımcı olmak için gerçek kullanıcılardan hızlı geri bildirim toplamanız da olanak tanır.
- Resource yapısını kullanırken bazı noktalara dikkat edilmelidir
- Styles Kullanılabilir: Hemen hemen her projenin stilleri doğru bir şekilde kullanılması gerekir. Uygulamadaki çoğu metin içeriği için ortak bir stiliniz olması, yaygın kullanımlarda kolaylık sağlayacaktır.
<style name="ContentText">
<item name="android:textSize">@dimen/font_normal</item>
<item name="android:textColor">@color/basic_black</item>
</style>
TextViews Uygulanır:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/price"
style="@style/ContentText"
/>
Tek bir style.xml dosyanız olması gerekmez, “style.xml”, “styles_home.xml”, “styles_item_details.xml”, “styles_forms” gibi diğer dosyalara bölebilirsiniz.
- Renkleri Doğru İsimlendirebilirsiniz:
colors.xml dosyasında yer alan renkleri uygun isimlendirmek, renkleri değiştirmeyi veya yeniden düzenlemeyi kolaylaştıracak ve ayrıca kaç farklı rengin kullanıldığını daha rahat anlamamızı sağlayacaktır. Normalde estetik bir kullanıcı arayüzü için kullanılan renk çeşitliliğini azaltmak önemlidir.
Yanlış Kullanım:
<resources>
<color name="button_foreground">#FFFFFF</color>
<color name="button_background">#2A91BD</color>
</resources>
Doğrı Kullanım:
<resources>
<!-- grayscale -->
<color name="white">#FFFFFF</color>
<!-- basic colors -->
<color name="blue">#2A91BD</color>
</resources>
Ek olarak, gerekirse, renk paletine referans veren ek bir renk kaynak dosyası tanımlanarak temel renkler ve stil kullanımı arasında daha da fazla ayrım yapılabilir.
- Dimens Kullanılabilir:
Renklerde olduğu gibi benzer amaçla margin, paddings, spacing ve font size için bazı tanımlamalar yaparak tekrardan kaçınabilirsiniz. Dimens işinizi kolaylaştırırken tutarlı bir görünüm ve his verecektir.
<resources> <!-- font sizes -->
<dimen name="font_larger">22sp</dimen>
<dimen name="font_large">18sp</dimen>
<dimen name="font_normal">15sp</dimen>
<dimen name="font_small">12sp</dimen> <!-- typical spacing between two views -->
<dimen name="spacing_huge">40dp</dimen>
<dimen name="spacing_large">24dp</dimen>
<dimen name="spacing_normal">14dp</dimen>
<dimen name="spacing_small">10dp</dimen>
<dimen name="spacing_tiny">4dp</dimen> <!-- typical sizes of views -->
<dimen name="button_height_tall">60dp</dimen>
<dimen name="button_height_normal">40dp</dimen>
<dimen name="button_height_short">32dp</dimen></resources>
- Kendi HTTP client’ınızı oluşturmak yerine, OkHttp Kütüphanesini kullanılabilir
Sunuculara istek gerçekleştirmek için kendi istemcinizi uygulamak yerine kullanmanız gereken, kendini kanıtlanmış birkaç çözüm vardır. Verimli HTTP istekleri için yığınınızı OkHttp’ye dayandırmanızı ve güvenli bir katman sağlamak için Retrofit’i kullanmanızı önerim. Retrofit’i seçerseniz, görüntüleri yüklemek ve önbelleğe almak için Picasso kütüphanesini kullanmanızı tavsiye edebilirim. Retrofit, Picasso ve OkHttp aynı şirket tarafından oluşturuldukları için birbirlerini güzel bir şekilde tamamlarlar ve uyumluluk sorunları nadirdir. Görüntüleri yüklemek ve önbelleğe almak, animasyonlu GIF’leri, dairesel görüntüleri için başka bir seçenek olarak Glide kütüphanesinde kullanılabilir.
- Projeler güvenlik açısından savunmasız bırakılmamalıdır.
Geliştiricinin ne tür bir uygulama yapmayı amaçladığı önemli değil, ancak geliştirici tarafından güvenliğe kesinlikle öncelik verilme ve ihmal edilmemelidir. Uygulamalarınız, uygulamanızdaki kullanıcıların yanı sıra şirketinizin tonlarca verisine ve hassas bilgilerine sahip olacaktır. Geliştirdiğiniz uygulamaya bağlı olarak, ödeme bilgileri ev adresi, telefon numarası ve kullanıcı tarafından sağlanan daha birçok şey gibi önemli bilgilere sahip olabilir. Uygulamanız güvenli değilse kullanıcılar size bilgi vermekten çekinirler. Güvenlik ihlal edilirse, markanıza o kadar zarar verebilir ki kurtarılması zor olabilir. Bu nedenle hassas bilgileri korumak için önlemler almak ve şifreleme (İki Faktörlü Kimlik Doğrulama 2FA) gibi diğer taktikleri kullanılması gerekmektedir.
- ProGuard Kullanımı:
Android Studio üzerinde bir projeye başladığınızda varsayılan olarak ProGuard kapalı halde bulunur. Kaynak kodlarımızı korumak istiyorsak useProguard true kodunu ekleyerek karıştırma özelliğini aktif etmeliyiz. Bu sayede kodlar geri dönüştürüldüğünde anlamsız class, metod ve değişken isimleri ile adlandırılarak kodun okunaklığı zorlaştırılmış olur.
android {
buildTypes {
debug {
minifyEnabled true
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
} release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
}
ProGuard kullanılmayan projeler geri dönüştürüldüğünde (Decompile Edildiğinde) kaynak kodları açık bir şekilde görüntülenir.
- ProGuard Kullanarak Kaynakları Sıkıştırmak:
ProGuard kullanarak kullanılmayan kaynak kodları sıkıştırır fakat kodları karıştırmaz (obsufucation gerçekleştirmez). Ek olarak minifyEnabled özelliği Instant Run sırasında çalışmaz.
Eğer uygulama boyutunun düşürülmesi ( sıkıştırma ) sizin için önemli ise Kullanılmayan alternatif kaynakları (resim, xml vb. ) kaldırıp ve yinelenen kaynakları birleştirerek uygulama boyutunu küçültmek istiyorsanız, Gradle’nin içinde varolan deneysel kod sıkıştırma özelliğini yani shrinkResources aktif edebilirsiniz. Bu özelliği aktif etmek için yine buildTypes içinde shrinkResources true yazmanız yeterli olacaktır.
5.3. Key Store
Keystore, uygulamalarımızı güncelleyebilmemiz için önemle saklamamız gereken dosyalardan biridir. Yazmış olduğumuz uygulamaları Google Play Store’da yayınlayabilmek ve güncelleyebilmek için APK’mızın imzalanmış olması gerekmektedir. Bu yüzden key store ve key alias şifrelerini özenle saklanması gerekmektedir.
İmzalı apk oluşturmak için, Build->Generate Signed APK diyoruz. Sonra module adımızı seçiyoruz. Sonrasında next deyip gelen ekranda eğer önceden oluşturduysak Choose Existing diyoruz. Eğer oluşturmadıysak Create new butonuna tıklayarak yeni bir tane oluşturuyoruz. Oluşturulan bilgiler ile next diyoruz. Build Type relase seçip Finish’e basıyoruz ve bir süre imzalamasını bekliyoruz. İmzalama işi bittikten sonra imzalı apk nın bulunduğu dizini bize bildiyor.
Eğer işlemi yapacağınız bilgisayarda daha önce apk oluşturulduysa unutulan şifremizi de kurtarabiliriz. Dosya yapısından project->gradle->executionHistory içerisindeki executionHistory.bin dosyası text olarak açıp sayfa içerisinde signingConfig.keyAlias olarak arama yapılıp şifrelere ulaşılabilir.
5.4 Encrypted Shared Preferences
Encrypt Shared Preferences, android uygulamalarımızda veri depolamak için kullandığımız Shared Preferences sınıfının genişletilmiş halidir. Bu sınıf ile oluşturduğumuz xml dosyasının şifreli olarak tutulmasını sağlar. Shared Preferences ile kaydettiğimiz veriler ram üzerinde tutulmadığı için uygulamamız kapansa da veriler korunur, uygulamamıza bağlı bir dosya yolunda .xml dosyası içinde verilerimiz tutulmaktadır.
Bazen uygulamayı hızlıca yazdığımızda güvenlik durumlarını unutup, token bilgisi veya userId bilgisi gibi uygulama için önemli olan verilerimizi de kayıt edebiliriz. Bu bilgilerle 3.şahıslar API üzerinden sizin bilgileriniz ile istekte bulunulabilirler ve güvenlik açığı oluşur. Bu tarz durumlardan kaçınmak ve verileriniz güvenliğini sağlamak için Encrypt Shared Preferences’ı kullanılabilir. Bu özelliği kullanabilmek için android min sdk’nız api 23 olması gerekmektedir. Ek olarak verilerimizi şifreli olarak kaydedebileceğimiz başka kütüphanelerde kullanılabilir veya kendimiz çeşitli algoritmalarla şifreleyip kayıt edebiliriz.