Migrar proyectos de Android a Cloud Endpoints Frameworks 2.0

En esta página se describe cómo migrar una aplicación Android Cloud Endpoints versión 1.0 a Endpoints Frameworks para App Engine. Ten en cuenta que en esta página se hace referencia a la versión 1.0 de Endpoints como versión 1.0 de Endpoints Frameworks y a la nueva versión de Endpoints Frameworks para App Engine como versión 2.0 de Endpoints Frameworks.

Ventajas

El nuevo marco ofrece varias ventajas, entre las que se incluyen las siguientes:

  • Latencia de solicitud reducida
  • Mejor integración con las funciones de App Engine, como los dominios personalizados.
  • Asistencia oficial para configuraciones de Guice
  • Opcionalmente, nuevas funciones de gestión de APIs

La versión 2.0 de Endpoints Frameworks no afecta a las interfaces de tu API. Los clientes actuales seguirán funcionando después de la migración sin necesidad de cambiar el código del lado del cliente.

Migrar proyectos de Android con varios módulos a Endpoints Frameworks versión 2.0

En los siguientes pasos se explica cómo migrar proyectos de Android Studio con Endpoints Frameworks versión 1.0 a Endpoints Frameworks versión 2.0. En esta guía se migra un proyecto de Android Studio con un módulo de Endpoints.

Lista de tareas

Usa la siguiente lista de tareas generales mientras sigues la guía de migración. En esta guía de migración se da por hecho que tienes un proyecto de Android que usa un móduloGoogle Cloud .

  1. Antes de empezar
  2. Configura Google Cloud CLI.
  3. Opcional: descarga el código de ejemplo.
  4. Migra a la versión 2.0 de Endpoints Frameworks.
  5. Despliega tu módulo de backend.
  6. Generar bibliotecas de cliente.

Antes de empezar

  1. Instala Android Studio.
  2. Instala el SDK de Android 26 o una versión posterior.
  3. Instala gcloud CLI.

Configurar gcloud CLI

Para configurar gcloud CLI, sigue estos pasos:

  1. Inicializa gcloud CLI:

     gcloud init
    
  2. Usar credenciales de aplicación predeterminadas:

     gcloud auth application-default login
    
  3. Instala el componente app-engine-java:

     gcloud components install app-engine-java
    

Opcional: Descarga el código de muestra

Para clonar los proyectos de ejemplo legacy y v2 de GitHub, haz lo siguiente:

  1. Clona el repositorio de ejemplo en tu máquina local:

     git clone https://github.com/GoogleCloudPlatform/android-docs-samples
    
  2. Cambia al directorio que contiene el código de ejemplo de legacy y v2:

     cd android-docs-samples/endpoints-frameworks/
    

Migrar a la versión 2.0 de Endpoints Frameworks

Actualiza el archivo build.gradle

Las dependencias de Endpoints Frameworks versión 2.0 usan Guava 19 y el complemento de compilación de Android Gradle com.android.tools.build:gradle:2.3.3 usa Guava 18. Añade Guava 19 al cierre de dependencias del script de compilación de build.gradle para anular esta dependencia transitiva.

Datos antiguos

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'
    }
}

Actualiza el archivo app/build.gradle

En la versión 1.0 de Endpoints, usabas el complemento de Gradle, gradle-appengine-plugin, para generar un documento de descubrimiento de la API. En Endpoints Frameworks versión 2.0, se usa endpoints-framework-gradle-plugin para generar un documento de descubrimiento.

Esta secuencia de comandos de compilación usa el complemento del lado del cliente com.google.cloud.tools.endpoints-framework-client.

Datos antiguos

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'
}

Actualiza el archivo backend/build.gradle

Se ha actualizado la herramienta Gradle del entorno estándar de App Engine. Los proyectos de Endpoints Frameworks versión 1.0 usaban gradle-appengine-plugin en com.google.appengine, y los proyectos de Endpoints Frameworks versión 2.0 usan appengine-gradle-plugin.

Esta secuencia de comandos de compilación usa el complemento del lado del servidor, com.google.cloud.tools.endpoints-framework-server.

Datos antiguos

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)
        }
    }
}

Actualiza el archivo web.xml

En la versión 2.0 de Endpoints Frameworks, la clase de servlet ha cambiado de SystemServiceServlet a EndpointsServlet.

El patrón de URL se ha actualizado de /_ah/spi/* a /_ah/api/*.

Datos antiguos

<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>

Recompilar proyecto

Por último, usa la lista de compilaciones de Android Studio para limpiar y volver a compilar el proyecto de Android Studio con las nuevas dependencias.

Recompilación de Android Studio

Desplegar el módulo de backend

Ahora se usa el nuevo complemento Gradle App Engine para desplegar el módulo de backend. Para ello, usa la siguiente tarea de Gradle en el módulo backend:

gradle appengineDeploy

Generar bibliotecas de cliente

Para generar bibliotecas de cliente, usa la siguiente tarea de Gradle en el módulo backend:

gradle endpointsClientLibs

Consulta más información sobre las tareas disponibles para el complemento de Gradle de Endpoints Frameworks.

Añadir gestión de APIs de Endpoints

Endpoints Frameworks 2.0 también te permite activar funciones de gestión de APIs, como las siguientes:

  • Gestión de claves de API
  • Compartir APIs
  • Autenticación de usuarios
  • Métricas de APIs
  • Registros de la API

Para empezar a usar estas y otras funciones de Cloud Endpoints Frameworks 2.0, ve a la página de Java sobre Endpoints Frameworks para App Engine.