Projemizi tamamladık ve düzgün bir şekilde çalıştığını gördük, dolayısıyla artık kullanıcılarımızı uygulamamızla buluşturabiliriz. Ancak öncelikle yapmamız gereken bazı düzenlemeler var.
İlk iş olarak projemizin ismini ve logosunu düzenleyeceğiz. Şu anda uygulamamız cihazda aşağıdaki gibi görünüyor.
Varsayılan logo olarak Flutter logosunu, varsayılan uygulama ismi olarak da proje ismi olan, küçük harflerle “ulkeler” kelimesini görüyoruz.
Uygulama İsmini Değiştirme
İlk önce uygulama ismini “Dünya Ülkeleri” olarak değiştirelim.
“android/app/src/main/AndroidManifest.xml” dosyasını açıyoruz. Dosya yolunu aşağıdaki resimde de görebilirsiniz.
Dosyayı açtığımızda sanki hata vermiş gibi bazı satırlar kırmızı renkte gözükebilir, bu durumu görmezden gelebiliriz, dosyada herhangi bir hata yok. Dosyanın üst kısmında “android:label” şeklinde bir ifade göreceğiz. Karşısında da tırnak işaretleri içinde “ulkeler” yazıyor. Android cihazlarda görünen uygulama ismi tam olarak bu kısımdır.
Şimdi bu “label”ı “Dünya Ülkeleri” olarak ya da uygulamamıza ne isim vermek istiyorsak onunla değiştirelim. Burada “ü” gibi Türkçe karakterleri kullanmanızda hiçbir sorun yoktur.
İşlem bu kadar. Uygulamayı emülatörden silip tekrar yüklediğimizde yeni ismiyle yüklenecektir.
Uygulama Logosunu Değiştirme
Sıra logoyu değiştirmeye geldi. Logo olarak internetten bulduğumuz aşağıdaki telifsiz görseli kullanacağız. Siz de istediğiniz bir görseli kullanabilirsiniz.
Şimdi bu görseli her zamanki gibi “assets” klasörü oluşturup içine atalım ve “pubspec.yaml” dosyasına kaydedelim. Dosya ismine “logo” diyeceğiz.
“pubspec.yaml” dosyasını güncellemeden önce bir işlem daha yapacağız. Normalde hem Android hem de iOS uygulamalara logo olarak sadece bir resim değil, farklı ekran boyutlarındaki cihazlar için aynı resmin farklı boyutlarda oluşturulmuş hallerini eklememiz gerekir. Ancak biz bu resimleri tek tek eklemek yerine, Flutter topluluğu tarafından geliştirilen “flutter_launcher_icons” paketini kullanacağız. Bu paket, “assets” klasörüne eklediğimiz tek bir resimden hem Android hem de iOS için gerekli olan tüm boyutlardaki dosyaları otomatik olarak üretiyor. Öncelikle paketimizi “pubspec.yaml” dosyasına ekleyelim.
Bu kez paketi “dependencies” kısmına değil “dev_dependencies” kısmına ekledik. “dependencies” kısmına eklesek de çalışırdı ama bu kısımdaki paketler, kullanıcıya sunacağımız proje dosyalarına dahil ediliyor. Biz “flutter_launcher_icons” paketinin proje dosyalarına dahil olup boşuna yer kaplamasını istemiyoruz. Çünkü bu paketi logoları üretmek için bir kez kullanacağız ve paketin işi bitecek. Ancak “http” gibi paketler öyle değildir, kullanıcı internetten her veri çektiğinde “http” paketini kullanıyor olacaktır. “flutter_launcher_icons” gibi sadece geliştiricinin işine yarayan paketler tercihen “dev_dependencies” kısmına eklenir. “flutter_launcher_icons” kelimesinin baş harfinin üstteki “flutter_test” kelimesinin baş harfiyle aynı hizada olmasına dikkat edelim.
“pubspec.yaml” dosyasıyla işimiz bitmedi, şimdi “flutter_launcher_icons” paketiyle ilgili ayarlamaları yapacağız. Aşağıdaki satırları resimde gösterildiği gibi “pubspec.yaml” dosyasına ekliyoruz.
flutter_icons: android: "launcher_icon" ios: true image_path: "assets/logo.png"
Tabii ki her zaman olduğu gibi boşluklara çok dikkat ediyoruz. “flutter_icons” satırının başında hiç boşluk olmayacak, “android”, “ios” ve “image_path” satırlarının başında ise ikişer boşluk olacaktır. “image_path” parametresine az önce “assets” klasörüne kopyaladığımız resmin dosya yolunu veriyoruz. Şimdi “Pub get” ile dosyada yaptığımız değişikliklerin projeye yansımasını sağlayabiliriz.
“flutter_launcher_icons” paketinin logo dosyalarını oluşturması için yapacağımız son bir işlem kaldı. Android Studio’nun alt kısmındaki “Terminal” sekmesini aşağıdaki gibi açıyoruz ve şu komutu çalıştırıyoruz: “flutter pub run flutter_launcher_icons:main”
Eğer paket sorunsuz bir şekilde yüklendiyse ve resim sorunsuz bir şekilde projeye dahil edildiyse, paket bize aşağıdaki resimde olduğu gibi logo dosyalarının sorunsuz bir şekilde oluşturulduğunu söyleyecektir.
Logo değiştirme işlemimizi de tamamlamış olduk. Uygulamayı emülatörden silip projeyi tekrar çalıştırdığımızda, uygulama aşağıdaki gibi yeni logoyla yüklenecektir.
Keystore Dosyası Oluşturma
Keystore dosyası uygulamamızın imzasıdır. Bu dosyayı oluştururken ad, soyad, şirket, adres, vs. gibi bilgileri girerek oluştururuz. Ardından, bu dosyayla imzalanmış bir apk veya aab (yükleme dosyası) oluştururuz. Böylece markete yüklediğimiz uygulama bizim bilgilerimizi ve bilgisayarımızın eşsiz anahtarını kullanarak imzalanmış olur. Şimdi bu dosyayı nasıl oluşturacağımıza bakalım.
Öncelikle bilgisayarımızda “JDK (Java Development Kit)”in yüklü olduğu dizine gidiyoruz ve “bin” klasörü içinden terminal çalıştırıyoruz. Biz işlemlerimizi Windows üzerinde yapacağız, diğer işletim sistemlerinde de aynı şekilde “JDK” dizinine gidip bir terminal çalıştırabilirsiniz. Terminalde, aşağıdaki resimde görüldüğü gibi şu komutu düzenleyerek çalıştırıyoruz:
keytool -genkey -v -keystore c:\Users\USER_NAME\key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key
Resme bakarsanız, komutta sadece iki yeri değiştirdiğimizi görebilirsiniz. Birincisi “c:\Users\USER_NAME\key.jks” kısmıdır. Bu kısım, anahtarı oluşturacağımız dosya yoludur ve “key.jks” kısmı da anahtar dosyasının ismidir. Biz bu ismi “ulkeler_key.jks” olarak değiştirdik.
Değiştirdiğimiz diğer kısım, en sondaki “-alias” ifadesinden sonra gelen kısımdır. Bu kısım dosyayı kullanabilmek için bilinmesi gereken önemli kısımlardan biridir. Şöyle düşünebiliriz, dosyayı kullanmak için kullanıcı adı ve şifre bilgisine ihtiyacımız vardır ve bu kısım kullanıcı adı bilgisidir. Orijinal komutta “key” yazıyordu, biz “flutter” olarak değiştirdik. Bu değeri mutlaka bir yere not etmeyi unutmuyoruz.
“Enter” ile komutu çalıştırabiliriz. Komutu çalıştırdığımız anda karşımıza arka arkaya sorular gelecektir. Bu soruları adım adım inceleyelim. Soruların cevaplarında Türkçe karakter kullamamaya dikkat edeceğiz.
Enter keystore password: Dosyayı kullanmak için kullanıcı adı ve parola gerekli demiştik. Bu adım parolayı girdiğimiz adımdır. Siz yazarken burada hiçbir şey gözükmez, o yüzden “yazılmıyor” diye düşünebilirsiniz ama girdiğiniz karakterler aslında yazılıyor, aklınızda olsun. Bu parola bilgisini de mutlaka bir yere not edelim.
Re-enter new password: Az önce girdiğimiz parolayı tekrar giriyoruz.
What is your first and last name?: Adımızı ve soyadımızı giriyoruz. Eğer bir bilgi girmeden “Enter”a basarsak varsayılan olarak “Unknown” değerini alır.
What is the name of your organizational unit?: Şirketteki birimimiz soruluyor. Örneğin, “Bilgi teknolojileri” için basitça “IT” yazıp geçebiliriz. Boş bırakırsak yine “Unknown” değerini alır.
What is the name of your organization?: Şirketimizin ismi soruluyor. Uygulamayı bir şirket üzerine kaydetmiyorsak uygulama sahibinin adını ve soyadını girebiliriz. Boş bırakırsak “Unknown” değerini alır.
What is the name of your City or Locality?: Semt veya ilçe soruluyor. Şirketimizin bulunduğu semti girebiliriz.
What is the name of your State or Province?: Eyalet veya şehir soruluyor. Şirketimizin bulunduğu şehri girebiliriz.
What is the two-letter country code for this unit?: Ülkemizin iki harfli kodu soruluyor. Türkiye için TR harflerini giriyoruz.
En sonunda girdiğimiz tüm bilgiler bize gösterilecek ve onaylayıp onaylamadığımız sorulacaktır. Buraya elle “yes” yazıp “Enter”a basarak onaylıyoruz. Ardından bir kez daha şifre istenecektir. Bir önceki şifre dosyanın genel şifresiydi. Bu kez oluşturduğumuz kullanıcı adı (alias) için bir şifre tanımlayacağız. Eğer “Enter keystore password” kısmındaki şifrenin, yani dosya şifresinin aynısını kullanmak istiyorsanız hiçbir şey yazmadan “Enter”a basabilirsiniz, biz öyle yapacağız.
“keystore” dosyamız oluşturuldu. Tüm adımları aşağıda görebilirsiniz.
Keystore Dosyasını Uygulamaya Tanıtma
Şimdi oluşturduğumuz anahtar (keystore) dosyasını uygulamamıza tanıtacağız. Bunu yapmak için “android” klasörü üzerine sağ tıklıyoruz ve “New -> File” seçeneğini seçiyoruz.
Dosya ismine “key.properties” yazıyoruz ve “Enter”a tıklıyoruz.
Aşağıdaki gibi “android” klasörü içinde “key.properties” isminde bir dosya oluşacaktır.
Dosyayı açıyoruz ve aşağıdaki satırları içine ekliyoruz.
storePassword=ulkeler123 keyPassword=ulkeler123 keyAlias=flutter storeFile=D:/FlutterProjeleri/ulkeler_key.jks
“storePassword” dosyanın şifresi, “keyPassword” ise o kullanıcıya (alias) ait şifredir. Biz ikisine de aynı değeri vermiştik. “keyAlias” ise “flutter” olarak belirlediğimiz kullanıcı adıdır. Son olarak “storeFile” parametresine de dosya yolunu veriyoruz ve “key.properties” dosyasıyla işimiz bitiyor. Dosyanın son halinin görseli aşağıdadır:
Şimdi “gradle” dosyasında bazı düzenlemeler yapacağız. “app” klasörü içindeki “build.gradle” dosyasını açıyoruz. Ancak dikkat edelim, Android projelerinde iki adet “build.gradle” dosyası bulunur. Biz “app” klasörü içindekini açıyoruz. Yani aşağıdaki görselde üzerini çizdiğimiz dosyayı değil, daire içine aldığımız dosyayı açıyoruz.
İlk olarak, “android” bloğu üzerine şu kodları yapıştırıyoruz:
def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) }
Ardından, mevcut “buildTypes” bloğunu silip onun yerine şu kodları yapıştırıyoruz:
signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] } } buildTypes { release { signingConfig signingConfigs.release } }
Hepsi bu kadar, nihayet tüm düzenlemelerimizi tamamladık.
Apk ve App Bundle (aab) Oluşturma
Flutter projelerinden Android için iki türlü çıktı alabiliriz. Birinci çıktı türü, yani çıktı alabileceğimiz birinci dosya tipi apk dosyalarıdır. Eskiden sadece apk dosyaları kullanılıyordu. Bu dosyaları Play Store’a veya App Gallery gibi farklı uygulama marketlerine yükleyebiliriz. İstersek bu dosyayı “Android” cihazımıza kopyalayıp uygulamayı markete yüklemeden doğrudan Android cihazımıza da yükleyebiliriz.
Çıktı alabileceğimiz bir diğer dosya türü aab (App Bundle) dosyasıdır. Bu dosya türü Google’ın sonradan çıkardığı bir dosya türüdür ve sadece uygulamayı Play Store’a yüklemek için kullanılır. Bu dosya türünü diğer uygulama marketlerine veya Android cihazlara yükleyemezsiniz. App Bundle’ın avantajı şudur: Play Store bu dosyayı her Android cihaza ihtiyaç olduğu kadar dosyayı yükleyecek şekilde ayrıştırır. Bu sayede uygulamalar telefonda daha az yer kaplar. Ek olarak, “developer.android.com/guide/app-bundle” sitesindeki dökümana göre 2021’in ikinci yarısından itibaren Play Store sadece App Bundle (aab) dosyalarını kabul edecektir, apk dosyalarını artık kabul etmeyecektir.
Biz iki dosya türü için de çıktı alacağız. Play Store’a aab dosyasını yükleyeceğiz ama istediğimiz zaman diğer uygulama marketlerine yükleyebilmemiz için apk dosyasını da elimizin altında hazır tutacağız. İlk olarak apk dosyasını oluşturalım.
Terminali açıyoruz ve şu komutu çalıştırıyoruz: “flutter build apk –release”. Tüm kodlar derlenip paketleneceği için bu işlem biraz uzun sürebilir.
Resimde görüldüğü gibi Android Studio apk‘yı oluşturdu ama bize apk yerine app bundle kullanmayı önermeyi de ihmal etmedi.
Android Studio’nun önerisine uyalım ve app bundle (aab) da oluşturalım. Yine benzer bir komut çalıştıracağız: “flutter build appbundle –release”
App Bundle (aab) dosyamız da başarıyla oluşturuldu. Bu kez herhangi bir ek tavsiyeyle karşılaşmadık.
Oluşturulan apk dosyasını “build/app/outputs/flutter-apk/app-release.apk” dizininde, App Bundle dosyasını ise “build/app/outputs/bundle/release/app-release.aab” dizininde bulabiliriz.
Bizi bir miktar uğraştırsa da en sonunda yükleme dosyamızı başarıyla elde ettik. Artık uygulamamızı Play Store’a yükleyebiliriz.