Yayınlanma tarihi: 28 Şubat 2014
Web geliştirmenin en iyi özelliklerinden biri, iş akışınızı iyileştirmek için kullanabileceğiniz zengin araç setidir.
Bu araçlardan biri olan Grunt, Sass derlemeden ve canlı sunucu başlatmaktan, resimleri sıkıştırmaya, JavaScript'i küçültmeye ve üretime hazır bir derleme oluşturmadan önce JSHint'i çalıştırmaya kadar web uygulamanızda gerçekleştirilecek görevleri tanımlamanıza olanak tanıyan bir JavaScript görev çalıştırıcısıdır.
Yeoman, web uygulamaları oluşturmaya, şablon oluşturmaya, Bower ve npm'den kitaplıklar getirmeye ve önceden tanımlanmış görevler içeren bir Grunt dosyası oluşturmaya yardımcı olan bir araçtır.
Bu eğitimde, yeni bir temel web uygulaması oluşturmak için Yeoman'ı kullanır, ardından web uygulamanızı oluşturmak için Android Studio derleme sistemini (Gradle) Grunt ile entegre edersiniz. Ayrıca, uygulamanızı tarayıcıda test etmek için yerel bir canlı yeniden yükleme sunucusu başlatacak Grunt görevleri de ayarlarsınız. Böylece, her HTML, CSS veya JavaScript dosyasını değiştirdiğinizde sayfayı manuel olarak yenilemeniz gerekmez.
Ön koşullar
Başlamadan önce birkaç ön koşulu yüklemeniz gerekir:
- Yeoman'ı yükleyin: https://github.com/yeoman/yeoman/wiki/Getting-Started
 - Android Studio'yu yükleyin: https://developer.android.com/sdk/installing/studio.html
 
1. Adım: Android Studio'da WebView içeren yeni proje oluşturma
Bununla ilgili tam talimatları başlangıç kılavuzunda bulabilirsiniz.
2. adım: Web uygulaması içeriği için bir alt dizin oluşturma
Projenizi oluşturduktan sonra yeni bir üst düzey dizin oluşturun. Android Studio'da proje klasörünü sağ tıklayın ve Yeni > Dizin'i seçin.
Dizini webapp olarak adlandırın.
3. Adım: Yeni dizininizde bir Yeoman projesi oluşturun
Terminalde cd projedeki webapp dizine gidin.
cd <path-to-project>/webapp/
Ardından Yeoman ile yeni bir web uygulaması oluşturun:
yo webapp
Proje seçeneklerini belirlemek için ekrandaki talimatları uygulayın. npm'nin makinenize nasıl yüklenmesine bağlı olarak sudo npm install komutunu çalıştırmanız gerekebilir.
Sonraki adıma geçmeden önce aşağıdaki komutu çalıştırarak uygulamayı test edin:
grunt server
Tarayıcınızda, Grunt tarafından başlatılan yerel bir sunucuya bağlanan yeni bir sekme açılır. Projedeki HTML, CSS veya JavaScript dosyalarından birini değiştirirseniz sayfa otomatik olarak yeniden yüklenir ve güncellenir.
grunt build komutunu çalıştırırsanız yeni bir dizin (dist) oluşturulur ve web uygulamanız sıkıştırılır, optimize edilir ve bu klasör içinde üretime hazır bir sürüme dönüştürülür.
4. Adım. Gradle derlemesini yapılandırma
webapp dizininizde build.gradle adlı yeni bir dosya oluşturun.
Yeni build.gradle dosyanıza aşağıdakileri ekleyin:
import org.apache.tools.ant.taskdefs.condition.Os
task buildWebApp(type: Exec) {
  executable = Os.isFamily(Os.FAMILY_WINDOWS) ? "grunt.cmd" : "grunt"
  args = ["build"]
}
Bu işlem, önceden tanımlanmış Exec türüne sahip buildWebApp adlı yeni bir görev oluşturur.
Ardından, Exec içindeki executable değişkenini geçerli işletim sistemine bağlı olarak ilgili grunt komutuna ayarlayın. args "build" olarak ayarlanır. Bu, grunt build'nin komut satırında çalıştırıldığı anlamına gelir. Son olarak, üstteki içe aktarma işlemi Os.isFamily(Os.FAMILY_WINDOWS)'ten yararlanır.
Bu yeni görevi kullanabilmemiz için projenin yeni build.gradle dosyasını bilmesi gerekir.
Kök dizinde settings.gradle dosyasını açın ve aşağıdaki satırı ekleyin:
include ':webapp'
5. Adım: Android uygulamasını oluştururken web uygulamanızı oluşturma
Web uygulamasını derleyin ve ardından uygulamayı Android uygulamamızın assets dizinine kopyalayın.
Aşağıdakileri Android uygulamaları build.gradle dosyasına kopyalayın:
task copyWebApplication(type: Copy) {
  from '../webapp/dist'
  into 'src/main/assets/www'
}
task deleteWebApplication(type: Delete) {
  delete 'src/main/assets/www'
}
copyWebApplication.dependsOn ':webapp:buildWebApp'
copyWebApplication.dependsOn deleteWebApplication
android.applicationVariants.all { variant ->
  tasks.getByPath(":${project.name}:assemble${variant.buildType.name.capitalize()}").dependsOn copyWebApplication
}
Bu işlemin her bir bölümünü inceleyelim.
görev copyWebApplication
task copyWebApplication(type: Copy) {
  from '../webapp/dist'
  into 'src/main/assets/www'
}
Bu Copy görevi, uygulamanızı webapp/dist dizininden kopyalar. Dosyaları src/main/assets/www'e kopyalamak istiyoruz. Bu görev, gerekli dizinlerden herhangi biri mevcut değilse gerekli dosya yapısını da oluşturur.
task deleteWebApplication
task deleteWebApplication(type: Delete) {
  delete 'src/main/assets/www'
}
Bu silme görevi, assets/www dizinindeki tüm dosyaları siler.
copyWebApplication.dependsOn
copyWebApplication.dependsOn ':webapp:buildWebApp'
copyWebApplication.dependsOn deleteWebApplication
Bu satırın ilk satırı, copyWebApplication'ün web uygulamamızın build.gradle dosyasında bulunan buildWebApp görevine bağımlı olduğunu belirtir.
İkinci satırda, deleteWebApplication görevine bağımlı olduğu belirtiliyor.
Diğer bir deyişle, assets dizinine herhangi bir dosya kopyalamadan önce web uygulamasını oluşturduğumuzdan ve assets dizininin mevcut içeriğini sildiğimizden emin olun.
android.applicationVariants.all
android.applicationVariants.all { variant ->
  tasks.getByPath(":${project.name}:assemble${variant.buildType.name.capitalize()}").dependsOn copyWebApplication
}
Bu görev, projenizin tüm derlemelerinin ve uygulamanızın her bir sürümünün bağımlılıklarını belirtir. Burada, copyWebApplication'un çalıştırılması için assemble görevlerine bağımlılık ayarlanır.
assemble görevleri, projenin çıktısını bir araya getirir. Bu nedenle, web uygulamasının önce Android projesine kopyalanması gerekir.
6. Adım: Her şeyin çalıştığından emin olma
Android Studio'da, Android uygulamaları src klasörünüzde assets dizini bulunmamalıdır.
Web Görünümü'nü index.html sayfasını kullanacak şekilde ayarlayın:
mWebView.loadUrl("file:///android_asset/www/index.html");
Çalıştır'ı tıklayın ve uygulamanızın derlenmesini bekleyin. www alt dizininde web uygulamanızın bulunduğu bir assets dizin göreceksiniz.
7. Adım: Canlı sunucu oluşturma ve canlı yeniden yükleme
Canlı yeniden yükleme, web uygulamalarınızda hızlıca değişiklik yapmak için oldukça yararlı olabilir. Bunu etkinleştirmek için uygulamanız için iki "ürün çeşidi" oluşturabilirsiniz: web içeriğinin Android uygulamasına paketlendiği canlı bir sunucu sürümü ve statik bir sürüm.
Android uygulamanızın build.gradle öğesinde android öğesinin sonuna aşağıdaki satırları ekleyin:
android {
  ...
  defaultConfig {
    ...
  }
  productFlavors {
    staticbuild {
      packageName "com.google.chrome.myapplication"
    }
    liveserver {
      packageName "com.google.chrome.myapplication.liveserver"
    }
  }
}
Gradle artık uygulamanızın canlı sunucu paket adıyla ve normal paket adınızla birer sürümü oluşturmanıza olanak tanır. İşlemin işe yarayıp yaramadığını kontrol etmek için Projeyi Gradle Dosyalarıyla Senkronize Et'i (Çalıştır düğmesinin yanındaki üst çubukta) tıklayın.
Ardından, Android Studio'nun sol alt köşesinde bulunan ve uygulamanızın hangi sürümlerini derleyebileceğinizi gösteren Derleme Varyantları'nı görüntüleyin.
Her productFlavor için Gradle'e yönelik Android eklentisinin varsayılan olarak sunduğu Hata Ayıklama ve Sürüm sürümleri vardır. Bu, derlemenin hata ayıklama derlemesi mi yoksa Play Store'da dağıtıma uygun bir sürüm derlemesi mi olacağını belirler.
Artık iki sürümünüz var ancak bu sürümler henüz farklı bir şey yapmıyor.
8. Adım. Canlı bir sunucudan yükleme
Artık uygulamanızı, hangi ürün çeşidini oluşturduğunuza bağlı olarak farklı bir URL yükleyecek şekilde yapılandırın.
Android uygulamanızda, tüm ürün türlerinde ortak olan dosyalar src/main içinde bulunur. Bir ürün çeşidine özel kod veya kaynak eklemek için src altında productFlavor ile aynı ada sahip başka bir dizin oluşturun. Bu derleme varyantı için derleme yaptığınızda Gradle ve Android eklentisi, bu ek dosyaları src/main içindeki dosyaların üzerine birleştirir.
URL'yi dize kaynağı olarak tanımlayın ve sabit kodlanmış bir URL yerine kodunuzda bu kaynağı kullanın.
src/liveservervesrc/staticbuildklasörlerini oluşturun.liveserverklasöründe,resadlı yeni bir klasör vevaluesadlı bir alt klasör oluşturun. Bu klasörün içindeconfig.xmladlı bir dosya oluşturun. Bu işlemistaticbuildklasörü için tekrarlayın.Yapılandırma dosyalarınızdaki
src/liveserver/res/values/config.xmlbölümüne aşağıdaki satırları ekleyin:<?xml version="1.0" encoding="utf-8"?> <resources> <string name="init_url">https://<Your Local Machine IP Address>:9000</string> </resources>src/staticbuild/res/values/config.xmlalanına aşağıdaki bloğu ekleyin:<?xml version="1.0" encoding="utf-8"?> <resources> <string name="init_url">file:///android_asset/www/index.html</string> </resources>WebView'inizi bu yapılandırma dosyalarındaki
init_urldeğerini kullanacak şekilde ayarlayın.mWebView.loadUrl(getString(R.string.init_url));liveserver/AndroidManifest.xmliçindeAndroidManifest.xmladlı yeni bir dosya oluşturun ve aşağıdaki satırları ekleyin:<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="https://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.INTERNET" /> </manifest>Bu işlem,
liveserverderlemeleri için internet iznini ekler.webapp/Gruntfile.jsiçinde şunları arayın:connect: { options: { port: 9000, livereload: 35729, // change this to '0.0.0.0' to access the server from outside hostname: **'localhost'** }, ... }Yerel sunucunuza yerel ağdan erişilebilmesi için
localhostdeğerini0.0.0.0ile değiştirin:connect: { options: { port: 9000, livereload: 35729, // change this to '0.0.0.0' to access the server from outside hostname: '**0.0.0.0'** }, ... }
Değişikliklerinizi test etmek için:
Canlı sunucuyu başlatın:
grunt serverAndroid Studio'da Derleme Varyantı bölümünde LiveserverDebug'ı seçin. Ardından Run'ı (Çalıştır) tıklayın.
HTML, CSS ve JavaScript içeriğinizi düzenleyebilir ve bu içeriğin tarayıcıya hemen yansıtıldığını görebilirsiniz.
Artık uygulamanızın iki sürümü var: Grunt sunucusundan canlı olarak yeniden yüklenen bir geliştirme sürümü ve Android uygulamasında yerel olarak paketlenmiş statik bir sürüm.