Migrar projetos Android para o Cloud Endpoints Frameworks 2.0

Esta página descreve a migração de uma app Android Cloud Endpoints versão 1.0 existente para os Frameworks de Endpoints para o App Engine. Tenha em atenção que esta página se refere à versão 1.0 dos Endpoints como versão 1.0 dos Frameworks dos Endpoints e aos novos Frameworks dos Endpoints para o App Engine como versão 2.0 dos Frameworks dos Endpoints.

Vantagens

A nova estrutura oferece várias vantagens, incluindo:

  • Latência de pedidos reduzida
  • Melhor integração com as funcionalidades do App Engine, como domínios personalizados.
  • Apoio técnico oficial para configurações do Guice
  • Opcionalmente, novas funcionalidades de gestão de APIs

A versão 2.0 do Endpoints Frameworks não afeta as interfaces da sua API. Os clientes existentes continuam a funcionar após a migração sem alterações ao código do lado do cliente.

Migrar projetos Android com vários módulos para a versão 2.0 dos Frameworks de Endpoints

Os passos seguintes explicam como mover projetos do Android Studio Endpoints Frameworks versão 1.0 para o Endpoints Frameworks versão 2.0. O guia migra um projeto do Android Studio com um módulo Endpoints.

Lista de tarefas

Use a seguinte lista de tarefas de nível superior à medida que segue o guia de migração. Este guia de migração pressupõe que tem um projeto Android existente que usa um Google Cloud módulo.

  1. Antes de começar.
  2. Configure a CLI do Google Cloud.
  3. Opcional: transfira o exemplo de código.
  4. Migre para a versão 2.0 dos frameworks de pontos finais.
  5. Implemente o módulo de back-end.
  6. Gere bibliotecas de cliente.

Antes de começar

  1. Instale o Android Studio.
  2. Instale o Android SDK 26 ou superior.
  3. Instale a CLI gcloud.

Configure a CLI gcloud

Para configurar a CLI gcloud:

  1. Inicialize a CLI gcloud:

     gcloud init
    
  2. Usar Credenciais padrão da aplicação:

     gcloud auth application-default login
    
  3. Instale o componente app-engine-java:

     gcloud components install app-engine-java
    

Opcional: transfira o exemplo de código

Para clonar os projetos de exemplo legacy e v2 do GitHub:

  1. Clone o repositório de exemplo para a sua máquina local:

     git clone https://github.com/GoogleCloudPlatform/android-docs-samples
    
  2. Altere para o diretório que contém o código de exemplo para legacy e v2:

     cd android-docs-samples/endpoints-frameworks/
    

Migre para a versão 2.0 dos frameworks de Endpoints

Atualize o ficheiro build.gradle

As dependências da versão 2.0 dos Endpoints Frameworks usam o Guava 19 e o plugin de compilação do Android Gradle usa o Guava 18.com.android.tools.build:gradle:2.3.3 Adicione o Guava 19 ao encerramento das dependências do script de compilação para substituir esta dependência transitiva.build.gradle

Antigo

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

Atualize o ficheiro app/build.gradle

Na versão 1.0 dos Endpoints, usou o plugin do Gradle, gradle-appengine-plugin, para gerar um documento de descoberta de API. Na versão 2.0 dos Frameworks de Endpoints, usa o comando endpoints-framework-gradle-plugin para gerar um documento Discovery.

Este script de compilação usa o plug-in do lado do cliente, com.google.cloud.tools.endpoints-framework-client.

Antigo

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

Atualize o ficheiro backend/build.gradle

As ferramentas do Gradle do ambiente padrão do App Engine foram atualizadas. Os projetos da versão 1.0 do Endpoints Frameworks usavam o gradle-appengine-plugin em com.google.appengine e os projetos da versão 2.0 do Endpoints Frameworks usam appengine-gradle-plugin.

Este script de compilação usa o plugin do lado do servidor, com.google.cloud.tools.endpoints-framework-server.

Antigo

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

Atualize o ficheiro web.xml

Na versão 2.0 dos Frameworks de Endpoints, a classe servlet foi alterada de SystemServiceServlet para EndpointsServlet.

O padrão do URL foi atualizado de /_ah/spi/* para /_ah/api/*.

Antigo

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

Recrie o projeto

Por último, use a lista de compilação do Android Studio para limpar e recompilar o projeto do Android Studio com as novas dependências.

Recompilação do Android Studio

Implemente o módulo de back-end

O novo Gradle App Engine plugin é agora usado para implementar o módulo de back-end usando a seguinte tarefa do Gradle enquanto estiver no módulo backend:

gradle appengineDeploy

Gere bibliotecas de cliente

Para gerar bibliotecas cliente, use a seguinte tarefa do Gradle no módulo backend:

gradle endpointsClientLibs

Saiba mais sobre as tarefas disponíveis para o plugin do Gradle do Frameworks de pontos finais.

Adicionar gestão da API Endpoints

A versão 2.0 do Endpoints Frameworks também lhe permite ativar funcionalidades de gestão de APIs, incluindo:

  • Gestão de chaves da API
  • Partilha de APIs
  • Autenticação do utilizador
  • Métricas da API
  • Registos da API

Para começar a usar estas e outras funcionalidades do Cloud Endpoints Frameworks 2.0, aceda à página Java acerca dos Endpoints Frameworks para o App Engine.