Migrazione dei progetti Android a Cloud Endpoints Frameworks 2.0

In questa pagina viene descritta la migrazione di un'app Android Cloud Endpoints esistente versione 1.0 a Endpoints Frameworks per App Engine. Tieni presente che questa pagina fa riferimento alla versione 1.0 di Endpoints come Endpoints Frameworks versione 1.0 e ai nuovi Endpoints Frameworks per App Engine come Endpoints Frameworks versione 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.
  • Supporto ufficiale per le configurazioni di Guice
  • Facoltativamente, nuove funzionalità di gestione delle API

Endpoints Frameworks versione 2.0 non influisce sulle interfacce dell'API. I clienti esistenti continuano a lavorare dopo la migrazione senza alcuna modifica al codice lato client.

Migrazione dei progetti multi-modulo Android a Endpoints Frameworks versione 2.0

I passaggi seguenti illustrano come trasferire i progetti di Android Studio Endpoint 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 mentre lavori nella guida alla migrazione. Questa guida alla migrazione presuppone che tu disponga di un progetto Android esistente 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 a Endpoints Frameworks versione 2.0.
  5. Esegui il deployment del modulo di backend.
  6. Genera librerie client.

Prima di iniziare

  1. Installa Android Studio.
  2. Installa l'SDK per Android 26 o versioni successive.
  3. Installa gcloud CLI.

Configura gcloud CLI

Per configurare gcloud CLI:

  1. Inizializza gcloud CLI:

     gcloud init
    
  2. Usa 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 a Endpoints Frameworks versione 2.0

Aggiorna il file build.gradle

Le dipendenze di Endpoints Frameworks versione 2.0 utilizzano Guava 19 e il plug-in di build Android Gradle com.android.tools.build:gradle:2.3.3 utilizza Guava 18. Aggiungi Guava 19 alla chiusura delle dipendenze dello script di build di build.gradle per eseguire l'override di 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

In Endpoints versione 1.0, hai utilizzato il plug-in Gradle, gradle-appengine-plugin, per generare un documento di rilevamento dell'API. In Endpoint Frameworks versione 2.0, si utilizza il endpoints-framework-gradle-plugin per generare un documento di rilevamento.

Questo script di build 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 dell'ambiente standard di App Engine sono stati aggiornati. I progetti Endpoints Frameworks versione 1.0 utilizzavano gradle-appengine-plugin in com.google.appengine, mentre i progetti Endpoints Frameworks versione 2.0 utilizzano appengine-gradle-plugin.

Questo script di build 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

In Endpoints Frameworks versione 2.0, la classe servlet è cambiata 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>

Ricrea progetto

Infine, usa l'elenco di build di Android Studio per ripulire e ricreare il progetto Android Studio con le nuove dipendenze.

Ricreazione 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 la seguente attività Gradle durante il modulo backend:

gradle appengineDeploy

Genera librerie client

Per generare librerie client, utilizza la seguente attività Gradle nel modulo backend:

gradle endpointsClientLibs

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

Aggiunta della gestione delle API Endpoints

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

  • Gestione delle chiavi API
  • Condivisione dell'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 su Endpoints Frameworks per App Engine.