Data di pubblicazione: 28 febbraio 2014
Uno dei vantaggi dello sviluppo web è l'ampio set di strumenti che puoi utilizzare per migliorare il tuo flusso di lavoro.
Un esempio di uno di questi strumenti è Grunt, un task runner JavaScript che consente di definire le attività da eseguire sulla tua app web, dalla compilazione di Sass e dall'avvio di un server in tempo reale alla compressione delle immagini, alla minimizzazione di JavaScript e all'esecuzione di JSHint prima di creare una build pronta per la produzione.
Yeoman è uno strumento che aiuta a creare applicazioni web, generando boilerplate, importando librerie da Bower e npm e creando un file Grunt con attività predefinite.
In questo tutorial utilizzerai Yeoman per creare una nuova applicazione web di base, quindi integrerai il sistema di compilazione di Android Studio (Gradle) con Grunt per compilare la tua applicazione web. Configura anche le attività Grunt per avviare un server di ricarica dinamica locale per testare l'applicazione nel browser, in modo da non dover aggiornare manualmente la pagina ogni volta che modifichi un file HTML, CSS o JavaScript.
Prerequisiti
Prima di iniziare, devi installare alcuni prerequisiti:
- Installa Yeoman: https://github.com/yeoman/yeoman/wiki/Getting-Started
- Installa Android Studio: https://developer.android.com/sdk/installing/studio.html
Passaggio 1: Creare un nuovo progetto in Android Studio con una WebView
Puoi trovare istruzioni complete su come eseguire questa operazione nella guida introduttiva.
Passaggio 2: Crea una sottodirectory per i contenuti dell'app web
Dopo aver creato il progetto, crea una nuova directory di primo livello. In Android Studio, fai clic con il tasto destro del mouse sulla cartella del progetto e seleziona Nuovo > Directory.
Assegna alla directory il nome webapp
.
Passaggio 3: Crea un progetto Yeoman nella nuova directory
In un terminale, cd
alla directory webapp
nel progetto.
cd <path-to-project>/webapp/
Quindi crea una nuova app web con Yeoman:
yo webapp
Segui le istruzioni sullo schermo per selezionare le opzioni del progetto. Potresti dover eseguire
sudo npm install
, a seconda di come npm è installato sul tuo computer.
Prima di procedere con il passaggio successivo, testa l'app eseguendo il seguente comando:
grunt server
Nel browser dovrebbe aprirsi una nuova scheda che si connette a un server locale avviato da Grunt. Se modifichi uno dei file HTML, CSS o JavaScript del progetto, la pagina viene ricaricata e aggiornata automaticamente.
Se esegui grunt build
, viene creata una nuova directory, dist
, e la tua app web viene compressa, ottimizzata e trasformata in una versione pronta per la produzione all'interno di questa cartella.
Passaggio 4: Configura la compilazione Gradle
Nella directory webapp
, crea un nuovo file denominato build.gradle
.
Nel nuovo file build.gradle
, aggiungi quanto segue:
import org.apache.tools.ant.taskdefs.condition.Os
task buildWebApp(type: Exec) {
executable = Os.isFamily(Os.FAMILY_WINDOWS) ? "grunt.cmd" : "grunt"
args = ["build"]
}
Viene creata una nuova attività denominata buildWebApp
con un tipo predefinito Exec
.
Imposta quindi la variabile executable
in Exec
sul comando grunt pertinente, a seconda del sistema operativo corrente. args
sono impostati su "build"
, il che equivale a eseguire grunt build
sulla riga di comando. Infine, l'importazione in alto è
per utilizzare Os.isFamily(Os.FAMILY_WINDOWS)
.
Prima di poter utilizzare questa nuova attività, dobbiamo comunicare al progetto il nuovo
build.gradle
file.
Apri settings.gradle
nella directory principale e aggiungi la seguente riga:
include ':webapp'
Passaggio 5: Creare l'app web quando viene creata l'app per Android
Crea la build dell'app web e poi copiala nella directory assets
della nostra app per Android.
Copia quanto segue nel file build.gradle
delle app per Android:
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
}
Esaminiamo ogni parte.
task copyWebApplication
task copyWebApplication(type: Copy) {
from '../webapp/dist'
into 'src/main/assets/www'
}
Questa attività Copy
copia l'applicazione dalla directory webapp/dist
. Vogliamo copiare i file in src/main/assets/www
. Questa operazione crea anche la struttura di file necessaria se una delle directory richieste non esiste.
task deleteWebApplication
task deleteWebApplication(type: Delete) {
delete 'src/main/assets/www'
}
Questa attività di eliminazione elimina tutti i file nella directory assets/www
.
copyWebApplication.dependsOn
copyWebApplication.dependsOn ':webapp:buildWebApp'
copyWebApplication.dependsOn deleteWebApplication
La prima riga indica che copyWebApplication
ha una dipendenza dall'attività buildWebApp
del file build.gradle
della nostra app web.
La seconda riga indica che esiste una dipendenza dall'attività deleteWebApplication
.
In altre parole, prima di copiare effettivamente i file nella directory assets
, assicurati di compilare l'app web ed eliminare anche i contenuti attuali della directory assets
.
android.applicationVariants.all
android.applicationVariants.all { variant ->
tasks.getByPath(":${project.name}:assemble${variant.buildType.name.capitalize()}").dependsOn copyWebApplication
}
Questa attività specifica le dipendenze per tutte le build del progetto, per ogni versione dell'app.
Qui imposta una dipendenza sulle attività assemble
da eseguire copyWebApplication
.
Le attività assemble
assemblano l'output del progetto, quindi l'app web deve prima essere copiata nel progetto Android.
Passaggio 6: Verificare che tutto funzioni
In Android Studio, non deve essere presente alcuna directory assets
nella cartella src
delle applicazioni Android.
Imposta WebView in modo che utilizzi la pagina index.html
:
mWebView.loadUrl("file:///android_asset/www/index.html");
Fai clic su Esegui e lascia che l'applicazione venga compilata. Nella sottodirectory www
dovresti vedere una directory assets
con la tua applicazione web.
Passaggio 7: Creare un server live e il ricaricamento in tempo reale
Il ricaricamento in tempo reale può essere molto utile per apportare modifiche rapide alle applicazioni web. Per abilitare questa funzionalità, puoi creare due "versioni del prodotto" per la tua app: una versione del server in tempo reale e una versione statica, in cui i contenuti web vengono pacchettizzati nell'applicazione Android.
In build.gradle
dell'app per Android, aggiungi le seguenti righe alla fine
dell'elemento android
:
android {
...
defaultConfig {
...
}
productFlavors {
staticbuild {
packageName "com.google.chrome.myapplication"
}
liveserver {
packageName "com.google.chrome.myapplication.liveserver"
}
}
}
Ora Gradle ti offre la possibilità di creare una versione della tua app con un nome di pacchetto liveserver e una con il nome di pacchetto normale. Per verificare se la procedura è andata a buon fine, fai clic su Sincronizza progetto con i file Gradle (nella barra in alto accanto al pulsante Esegui).
Poi, visualizza le Varianti di build nell'angolo in basso a sinistra di Android Studio, che ti mostrano essenzialmente le versioni dell'app che puoi creare.
Per ogni productFlavor
sono disponibili le versioni Debug e Release, che il plug-in Android per Gradle fornisce per impostazione predefinita. Questo determina se la build deve essere una build di debug o una release adatta al deployment sul Play Store.
Ora hai due versioni, ma non fanno ancora nulla di diverso.
Passaggio 8: Caricamento da un server attivo
Ora configura l'applicazione in modo che carichi un URL diverso a seconda della versione del prodotto che stai creando.
Nell'applicazione Android, i file comuni a tutti i tipi di prodotto si trovano in
src/main
. Per aggiungere codice o risorse specifiche per una versione del prodotto, crea un'altra directory in src
con lo stesso nome di productFlavor
. Quando effettui la compilazione per la variante di build, Gradle e il plug-in Android uniscono questi file aggiuntivi a quelli in src/main
.
Definisci l'URL come risorsa stringa e utilizzala nel codice anziché un URL hardcoded.
Crea le cartelle
src/liveserver
esrc/staticbuild
.Nella cartella
liveserver
, crea una nuova cartella denominatares
con una sottocartella denominatavalues
. Al suo interno, crea un file denominatoconfig.xml
. Ripeti questa procedura per la cartellastaticbuild
.All'interno dei file di configurazione, aggiungi le seguenti righe a
src/liveserver/res/values/config.xml
:<?xml version="1.0" encoding="utf-8"?> <resources> <string name="init_url">https://<Your Local Machine IP Address>:9000</string> </resources>
Aggiungi il seguente blocco a
src/staticbuild/res/values/config.xml
:<?xml version="1.0" encoding="utf-8"?> <resources> <string name="init_url">file:///android_asset/www/index.html</string> </resources>
Imposta WebView in modo che utilizzi
init_url
da questi file di configurazione.mWebView.loadUrl(getString(R.string.init_url));
Crea un nuovo file denominato
AndroidManifest.xml
inliveserver/AndroidManifest.xml
e aggiungi le seguenti righe:<?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>
Viene aggiunta l'autorizzazione di accesso a internet per le build di
liveserver
.In
webapp/Gruntfile.js
, cerca:connect: { options: { port: 9000, livereload: 35729, // change this to '0.0.0.0' to access the server from outside hostname: **'localhost'** }, ... }
Sostituisci
localhost
con0.0.0.0
in modo che il server locale sia accessibile dalla rete locale:connect: { options: { port: 9000, livereload: 35729, // change this to '0.0.0.0' to access the server from outside hostname: '**0.0.0.0'** }, ... }
Per testare le modifiche:
Avvia il server live:
grunt server
In Android Studio, seleziona LiveserverDebug nella selezione Variante di build. Fai clic su Esegui.
Dovresti essere in grado di modificare i contenuti HTML, CSS e JavaScript e visualizzarli immediatamente nel browser.
Ora hai due versioni dell'applicazione: una versione di sviluppo con il ricaricamento in tempo reale dal server Grunt e una versione statica, pacchettizzata localmente nell'app Android.