Merhaba,
Bu yazımda Google’ın Build Your First Instant App Codelab‘i üzerinden gidip, adım adım labı uygulayacağım. Amacım codelabi uygularken sorun yaşarsanız, 2. bir kaynak yaratmış olmak 🙂 Eğer daha önce yazdığım, Android Instant App’e Genel Bakış ve Google Play Instant yazılarını okuyup basitçe bir instant app support eden uygulama create etmeye çalıştıysanız şu an ortamınız hazır olmalı. Değilse adım adım giderek ilk önce ortamınızı hazırlamamız gerekmekte.
Geliştirme ortamı hazır olduktan sonra https://git@github.com/googlecodelabs/android-topeka.git adresinden bu codelab için gerekli sample’ı indirmemiz gerekmekte. Sample app’in adı Topeka. Eğlenceli bir quiz uygulaması.
Topeka, Smart Lock API’ı kullandığı için, eğer emülatörde uygulamayı run edecek Google Play’li bir emülatör başlatmamız gerekli. Şimdi uygulamızı run edip, inceleyebiliriz.
Code’labi tamamladığımızda uygulamamız tek feature’lı bir modülü tasarladığımız için, base feature modül, bu modülü instant app ve installable app’ler için build eden ve kod içermeyen birer modül daha içermiş olacak.
Yapacağımız ilk aksiyon codelab’in 5. step’inde. Tüm uygulama kodu base feature’ımıza taşıyacağız ve feature mudülü build edecek application modülü ayıracağız.
İlk olarak uygulamayı ‘app’ den ‘base’ e rename ediyoruz.
Artık bu feature modül olacağı için ilk önce gidip build.gradle dosyasından plugin tipini değiştirip ‘com.android.feature’ yapmamız gerekiyor.
apply plugin: 'com.android.feature'
Yine aynı şekilde artık bu modül app kendisi olmadığı için de appId’yi silmemiz gerekmekte. (applicationId “com.google.samples.apps.topeka”)
Ve de son olarak build.gradle’da bu feature modülün base feature olduğunu belirtmemiz gerekiyor.
android { ... baseFeature = true ... }
Gradle’ı sync etmemizle beraber artık feature modülümüz hazır. Sıra installed modül’de.
İlk once File->New->New Module diyerek Instantalled app’imiz için modülü yaratıyoruz.
Application name olarak ‘Topeka Installed’, modül name olarak da ‘installed’ seçebiliriz.
Ardından açılacak olan ekranda ‘Add No Activity’ seçeneğiyle ilerlemeliyiz. ApplicationId’yi de installed modülünün build.gradle dosyasına eklememiz gerekiyor.
defaultConfig { applicationId "com.google.samples.apps.topeka" ... }
Şimdi base feature modülümüz ve installed modülümüz elimizde. Sırada installed modülünün feature modülü build edecek konfigürasyonu eklemek geliyor.
installed modülünü build.gradle dosyasına aşağıdaki satırı eklememiz yeterli.
dependencies { implementation project (':base') ... }
installed modülün AndroidManifest.xml dosyasından application kaldırmalıyız. Sadece package name kalmalı.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.samples.apps.topeka"> </manifest>
Multiple manifest aynı package name’le desteklenmediği için base feature modülün package name’ini aşağıdaki gibi değiştirmemiz gerekiyor.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.google.samples.apps.topeka.base"> ... </manifest>
package name’i değiştirdik, ama fiziksel olarak dosyalar hala eski konumundalar. Base feature modülün manifest dosyası dolayısıyla hatalar verdi. Bu nokta gidip hepsine full package name vermemiz gerekiyor.
Eskisi:
<activity android:name=".activity.SignInActivity" android:theme="@style/Topeka.SignInActivity" android:windowSoftInputMode="adjustPan"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
Yenisi:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.google.samples.apps.topeka.base"> <application android:allowBackup="false" android:fullBackupContent="false" android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="false" android:theme="@style/Topeka" tools:ignore="GoogleAppIndexingWarning,UnusedAttribute" > <activity android:name="com.google.samples.apps.topeka.activity. SignInActivity" android:theme="@style/Topeka.SignInActivity" android:windowSoftInputMode="adjustPan"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER " /> </intent-filter> </activity> <activity android:name="com.google.samples.apps.topeka.activity. CategorySelectionActivity" android:theme="@style/Topeka.CategorySelectionActivity " /> <activity android:name="com.google.samples.apps.topeka.activity. QuizActivity" android:launchMode="singleTop" android:windowSoftInputMode="adjustPan" android:theme="@style/Topeka.QuizActivity"/> </application> </manifest>
Tabi sadece Manifest’de değiştirerek tüm hataları çözmüş olmadık. R.java dosyası da package name altına generate edildiği için, rename yaparak bunları da çözmemiz gerekiyor. İlave olarakcom.google.samples.apps.topeka.databinding package name’i kızmaya başlayacak, bunun da aynı şekilde değiştirilmesi gerekmekte.
Sonunda base fature modülümüzü build edecek installed app’imiz hazır. Gradle sync yapıp, aşağıdaki görseldeki gibi build APK(s) seçeneğine tıkladığımızda, generation tamamlandığında project perspektifi seçiliyken apk’ımızı görebiliriz.
Böylece ilk stepi tamamlamış olduk. Uygulamayı run ettiğimizde, ilk açıldığıyla birebir aynı fonksiyonelitede ama feature içerisine taşınmış kodu çalıştırıyoruz. Sırada instant app modülü var.
Yine installed modülü yaratırken ki gibi File->New->New Modülü path’ini izleyeceğiz ancak bu sefer aşağıdaki gibi instant app modülü seçeceğiz.
Library name’i lab’daki gibi ‘instant’ vererek ilerleyebiliriz.
instant modülün gradle dosyasında plugin bu sefer instantapp olarak geldi.
apply plugin: 'com.android.instantapp'
Yine ‘installed’ modülündeki gibi ‘instant’ modülünde de base’deki kodun modül tarafından build edilebilmesi için, ilgili build.gradle dosyasında dependency olarak aynı şekilde eklememiz, gradle sync yapmamız gerekmekte.
Şimdiye kadar herşey ‘installed’ ve ‘instant’ modüllerinde çok benzerdi. Ancak installable modülün url aracılığıyla da erişebiliyor olması gerekiyor. Bu noktada App Link Assistant imdadımıza koşacak.
App Link Assistant’da URL Mapping Editor’u açmamız gerekmekte. Sonrasında + ya basarak url girişini yapacağız. SigninActivity’ye url mapping tanımlayacağız.
Mapping tanımı sonrası AndroidManifest dosyasında activity tanımında eklenen inter-filterda görebiliriz.
<activity android:name="com.google.samples.apps.topeka.activity.SignInActivity" android:theme="@style/Topeka.SignInActivity" android:windowSoftInputMode="adjustPan"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="topeka.instantappsample.com" android:pathPattern="/signin" /> </intent-filter> </activity>
Editörden aynısının bir de httpsli versiyonunu ekliyoruz. Aynı adımları Categories SelectionActivity ve QuizSelectionActivity için de yapacağız. Böylece toplamda 6 farklı url mapping yapılmış olacak.
- http://topeka.samples.androidinstantapps.com/categories to
CategorySelectionActivity
- http://topeka.samples.androidinstantapps.com/quiz to
QuizActivity
Bir de bir adet default url tanımlamamız gerekmekte böylece, instant her açılışında ilk bu url’den geçebilir.
<meta-data android:name="default-url"
android:value="https://topeka.instantappsample.com/signin" />
Artık hazırız. Instant-App’imizi run etmek için son bir düzenleme gerekli.
Aşağıdaki gibi instant seçiliyken run konfigürasyonunda instant-app’in url ini de vermemiz gerekiyor. Sonrasında instant app’i run edebiliriz.
Böylece codelabi tamamlamış ve varolan bir uygulamanın tüm codebase’ini instant app’e geçirmiş olduk.
Leave a Reply