Migrazione di progetti Android a Cloud Endpoints Frameworks 2.0

Questa pagina descrive la migrazione di un'app Android Cloud Endpoints 1.0 esistente a Endpoints Frameworks per App Engine. Tieni presente che in questa pagina la versione 1.0 di Endpoints è indicata come Endpoints Frameworks 1.0 e la nuova versione di Endpoints Frameworks per App Engine come Endpoints Frameworks 2.0.

Vantaggi

Il nuovo framework offre una serie di vantaggi, tra cui:

  • Latenza delle richieste ridotta
  • Migliore integrazione con le funzionalità di App Engine, come i domini personalizzati.
  • Assistenza ufficiale per le configurazioni Guice
  • (Facoltativo) Nuove funzionalità di gestione delle API

La versione 2.0 di Endpoints Frameworks non influisce sulle interfacce della tua API. I client esistenti continuano a funzionare dopo la migrazione senza alcuna modifica al codice lato client.

Migrazione di progetti multi-modulo Android alla versione 2.0 di Endpoints Frameworks

I passaggi che seguono ti guidano nella migrazione dei progetti Android Studio Endpoints Frameworks versione 1.0 alla versione 2.0 di Endpoints Frameworks. La guida esegue la migrazione di un progetto Android Studio con un modulo Endpoints.

Elenco attività

Utilizza il seguente elenco di attività di alto livello man mano che consulti la guida alla migrazione. Questa guida alla migrazione presuppone che tu abbia già un progetto Android che utilizza un modulo Google Cloud.

  1. Prima di iniziare.
  2. Configura Google Cloud CLI.
  3. (Facoltativo) Scarica il codice campione.
  4. Esegui la migrazione alla versione 2.0 di Endpoints Frameworks.
  5. Esegui il deployment del modulo di backend.
  6. Genera librerie client.

Prima di iniziare

  1. Installa Android Studio.
  2. Installa Android SDK 26 o versioni successive.
  3. Installa la gcloud CLI.

Configurare l'interfaccia a riga di comando gcloud

Per configurare gcloud CLI:

  1. Inizializza la gcloud CLI:

     gcloud init
    
  2. Utilizza le credenziali predefinite dell'applicazione:

     gcloud auth application-default login
    
  3. Installa il componente app-engine-java:

     gcloud components install app-engine-java
    

(Facoltativo) Scarica il codice campione

Per clonare i progetti di esempio legacy e v2 da GitHub:

  1. Clona il repository di esempio sulla tua macchina locale:

     git clone https://github.com/GoogleCloudPlatform/android-docs-samples
    
  2. Passa alla directory contenente il codice campione per legacy e v2:

     cd android-docs-samples/endpoints-frameworks/
    

Esegui la migrazione alla versione 2.0 di Endpoints Frameworks

Aggiorna il file build.gradle

Le dipendenze di Endpoints Frameworks versione 2.0 utilizzano Guava 19 e il plug-in di compilazione Gradle per Android com.android.tools.build:gradle:2.3.3 utilizza Guava 18. Aggiungi Guava 19 alla chiusura delle dipendenze dello script di compilazione del build.gradle per override questa dipendenza transitiva.

Legacy

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
    }
}

v2

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // V2: Include this dependency when using Endpoints Framework v2
        classpath 'com.google.guava:guava:19.0'

        classpath 'com.android.tools.build:gradle:2.3.3'
    }
}

Aggiorna il file app/build.gradle

Nella versione 1.0 di Endpoints, hai utilizzato il plug-in Gradle,gradle-appengine-plugin, per generare un documento di scoperta API. In Endpoints Frameworks versione 2.0, utilizzi endpoints-framework-gradle-plugin per generare un documento di rilevamento.

Questo script di compilazione utilizza il plug-in lato client com.google.cloud.tools.endpoints-framework-client.

Legacy

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.1'
    defaultConfig {
        applicationId 'com.example.migration.endpoints.app'
        minSdkVersion 25
        targetSdkVersion 26
        versionCode 1
        versionName '1.0'
        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    configurations.all {
        resolutionStrategy.force 'com.google.code.findbugs:jsr305:2.0.1'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // androidTestCompile compiles instrumentation tests written using Espresso
    // used by Firebase Test Lab
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.1'
    compile 'com.google.code.findbugs:jsr305:2.0.1'
    compile 'com.google.http-client:google-http-client-android:1.22.0'
    compile 'com.google.api-client:google-api-client:+'
    testCompile 'junit:junit:4.12'

    // LEGACY: Legacy compile :backend project
    compile project(path: ':backend', configuration: 'android-endpoints')
}

v2

apply plugin: 'com.android.application'

// V2: Apply the new Endpoints Framework client plugin
apply plugin: 'com.google.cloud.tools.endpoints-framework-client'

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // V2: Add the new Endpoints Framework plugin dependencies
        classpath 'com.google.cloud.tools:endpoints-framework-gradle-plugin:1.0.2'
    }
}

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.1'
    defaultConfig {
        applicationId 'com.example.migration.endpoints.app'
        minSdkVersion 25
        targetSdkVersion 26
        versionCode 1
        versionName '1.0'
        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    configurations.all {
        resolutionStrategy.force 'com.google.code.findbugs:jsr305:2.0.1'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // androidTestCompile compiles instrumentation tests written using Espresso
    // used by Firebase Test Lab
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.1'
    compile 'com.google.code.findbugs:jsr305:2.0.1'
    testCompile 'junit:junit:4.12'

    // V2: Endpoints Framework v2 migration
    endpointsServer project(path: ':backend', configuration: 'endpoints')
    compile 'com.google.api-client:google-api-client:+'
    compile 'com.google.http-client:google-http-client-android:1.22.0'
}

Aggiorna il file backend/build.gradle

Gli strumenti Gradle per l'ambiente standard di App Engine sono stati aggiornati. I progetti Endpoints Frameworks 1.0 utilizzavano gradle-appengine-plugin in com.google.appengine, mentre i progetti Endpoints Frameworks 2.0 utilizzano appengine-gradle-plugin.

Questo script di compilazione utilizza il plug-in lato server com.google.cloud.tools.endpoints-framework-server.

Legacy

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // LEGACY: Deprecated App Engine plugin dependency
        classpath 'com.google.appengine:gradle-appengine-plugin:1.9.59'
    }
}

repositories {
    jcenter();
}

apply plugin: 'java'
apply plugin: 'war'

// LEGACY: Deprecated Apply App Engine plugin dependency
apply plugin: 'appengine'

sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7

dependencies {
    // LEGACY: Deprecated App Engine plugin dependency
    appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.59'

    // LEGACY: Legacy Endpoints Framework dependencies
    compile 'com.google.appengine:appengine-endpoints:1.9.59'
    compile 'com.google.appengine:appengine-endpoints-deps:1.9.59'

    compile 'javax.servlet:servlet-api:2.5'
}

appengine { // LEGACY: Deprecated App Engine plugin Tasks configuration
    downloadSdk = true
    appcfg {
        oauth2 = true

        // extraOptions is used for acceptance test and
        // is not required.
        def application = findProperty("appengine.deploy.application")
        def version = findProperty("appengine.deploy.version")
        def serviceAccount = findProperty("appengine.deploy.serviceAccount")

        extraOptions = ["--application=" + application, "--version=" + version,
            '--service_account_json_key_file=' + serviceAccount]
    }
    endpoints {
        getClientLibsOnBuild = true
        getDiscoveryDocsOnBuild = true
    }
}

v2

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // V2: Add the new App Engine and Endpoints Frameworks plugin dependencies
        classpath 'com.google.cloud.tools:endpoints-framework-gradle-plugin:1.0.2'
        classpath 'com.google.cloud.tools:appengine-gradle-plugin:1.3.3'
    }
}

repositories {
    jcenter();
}

apply plugin: 'java'
apply plugin: 'war'

// V2: Apply new App Engine and Endpoints Framework server plugins
apply plugin: 'com.google.cloud.tools.appengine'
apply plugin: 'com.google.cloud.tools.endpoints-framework-server'

sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7

dependencies {
    // V2: Endpoints Framework v2 migration
    compile 'com.google.endpoints:endpoints-framework:2.0.9'
    compile 'javax.inject:javax.inject:1'

    compile 'javax.servlet:servlet-api:2.5'
}

// V2: Define deployment configuration using the new App Engine plugin
// with the appengine closure
appengine {  // App Engine tasks configuration
    deploy {   // deploy configuration

        // The following is used for acceptance tests and
        // is not required for a migration.
        project = findProperty("appengine.deploy.project")
        version = findProperty("appengine.deploy.version")
        def promoteProp = findProperty("appengine.deploy.promote")
        if (promoteProp != null) {
            promote = new Boolean(promoteProp)
        }
    }
}

Aggiorna il file web.xml

Nella versione 2.0 di Endpoints Frameworks, la classe servlet è passata da SystemServiceServlet a EndpointsServlet.

Il pattern URL è stato aggiornato da /_ah/spi/* a /_ah/api/*.

Legacy

<servlet>
    <!-- LEGACY: Start of Legacy section -->
    <servlet-name>SystemServiceServlet</servlet-name>
    <servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class>
    <!-- LEGACY: End of Legacy section -->
    <init-param>
        <param-name>services</param-name>
        <param-value>com.example.migration.endpoints.backend.MyEndpoint</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <!-- LEGACY: Start of legacy section -->
    <servlet-name>SystemServiceServlet</servlet-name>
    <url-pattern>/_ah/spi/*</url-pattern>
    <!-- LEGACY: End of legacy section -->
</servlet-mapping>

v2

<servlet>
    <!-- V2: Start of v2 section -->
    <servlet-name>EndpointsServlet</servlet-name>
    <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
    <!-- V2: End of v2 section -->
    <init-param>
        <param-name>services</param-name>
        <param-value>com.example.migration.endpoints.backend.MyEndpoint</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <!-- V2: Start of v2 section -->
    <servlet-name>EndpointsServlet</servlet-name>
    <url-pattern>/_ah/api/*</url-pattern>
    <!-- V2: End of v2 section -->
</servlet-mapping>

Ricostruire il progetto

Infine, utilizza l'elenco di build di Android Studio per eseguire la pulizia e la ricostruzione del progetto Android Studio con le nuove dipendenze.

Riesegui build di Android Studio

Esegui il deployment del modulo di backend

Il nuovo plug-in Gradle App Engine viene ora utilizzato per eseguire il deployment del modulo di backend utilizzando il seguente task Gradle nel modulo backend:

gradle appengineDeploy

Generare librerie client

Per generare le librerie client, utilizza il seguente task Gradle nel modulo backend:

gradle endpointsClientLibs

Scopri di più sulle attività disponibili per il plug-in Gradle Endpoints Frameworks.

Aggiunta della gestione dell'API Endpoints

Endpoints Frameworks versione 2.0 ti consente anche di attivare le funzionalità di gestione delle API, tra cui:

  • Gestione delle chiavi API
  • Condivisione API
  • Autenticazione degli utenti
  • Metriche delle API
  • Log API

Per iniziare a utilizzare queste e altre funzionalità di Cloud Endpoints Frameworks 2.0, vai alla pagina Java relativa a Endpoints Frameworks per App Engine.