2015’de neler konuşulduyu biraz geç de olsa genel başlıklar altında toplamaya çalıştım. Keyifli okumalar 🙂
1 – Android For Java Developers
Özellikle Chat Haase tarafından geçtiğimiz yıl birçok konferansta üstte gördüğünüz ya da benzeri bir başlıkta çok sayıda sunum yapıldı. Medium’da Developing for Android: Introduction yazısı altında tüm detaylar yer almakla beraber konferanslarda anlatılan ve yazıda daha detaylıca bahsedilen aslında tabi ki aynı. Özetle Android geliştirme için, konulmuş bazı kurallar var. Ama bu kuralların neden konduğunu bilmezsek aslında, öğrenmekte ve uygulamakta zorluk çekebiliriz. Bu yüzden de farklı gruplarda çalışmış Google Mühendisleri bir araya gelip, bizler için böyle bir döküman hazırlamışlar. Başlıklar aşağıda da görebileceğiniz şekilde sıralanmakta.
Developing for Android: Contents
Introduction
I: Understanding the Mobile Context
II: The Rules: Memory
III: The Rules: Performance
IV: The Rules: Networking
V: The Rules: Language & Libraries
VI: The Rules: Storage
VII: The Rules: Framework
VIII: The Rules: User Interface
IX: Tools
Dökümanı inceleyenler tabi ki daha detaylı bilgiye de sahip olacaktır ama bazı önemli olan başlıklarla ilgili de yazının devamında kısaca bilgi vereceğim.
Verilen başlıklardan aslında en önemlisi Mobile Context’i anlamak başlığı. Eğer Java için düşünürsek, Java programlama dili; bir runtime var; hardware var. Bunu server tarafında yazdığımız kod olarak düşünürsek, programlama dili Java, runtime-server, hardware server, CPU hızlı, memory sonsuz gibi düşünülebilir. Android’e geldiğimizde programlama dili yine Java aslında. Burada runtime’ımız Dalvik ya da ART artık. Ama hardware resimde de görüldüğü gibi küçüldü. Çünkü cihaza indirgemiş oluyoruz aslında.
Yukarıda verdiğim başlıklardan Memory ile devam edecek olursam da, en önemli 2. konudur diyebiliriz. Çünkü aslında Memory dediğimiz, cihazın memory’si, ki bu da çok değişken. Ama değişken olması bir ya da Limited. Bu da en önemli sıkıntımız. Be aslında memory=performans. Çünkü baktığımızda arka planda çok fazla memory tüketen uygulamalar, uygulamanın hatta cihazın kitlenmesine, kullanılamaz hale gelmesine sebep olacaktır. Bir noktaya kadar Garbage Collector bize çözüm olabilir ancak, çok kompleks uygulamalarda aslında garbage collector de ne zaman release edeceğini bilemeyebilir. Bizim doğru bir şekilde tüm cihazları düşünerek uygulamayı geliştirmemiz lazım.
Aşağıda Dalvik kullanan bir cihazın nasıl memory allocate ettiğini, nerelerde pause ettiğini görüyoruz.
Eğer ART kullanılıyor olsaydı bu biraz daha iyi olacaktı.
Ancak hatalı bir kodlama, GB’nin aşağıda görüldüğü gibi çok fazla beklemesine sebep olabilir. Bu derecede bir sorun yaşamamak için yapılmaması gereken temel hatalar da for içinde değişken yaratılması, listenerların nullanmaması olabilir. View destroy edilirken listenerlar sistem tarafından destroy edilmez. Benim handle etmemiz gereklidir.
Daha az allocation yapılması da daha az heap kullanılması, allocation ve collection’ların time’ının düşmesi, dropped framelerin azalması, daha az CPU kullanımı ve sonuç olarak da mutlu kullanıcılar sonucunu bize getirecektir 🙂
Son olarak bir diğer başlık olan tool’lardan da kısaca bahsedersek, bir Android Studio üzerinden kullanabileceğimiz tool’lar var. Bir de cihazda Developer Options altında bazı şeyleri görebilmemizi sağlayan tool’lar bulunmakta. Mesela Systrace, Allocation Tracker, TraceView, HierarchyViewer, MAT, Memory Monitor Android Studio üzerindeki tool’lardan bazıları.
Systrace, zamana bağlı olarak CPU döngülerinin nerede harcandığı bilgisini verir. Ve toollar’da çok alışık olduğumuz üzere yine renkler üzerinden bize bilgi verir. Olmasını beklediğimiz renk yeşil, sarı ya da kırmızı olduğunda dropped frame olduğunu göstermiş oluyor. Sorunlu olduğunu gördüğümüz view’e tıklayıp, onun hakkında daha detaylı bilgi alma, öneriler sunulması gibi sağladığı güzel özellikler var. Allocation Tracker, compute performansını analiz ederken kullanılan bir tool’dur. Debug sınıfını kullanarak kodu analiz eder. Peki bize ne sağlar dersek de, iki adet paneli vardır biri timeline diğeri profiling, method süreleri hakkında bilgi verir. HierarchyViewer ise en bilindik tool olabilir. En temel olarak, view hiyerarşisini izlememizi sağlar. MAT de eclipse’in memory analyze tool’u.
Device’daki tool’larla devam edersek de mesela GPU profiling, GPU renderingin cihazda nasıl çalıştığını görmemizi sağlar. GPU overdraw yine aynı şekilde overdraw edilmiş view’leri görmemizi sağlar.
2 – Making Your App Better
Yine bu sene çok konuşulan bir konu da Animation API’ları.
Bunlardan ViewPropertyAnimator classı Android 4.1+ dan itibaren aslında ama support lib sayesinde eski versiyonlarda kullanılabiliyor. Bu basit view animasyonlarını yapabilmemizi sağlıyor. View’in birden çok propertisine aynı anda tek bir methodla animasyon tanımlanmamızı sağlıyor ve bunların birbiriyle paralel olarak çalışmasını sağlıyor.(Aşağıda)
Object Animator da aslında view property animator’a benzer şekilde view’in birden çok propertisine animasyon verebilmemizi sağlıyor ancak tek seferde tek property’ye izin veriyor. Scale X ya da Scale Y gibi. Android 3+dan itibaren kullanabiliyoruz.
Interpolar ise değişikliğin oranı, hız, ivme gibi değerleri tanımlamak için kullanılır.
Circular Reveals ise isminden de anlaşılacağı üzere, bazı UI elementlerini ortaya çıkarmak ya da gizlemek için bir clipping circle kullanmaktadır. Aslında kullanıcıyı çekmek için mantıklı bir animasyon.
Transitionları ise aşağıdaki imajlardan takip edebilirsiniz.
Window content transitionlar ise Transition’ların customize edilmiş hali. Activity’ler arasındaki geçişlerde kullanıyoruz. (Aşağıda)
Shared element transitions, activity’ler arasında paylaşılan view’lerde kullanılır. (Aşağıda)
3-Mobile Services From Google
Tip One: New Android Studio Template
Android Studio’da map activity için yeni bir template var aslında. Eskiden map içeren uygulama yazabilmek için (google play services’i kullanan), ilk önce map activity yaratıyorduk. Ki sadece yaratarak yapabileceğimiz hiç bir şey yok aslında. Sonrasında google developer console’a gidip, adc’da bir application yaratmamız gerekiyordu. Uygulamayı yarattıktan sonra mapping api’yı açabiliyoruz. Servislere erişebilmek için bir API key alıyoruz. Android Studio’daki map template’inden yaratırsak ise, arkada hidden olarak api keyi de yaratmış oluyor. Tüm bu süreci atlamış, sonuca çok daha basit ulaşmış oluyoruz.
Tip Two: Use Lite Mode Maps
https://developers.google.com/maps/documentation/android-api/lite?hl=en
Bir diğer tip de haritanın Lite mode kullanımı. Aslında haritanın ne kadarlık bir işlevini kullanacağımızı tespit etmemiz bize önerilen bir konu. Sadece nerede olduğunu nereye gideceği gibi belli bilgileri vereceksek, kullanıcıyla çok fazla etkileşime girmeyeceksek, tüm map engine’i kullanmamız gerekmez. Lite mode da kullanılabilir. Zoom in zoom out gibi özellikler yok bunda, ama çok daha hızlı.
Tip Three: Consider GeoJSON or KML
GeoJSON, Json data formatının bir extention’ı aslında. Haritaya kolayca layer’lar eklememizi sağlıyor. KML de xml data formatının extentionı. Güzel tarafı Android Map Utils bunlar için hali hazırda parser’lar içeriyor. İşimizi kolaylaştırmış oluyor.
Tip Four: Cluster is not a bad world!
Resimden her ne kadar çok anlaşılmasa da burada bir gruplama var aslında. Daha uzak bir çerçeveden bakarken tek tek tüm yerleri vermek yerine başta mesela o bölgede kaç tane diyelim restoran var gösterip, yaklaşınca tek tek göstermek harita performansını arttırmakta.
Tip Five: Consider Polyline Encoding!
Mesela bir bisiklet yolu, rota gibi çok fazla lokasyon datası almamız gerken bir case olursa polyline encoding yardımcı olabilir.
Tip Six: Curated Locations
Tip Seven: Location Sensor Optimisation
Bir diğer konu da aslında hangi lokasyonu ne zaman dinlemeye başlayacağımız ve bırakacağımız hakkında. Burada son bilinen lokasyon tutulabilir. Lokasyon alındığında bir öncekiyle karşılaştırılıp, current güncellenebilir, hangisi daha düzgünse o kullanılabilir.
Tip Eight: Map Overlays
Overlay kullanımı biraz maliyetli aslında bu yüzden dikkatli olunması gerekli. Eğer örnekler üzerinden gidecek olursak, mesela trafiği göstermek için kullanabiliriz. Burada zaten bakılacak olan süre çok değildir diye bir varsayım var ama farklı renklerdeki pinleri göstermek için kullanmak için farklı overlayler kullanmak doğru bir seçim olarak gösterilmiyor.
Tip Nine: Using Beacons
Tip Ten: API Utility Library
- GeoJSON / KML
- Heatmaps
- Customized Markers
- Clusters
- Polyline Encoding
- Distance, Area,
- Heading Calculation
- Open Source!
4- Gradle
Ve tabi ki Gradle.
Üstte yer alan imajda gördüğümüz, Android Studio’da bir Android projesi için kullandığımız tipte bir gradle dosyasına örnek. Compile version, buildtoolversion vs gibi değerler var. Gradle çoğumuzun hayatına(ben de dahil) aslında Android studio’yla girdi ancak. Aslında Gradle da aynı Maven gibi kava da vs de kullanabileceğimiz bir tool.
Peki neden Gradle kullanmalıyız diye araştırdığımızda ise aşağıdaki grafikle karşılaşıyoruz. Hem kullanımın basit olması hem de ne kadar kompleks olursa olsun, sorun yaşamadan build alabilmeyi istiyoruz.
Neden Gradle’la devam edersek de, kullanımı basit, çok fazla takım, koordine bir şekilde kullanabilir. Apk üretmek bir yanda, tested code örnekler, automated release process vs gibi güzel seçenekler sunuyor.
… devamı gelecek…
Referanslar:
- http://droidcon.com/
- https://skillsmatter.com/conferences/6712-droidcon-2015
- https://medium.com/google-developers/developing-for-android-introduction-5345b451567c#.nbwgkioul
- https://photos.google.com/share/AF1QipMRnZL6gNbS06fnBNtKffRm9HBaxW8iP6w0L1T4nZYLI6s3wi_l8daT6mq4nwPf-w?key=LThZNmFXUUtmNi04bWlEYmVfcWdPenlvaDdCRU13
- http://tools.android.com/tech-docs/jackandjill
- http://reactivex.io/intro.html
- https://github.com/ReactiveX/RxJava/wiki
- https://github.com/ReactiveX/RxAndroid
- https://github.com/JakeWharton/RxBinding
- https://kotlinlang.org/docs/tutorials/kotlin-android.html
- https://en.wikipedia.org/wiki/Kotlin_(programming_language)
- https://kotlinlang.org/
- http://developer.android.com/tools/building/configuring-gradle.html
- http://gradle.org/
- https://docs.gradle.org
- https://developers.google.com/maps/documentation/utilities/polylinealgorithm
- https://developers.google.com/maps/documentation/android-api/utility/?hl=en