Como migrar projetos do Android para o Cloud Endpoints Frameworks 2.0

Esta página descreve a migração de um aplicativo atual do Cloud Endpoints para Android versão 1.0 para o Endpoints Frameworks para o App Engine. Nesta página, o Cloud Endpoints 1.0 é chamado de Cloud Endpoints Frameworks versão 1.0 e o novo Endpoints Frameworks para App Engine é chamado de Endpoints Frameworks versão 2.0.

Benefícios

Existem vários benefícios no novo framework, incluindo:

  • latência reduzida de solicitação;
  • melhor integração com os recursos do App Engine, como domínios personalizados;
  • suporte oficial para configurações do Guice;
  • se quiser, novos recursos de gerenciamento de APIs.

O Endpoints Frameworks versão 2.0 não afeta as interfaces com sua API. Os clientes atuais continuam funcionando após a migração sem nenhuma mudança de código no lado do cliente.

Como migrar projetos com vários módulos do Android para o Endpoints Frameworks 2.0

As etapas a seguir ajudam você a transferir projetos da versão 1.0 do Endpoints Frameworks para Android Studio para o Endpoints Frameworks versão 2.0. O guia migra um projeto do Android Studio com um módulo do Cloud Endpoints.

Lista de tarefas

Use a lista de tarefas geral a seguir ao trabalhar com o guia de migração. Esse guia pressupõe que um projeto Android já tenha sido criado usando um módulo do Google Cloud.

  1. Antes de começar.
  2. Configurar a Google Cloud CLI.
  3. Opcional: fazer o download do código de amostra.
  4. Migrar para o Endpoints Frameworks versão 2.0
  5. Implantar seu módulo de back-end.
  6. Gerar bibliotecas de cliente.

Antes de começar

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

Configurar a CLI gcloud

Para configurar a CLI gcloud:

  1. Inicialize a CLI gcloud.

     gcloud init
    
  2. Use o Application Default Credentials:

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

     gcloud components install app-engine-java
    

Opcional: fazer o download do código de amostra

Para clonar os projetos de amostra legacy e v2 do GitHub, faça o seguinte:

  1. Clone o repositório de amostra na 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 amostra para legacy e v2:

     cd android-docs-samples/endpoints-frameworks/
    

Migrar para o Endpoints Frameworks versão 2.0

Atualize o arquivo build.gradle

As dependências da versão 2.0 do Endpoints Frameworks usam o Guava 19 e o plug-in de compilação do Android Gradle com.android.tools.build:gradle:2.3.3 usa o Guava 18. Adicione Guava 19 ao fechamento de dependências do script de compilação do build.gradle para modificar essa dependência transitiva.

Aplicativo

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 arquivo app/build.gradle

Na versão 1.0 do Endpoints, você usou o plug-in Gradle, gradle-appengine-plugin, para gerar um documento de descoberta de API. No Endpoints Frameworks versão 2.0, você usa o endpoints-framework-gradle-plugin para gerar um documento de descoberta.

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

Aplicativo

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 arquivo backend/build.gradle

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

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

Aplicativo

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 arquivo web.xml

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

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

Aplicativo

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

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

Recompilação do Android Studio

Implantar o módulo de back-end

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

gradle appengineDeploy

Gerar bibliotecas de cliente

Para gerar bibliotecas de clientes, use a seguinte tarefa Gradle no módulo backend:

gradle endpointsClientLibs

Saiba mais sobre as tarefas disponíveis para o plug-in do Gradle do Endpoints Frameworks.

Como adicionar gerenciamento da API do Endpoints

O Endpoints Frameworks versão 2.0 também permite ativar recursos de gerenciamento de API, incluindo:

  • gerenciamento de chave de API;
  • Compartilhamento da API
  • Autenticação de usuários
  • Métricas da API
  • registros da API.

Para começar a usar esses e outros recursos do Cloud Endpoints Frameworks 2.0, acesse a página Java sobre Endpoints Frameworks para o App Engine.