Migración de proyectos de Android a Cloud Endpoints Frameworks 2.0

En esta página, se describe la migración de una app versión 1.0 de Android de Cloud Endpoints a Endpoints Frameworks para App Engine. Ten en cuenta que esta página hace referencia a la versión 1.0 de Endpoints como Endpoints Frameworks versión 1.0, y al nuevo Endpoints Frameworks para App Engine como Endpoints Frameworks versión 2.0

Ventajas

El nuevo marco de trabajo cuenta con una serie de beneficios, incluidos los siguientes:

  • Latencia de solicitud reducida
  • Mejor integración con las características de App Engine, como los dominios personalizados
  • Asistencia oficial para configuraciones de Guice
  • Opcionalmente, nuevas características de administración de API

Endpoints Frameworks versión 2.0 no afecta a las interfaces hacia tu API. Los clientes existentes continúan trabajando después de la migración sin ningún cambio en el código del cliente.

Migración de proyectos de varios módulos de Android a la versión 2.0 de Endpoints Frameworks

A través de los pasos siguientes, podrás migrar los proyectos de Android Studio de  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 lista de tareas siguiente de alto nivel a medida que avanzas en la guía de migración. Esta guía de migración da por hecho que tienes un proyecto de Android existente que usa un módulo de Google Cloud.

  1. Antes de comenzar
  2. Configura el SDK de Cloud.
  3. De forma opcional, puedes descargar el código de muestra.
  4. Migra a la versión 2.0 de Endpoints Frameworks.
  5. Implementa tu módulo de backend.
  6. Genera bibliotecas cliente.

Antes de comenzar

  1. Instala Android Studio.
  2. Instala el SDK 26+ de Android.
  3. Instala el SDK de Cloud.

Configura el SDK de Cloud

Para configurar el SDK de Cloud, sigue estos pasos:

  1. Inicializa el SDK de Cloud:

     gcloud init
        
  2. Usa las credenciales predeterminadas de la aplicación:

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

     gcloud components install app-engine-java
        

De forma opcional, puedes descargar el código de muestra

Para clonar los proyectos de muestra legacy y v2 de GitHub, ejecuta el código siguiente:

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

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

     cd android-docs-samples/endpoints-frameworks/
        

Migra a Endpoints Frameworks versión 2.0

Actualiza el archivo build.gradle

Las dependencias de Endpoints Frameworks versión 2.0 usan Guava 19, mientras que el complemento de compilación com.android.tools.build:gradle:2.3.3 de Android Gradle usa Guava 18. Agrega Guava 19 al cierre de las dependencias de la secuencia de comandos de compilación del build.gradle para anular esta dependencia de transición.

Heredada

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 Endpoints versión 1.0, usaste el complemento de Gradle gradle-appengine-plugin para generar un documento de descubrimiento de API. En Endpoints Frameworks versión 2.0, debes usar endpoints-framework-gradle-plugin para generar un documento de descubrimiento.

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

Heredada

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 actualizó la herramienta Gradle del entorno estándar de App Engine. Los proyectos de Endpoints Frameworks versión 1.0 usaron 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 servidor com.google.cloud.tools.endpoints-framework-server.

Heredada

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 Endpoints Frameworks versión 2.0, la clase de servlet cambió de SystemServiceServlet a EndpointsServlet.

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

Heredada

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

Vuelve a compilar el proyecto

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

Vuelve a compilar Android Studio

Implementa tu módulo de backend

El nuevo complemento Gradle App Engine ahora se usa para implementar el módulo de backend mediante la siguiente tarea de Gradle, mientras se encuentra en el módulo backend:

gradle appengineDeploy
    

Genera bibliotecas cliente

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

gradle endpointsClientLibs
    

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

Agrega la administración de API para Endpoints

La versión 2.0 de Endpoints Frameworks también te permite activar las funciones de administración de la API, incluidas las que se muestran a continuación:

  • Administración de claves de API
  • Uso compartido de API
  • Autenticación de usuarios
  • Métricas de API
  • Registros de API

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