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 Framework versión 1.0 y el nuevo Endpoints Framework para App Engine como Endpoints Framework versión 2.0

Beneficios

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
  • De forma opcional, se proporcionan características nuevas de administración de API

Endpoints Frameworks versión 2.0 no afecta 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 lado 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 Endpoints Frameworks versión 1.0 a Endpoints Frameworks versión 2.0. Con esta guía, aprenderás a migrar proyectos de Android Studio a 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 supone que tienes un proyecto de Android existente con 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 lado 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.

Con esta secuencia de comandos de compilación se usa el complemento del lado 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 reconstruir 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 Plugin ahora se usa para implementar el módulo de backend mediante la tarea siguiente de Gradle, mientras se encuentra en el módulo backend:

gradle appengineDeploy

Genera bibliotecas cliente

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

gradle endpointsClientLibs

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

Agrega la administración de la 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 características de Cloud Endpoints Frameworks 2.0, visita la página de Java sobre Endpoints Frameworks para App Engine.