Android Studio’da Configuration Caching

Yazılım projelerini oluşturma aşamasında harcanan zaman herkes için çok değerlidir. Proje için harcanan zamanı en aza indirmek, maddi ve manevi birçok getirileri bulunmaktadır. Android uygulama geliştirme süreçlerinde birden fazla yöntem ile zaman kazancı sağlayabilirsiniz.  Android Studio’da Build Analyzer Kullanımı ve Debug Püf Noktaları adlı makalelerimde farklı 2 yöntemden bahsetmiş bulunmaktayım.

Bu makalemde ise  Android Studio Gradle 6.6 sürümünün,  yapılandırma sürecinin sonucunu önbelleğe alarak, bu bilgiyi bir sonraki derlemelerde  kullanmasıyla performansı önemli ölçüde artıran “Configuration Caching” özelliği anlatacağım.

“Configuration Caching” özelliğinde ek olarak, yapılandırma önbelleğini yeniden kullanırken, varsayılan olarak daha fazla iş paralel olarak çalıştırılır. Yapılandırma ve yürütme aşamalarının izolasyonu ve görevlerin izolasyonu, bu optimizasyonları mümkün kılar.

Not: Yapılandırma önbelleğini kullanan Gradle, yapılandırma komut dosyaları gibi derleme yapılandırmasını etkileyen hiçbir şey değişmediğinde yapılandırma aşamasını tamamen atlayabilir.

Configuration Caching Özelliğini Aktif Etme

Configuration caching özelliği, Gradle 6.6 sürümünde bulunmaktadır. Bu özelliği aktif edebilme için gradle dosyasında bir komut çalıştıracağız. Android Studio’da komut çalıştırmak için View->Tool Windows->Terminal sekmesini açmalısınız. Terminal adlı pencere, Android Studio aşağı kısmında açılacaktır. Burada proje yolununda yazmış olduğu komut yazma alanını göreceksiniz. Windows ve Linux(veya Mac) işletim sistemlerinde yazılan gradle komutları biraz farklıdır. Örneğin, gradle versiyonunuzu öğrenmek isterseniz,

Windows ‘da “gradlew –v”, Linux(veya Mac) işletim sistemlerinde ise “./gradlew –v” yazmalısınız.

Configuration caching özelliğini aktif etmek ve yardımı çalıştırmak için;

Windows işletim sisteminde

gradlew --configuration-cache help

Linux veya Mac işletim sisteminde

./gradlew --configuration-cache help

şeklinde komutları kullanmalıyız.

Örnek;

 

Configuration caching özelliğini aktif etmenin diğer bir yolu, proje ana dizinindeki gradle.properties dosyasını açıp,

org.gradle.unsafe.configuration-cache=true

kodunu ekleyerek yapabilirsiniz. Bu yöntemle özelliği aktif ederseniz, her derlemede komut satırı tarafına geçmeden Configuration caching kullanmış olursunuz.

 

Java Build

Yaklaşık 500 tane alt projeye ve karmaşık yapı mantığına sahip büyük bir Java enterprise projesi, normalde 8 saniyede çalışırken, Configuration caching özelliği kullandığımızda ise 0,5 saniyede derlendiğini gördük.Böylelikle Configuration caching özelliği ile 16 kat daha hızlı derlemiş oldu. Aynı yapıda, uygulama kodunu değiştirdikten sonra assemble çalıştırmak, 40 saniyede derlenirken, 13 saniye gibi bir sürede, yani yaklaşık 3 kat daha hızlı derlenmesine sebep oldu. Bu örneğin grafiği aşağıdadır.

gradle/gradle  projesinin derleme anını inceleyelim . Bu proje yüz tane alt proje ve karmaşık bir yapıya sahiptir.
Uygulamada değişikliği yaptıktan sonra test yaptığımızda aşağıdaki grafikte, mavi alanda configuration phase(yapılandırma aşaması), yeşil alanda ise execution phase bilgisini görebilirsiniz. Grafiğin sol tarafında , configuration caching(yapılandırma önbelleği) etkinleştirilmeden, yapılandırma aşaması 2 saniyeden fazla sürerken, grafiğin sağ tarafında configuration caching ile 214 milisaniyeye inmektedir.Yani 2 saniyeden 214 milisaniyeye düşerek, zamandan kazanmış olduk.

Android builds

2500 alt projeye sahip çok büyük bir Android uygulamasının derleme zamanlarını inceleyeceğiz. Bu projeyi normal derlediğimizde 25 saniyede, configuration caching ile derlediğimizde ise 0,5 saniyede çalışmaktadır. Yani configuration caching sayesinde 50 kat daha hızlı derlendi. Bazı alt uygulamaları değiştirdikten sonra APK’yi bir araya getirmek gibi daha kullanışlı bir derleme çalıştırmak, ~ 50 saniyeden ~ 20 saniyeye, neredeyse 3 kat daha hızlı yapılabiliyor.

Kendi Android uygulamalarınızda, yukarıda gibi zaman ölçümleri yapmak istiyorsanız, bu github reposunda talimatları izleyerek, Gradle Profiler den yardım alarak yapabilirsiniz.

Kaynak

1- https://blog.gradle.org/introducing-configuration-caching

2- https://developer.android.com/studio/build/build-cache.html

React Native ile Mobil Uygulama Geliştirme – 6 – React Native Animation

“React Native ile Mobil Uygulama Geliştirme” başlıklı makalelerimizden bir yenisini daha sizlerle paylaşmak istiyorum. Bu makale, bir dizi makaleden oluşacak olan serisinin 6. kısmıdır. Bir önceki makalede (Part 5), React Native API Integration, uzak URL’lerden veri alma yollarını anlattım.

Mobil uygulama geliştirirken yazılara, resimlere vb. arayüz bileşenlerine, animasyonu nasıl uygulayacağımızı öğreneceğiz.

Daha önceki makaleleri okumadıysanız, lütfen buradan başlayın.

Mobil uygulamada kullanıcı deneyimini iyileştirmenin en iyi yollarından biri animasyon kullanmaktır. Android ve iOS yerel geliştirmede, animasyon farklı şekilde ele alınır. Ayrıca, Android’de bulunan tüm animasyonlar iOS’ta uygulanamaz ve bunun tersi de geçerlidir. React Native Animation, animasyonu hem Android hem de iOS’ta uygulamak için aşağıdaki iki API’yi sağlar:

  • Animated API
  • LayoutAnimation API

Bu API’lerin nasıl kullanılacağını örneklerle öğreneceğiz.

Animated API

Animated API’yi View, Text, ScrollView, Image, FlatList ve SectionList ile kullanabiliriz. Animasyonlu bir bileşen oluşturmak için Animated.createAnimatedComponent() yöntemini de kullanabiliriz.

Örneğin :

import * as React from 'react';
import { Text, View, StatusBar, StyleSheet, Animated } from 'react-native';
export default class App extends React.Component {
  state = {
    width: new Animated.Value(0),  
  }
  componentDidMount() {
    Animated.timing(                 
      this.state.width,           
      {
        toValue: 100,               
        duration: 3000,             
      }
    ).start();                      
  }
  render() {
    return (
      <View style={{ paddingTop: 30,paddingLeft : 40 }}>
        <Animated.View style = {{backgroundColor: "blue",width: this.state.width, height: 50}}/>
      </View>
    );
  }
}

Bu örnekte, 3 saniyelik bir süre boyunca “genişlik” “0” ile “100” arasında bir görünüm oluşturacaktır. “Görünüm” yerine “Animated.View” kullandığımıza dikkat edin. Ayrıca, “genişlik” değerini değiştirmek için “Animated.timing” yöntemini kullanıyoruz. “Genişlik”, bileşenin “durumunda” tanımlanan bir değerdir. Değeri, “Animated.View” öğesinin genişliğini ayarlamak için kullanılır. Aynı yaklaşımı kullanarak, bir görünümün hem yüksekliğini hem de genişliğini canlandırabiliriz, bir görünümün opaklığına animasyon ekleyebiliriz vb. Bu, durumu sürekli olarak değiştirmekle aynı değildir. Durumu sürekli değiştirirsek, bileşeni tekrar tekrar yeniden oluşturacak ve bu da görünümün performansını etkileyecektir. Animation API, animasyonu daha verimli göstermek için farklı bir mekanizma kullanır.

Animasyon yapılandırması:
Animated, üç farklı animasyon türü sağlar:

Animated.decay(): Bu tür animasyonlar bir başlangıç ​​hızıyla başlar ve yavaş yavaş son hıza doğru yavaşlar.
Animated.spring(): Spring fiziği model animasyonu.
Animated.timing(): Belirli bir süre boyunca bir değeri canlandırır. Bu, “Animasyonlu” nun en yaygın kullanılan işlevlerinden biridir.

Animasyon değerleri:
Yukarıdaki örnekte Animated.value kullandık. Animated.Value(), tek değerler için kullanılır. Bu yöntemin dışında Animated.ValueXY() de var. Bu, vektörler için kullanılır.

Bir animasyonu başlatmak için start() yöntemi kullanılır. Bu yöntem isteğe bağlı olarak, tamamlandığında çağrılacak olan bir tamamlama işleyici bloğu alır. Önceden tanımlanmış değerlerle tamamlanmadan önce bir animasyonu durdurmak için stop() yöntemini de çağırabiliriz. Örneğin, herhangi bir kullanıcı etkileşiminde veya başka bir animasyon başlarsa stop() ‘u çağırmamız gerekebilir. Tamamlama bloğunda animasyonun normal şekilde bitip bitmediğini veya stop() çağrılıp çağrılmadığını tespit edebiliriz. Bize tamamlama bloğunda, normal tamamlama için “true” ve “stop()” tamamlama için “false” olacak olan “finished” adlı bir bayrak verir.

Animasyonları birleştirin:
Yeni bir tane oluşturmak için iki hareketli değeri birleştirebiliriz. Animasyonları birleştirme yöntemleri şunlardır:

Add: Animated.add()
Subtract: Animated.subtract()
Divide: Animated.divide()
Modulo: Animated.modulo()
Multiply: Animated.multiply()

Mimik :
Animasyonla çalışıyorsak, jestlerle uğraşmak zorunda kalabiliriz. Hareket olaylarını animasyonlu değerlerle eşlemek için Animated.event() yöntemi kullanılır. Bunun için yapılandırılmış harita sözdizimi kullanılır.

Mevcut animasyon değerini okumak:
Bazen bir görünümün mevcut animasyon değerini okumamız gerekebilir. Ancak daha önce de açıkladığım gibi, bu durum değerini sürekli güncellemek gibi bir şey değil. Bu esas olarak yerel çalışma zamanında yapılır ve bu nedenle mevcut değeri izlemek zordur. Bunun için kullanabileceğimiz iki yol aşağıdadır:

spring.stopAnimation(callback): Animasyonu durdurur ve geri aramayı başlatır. Bu geri arama, nihai değeri tutacaktır.
spring.addListener(callback): Bu durumda, geri arama eşzamansız olarak çağrılacaktır. Geri arama ile animasyonun son bir değerini alacağız. Bu, animasyonun mevcut durumuna göre bir şey işliyorsak kullanışlıdır.

LayoutAnimation API:
LayoutAnimation, Animated API gibi pek çok özellik sağlamaz, ancak çoğu durumda kullanışlıdır. Temel olarak, görünümleri bir sonraki işlemede yeni konumlarına canlandıracaktır. Bu, flexbox mizanpaj güncellemeleri için ve ayrıca değişiklikler herhangi bir ata görünümünü etkiliyorsa kullanışlıdır. Normalde, bir durumdaki değerleri değiştirerek kullanırız.

Android’de, yalnızca aşağıdaki yapılandırmayı eklersek çalışacaktır:

UIManager.setLayoutAnimationEnabledExperimental &&
UIManager.setLayoutAnimationEnabledExperimental(true);
import * as React from 'react';
import {
  LayoutAnimation,
  Text,
  View,
  StatusBar,
  StyleSheet,
  Animated,
  NativeModules,
  Button
} from 'react-native';
const { UIManager } = NativeModules;
UIManager.setLayoutAnimationEnabledExperimental &&
  UIManager.setLayoutAnimationEnabledExperimental(true);
export default class App extends React.Component {
  
  state = {
    width: 0,
  };
  onClickButton = () => {
    LayoutAnimation.spring();
    this.setState({ width: this.state.width + 100 });
  };
  render() {
    return (
      <View style={{ paddingTop: 30, paddingLeft: 40 }}>
        <View
          style={{
            backgroundColor: 'blue',
            width: this.state.width,
            height: 50,
          }}
        />
        <Button onPress={this.onClickButton} title="Click me"/>
      </View>
    );
  }
}
LayoutAnimation.spring();

Sadece bir satır kod ekliyoruz ve bu da animasyonu görünüme ekliyor. Çok sayıda görünümümüz varsa, tüm görünümleri aynı anda canlandırmak için özellikleri durumda depolayabilir ve durumu “LayoutAnimation” kullanarak güncelleyebiliriz.

Hem “LayoutAnimation” hem de “Animated” api’ler bir uygulamada kullanışlıdır. Kullanım durumlarına bağlıdır. “Animated” oldukça güçlüdür ancak her türden animasyon için çok sayıda kod yazmayı içerir. Ancak animasyona daha fazla kontrol sağlar. “LayoutAnimation”, çok fazla kod yazmadan ve herhangi bir görünümü değiştirmeden yeniden oluşturma sırasında animasyon yapmak için harikadır. Görünüm özelliklerini state’de depolayın ve animasyonu yapmak için state’i değiştirin.

Makale, React Native Animation API’nin kitlelere hitap eden muhteşem bir uygulama geliştirmek için nasıl kullanılabileceğini açıkladı.

Lütfen bize görüşlerinizi bildirmekten çekinmeyin.

Kaynak: https://www.opencodez.com/