Android-Projekte zu Endpoints Frameworks 2.0 migrieren

Auf dieser Seite wird beschrieben, wie Sie eine vorhandene App für Android Cloud Endpoints Version 1.0 zu Endpoints Frameworks for App Engine migrieren. Beachten Sie, dass diese Seite auf Endpoints Version 1.0 als Endpoints Frameworks Version 1.0 und neue Endpoints Frameworks für App Engine als Endpoints Frameworks Version 2.0 verweist.

Vorteile

Das neue Framework bietet diverse Vorteile, unter anderem:

  • Geringere Anfragelatenz
  • Bessere Einbindung von App Engine-Funktionen wie benutzerdefinierten Domains
  • Offizieller Support für Guice-Konfigurationen
  • Optional neue Features für die API-Verwaltung

Endpoints Frameworks Version 2.0 hat keine Auswirkungen auf die Schnittstellen zu Ihrer API. Bereits bestehende Clients arbeiten nach der Migration ohne clientseitige Änderungen des Codes regulär weiter.

Android-Projekte mit mehreren Modulen zu Endpoints Frameworks 2.0 migrieren

Nachstehend wird Schritt für Schritt beschrieben, wie Sie mit Android Studio Endpoints Frameworks 1.0 erstellte Projekte zu Endpoints Frameworks 2.0 migrieren. In dieser Anleitung wird ein Android Studio-Projekt mit einem Endpoints-Modul migriert.

Aufgabenliste

Verwenden Sie beim Durcharbeiten der Migrationsanleitung die folgende Aufgabenliste. In dieser Migrationsanleitung wird davon ausgegangen, dass Sie ein bestehendes Android-Projekt mit einem Google Cloud-Modul haben.

  1. Vorbereitung
  2. Cloud SDK einrichten
  3. Optional: Beispielcode herunterladen
  4. Migration zu Endpoints Frameworks Version 2.0
  5. Back-End-Modul bereitstellen
  6. Clientbibliotheken erstellen

Vorbereitung

  1. Installieren Sie Android Studio.
  2. Installieren Sie Android SDK 26+.
  3. Installieren Sie das Cloud SDK.

Cloud SDK einrichten

Vorgehensweise:

  1. Initialisieren Sie das Cloud SDK:

     gcloud init
    
  2. Verwenden Sie die Standardanmeldedaten für Anwendungen:

     gcloud auth application-default login
    
  3. Installieren Sie die Komponente app-engine-java:

     gcloud components install app-engine-java
    

Optional: Beispielcode herunterladen

Klonen Sie die Beispielprojekte legacy und v2 von GitHub:

  1. Klonen Sie das Beispiel-Repository auf Ihren lokalen Computer:

     git clone https://github.com/GoogleCloudPlatform/android-docs-samples
    
  2. Wechseln Sie in das Verzeichnis, das den Beispielcode für legacy und v2 enthält:

     cd android-docs-samples/endpoints-frameworks/
    

Migration zu Endpoints Frameworks Version 2.0

Aktualisieren Sie die Datei build.gradle:

Die Abhängigkeiten von Endpoints Frameworks 2.0 verwenden Guava 19 und das Android Gradle Build-Plug-in com.android.tools.build:gradle:2.3.3 verwendet Guava 18. Fügen Sie Guava 19 zum Abschluss der Build-Skript-Abhängigkeiten von build.gradle hinzu, um diese transitive Abhängigkeit zu überschreiben.

Legacy

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

Aktualisieren Sie die Datei app/build.gradle:

In Endpoints Version 1.0 haben Sie das Gradle-Plug-in gradle-appengine-plugin verwendet, um ein API Discovery-Dokument zu generieren. In Endpoints Frameworks Version 2.0 verwenden Sie das endpoints-framework-gradle-plugin, um ein Discovery-Dokument zu erstellen.

Dieses Build-Skript verwendet das clientseitige Plug-in com.google.cloud.tools.endpoints-framework-client.

Legacy

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

Aktualisieren Sie die Datei backend/build.gradle:

Die Standardumgebung von App Engine Gradle-Tooling wurde aktualisiert. Endpoints Frameworks-Projekte der Version 1.0 verwendeten gradle-appengine-plugin in com.google.appengine und Endpoints Frameworks-Projekte der Version 2.0 verwenden appengine-gradle-plugin.

Dieses Build-Skript verwendet das serverseitige Plug-in com.google.cloud.tools.endpoints-framework-server.

Legacy

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

Aktualisieren Sie die Datei web.xml:

In Endpoints Frameworks Version 2.0 wurde die Servlet-Klasse von SystemServiceServlet zu EndpointsServlet geändert.

Das URL-Muster wurde von /_ah/spi/* auf /_ah/api/* aktualisiert.

Legacy

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

Projekt neu erstellen

Verwenden Sie schließlich die Android Studio-Buildliste, um das Android Studio-Projekt mit den neuen Abhängigkeiten zu bereinigen und neu zu erstellen.

Rebuild in Android Studio

Back-End-Modul bereitstellen

Das neue Gradle App Engine-Plug-in wird nun zur Bereitstellung des Back-End-Moduls verwendet. Dazu wird im backend-Modul diese Gradle-Aufgabe ausgeführt:

gradle appengineDeploy

Clientbibliotheken erstellen

Erstellen Sie die Clientbibliotheken mit der folgenden Gradle-Aufgabe im backend-Modul:

gradle endpointsClientLibs

Weitere Informationen zu verfügbaren Aufgaben im Gradle-Plug-in von Endpoints Frameworks.

Endpoints-API-Verwaltung hinzufügen

Mit Endpoints Frameworks 2.0 können Sie auch Funktionen für die API-Verwaltung aktivieren:

  • Verwalten von API-Schlüsseln
  • Teilen von APIs
  • Nutzerauthentifizierung
  • API-Messwerte
  • API-Logs

Um diese und andere Features von Cloud Endpoints Frameworks 2.0 zu verwenden, besuchen Sie die Java-Seite zu Endpoints Frameworks for App Engine.