Android プロジェクトを Cloud Endpoints Frameworks 2.0 に移行する

このページでは、既存の Android Cloud Endpoints バージョン 1.0 アプリを App Engine 用 Endpoints Frameworks に移行する方法について説明します。 このページでは、Endpoints バージョン 1.0 を「Endpoints Frameworks バージョン 1.0」、新しい App Engine 用 Endpoints Frameworks を「Endpoints Frameworks バージョン 2.0」と表記します。

利点

新しいフレームワークには数多くの利点があります。

  • リクエスト レイテンシの短縮
  • App Engine の機能(カスタム ドメインなど)との統合強化
  • Guice 構成の正式サポート
  • (オプション)新しい API 管理機能

Endpoints Frameworks バージョン 2.0 に移行しても、API のインターフェースには影響しません。既存のクライアントは、クライアント側コードを変更しなくても、移行後も引き続き動作します。

Android 複数モジュール プロジェクトを Endpoints Frameworks バージョン 2.0 に移行する

ここでは、Android Studio Endpoints Frameworks バージョン 1.0 プロジェクトから Endpoints Frameworks バージョン 2.0 への移行手順について説明します。Android Studio プロジェクトを Endpoints モジュールと一緒に移行する場合を例にとり、説明を進めます。

タスクリスト

タスクの概要を示す次のリストを参照しながら、移行ガイドを実施してください。この移行ガイドでは、Google Cloud モジュールを使用する Android プロジェクトが存在することを前提としています。

  1. 始める前に
  2. Google Cloud CLI を設定する
  3. (オプション)サンプルコードをダウンロード
  4. Endpoints Frameworks バージョン2.0 への移行
  5. バックエンド モジュールのデプロイ
  6. クライアント ライブラリの生成

始める前に

  1. Android Studio をインストールします。
  2. Android SDK 26 以降をインストールします。
  3. gcloud CLI をインストールします。

gcloud CLI を設定する

gcloud CLI を設定する手順は次のとおりです。

  1. gcloud CLI を初期化します。

     gcloud init
    
  2. アプリケーションのデフォルト認証情報を使用します。

     gcloud auth application-default login
    
  3. app-engine-java コンポーネントをインストールします。

     gcloud components install app-engine-java
    

(オプション)サンプルコードをダウンロード

GitHub から legacy および v2 サンプル プロジェクトのクローンを作成するには:

  1. ローカルマシンにサンプル リポジトリのクローンを作成します。

     git clone https://github.com/GoogleCloudPlatform/android-docs-samples
    
  2. legacyv2 に対するサンプルコードを含むディレクトリに変更します。

     cd android-docs-samples/endpoints-frameworks/
    

Endpoints Frameworks バージョン 2.0 への移行

build.gradle ファイルの更新

Endpoints Frameworks バージョン 2.0 の依存関係は Gauva 19 を使用し、Android Gradle ビルド プラグイン com.android.tools.build:gradle:2.3.3 は Gauva 18 を使用します。この一時的な依存関係をオーバーライドするため、Gauva 19 を build.gradle のビルド スクリプト依存関係クロージャに追加します。

以前の

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

app/build.gradle ファイルの更新

Endpoints バージョン 1.0 では、Gradle プラグイン gradle-appengine-plugin を使用して API ディスカバリ ドキュメントを生成していました。Endpoints Frameworks バージョン 2.0 では、endpoints-framework-gradle-plugin を使用してディスカバリ ドキュメントを生成します。

このビルド スクリプトでは、クライアント側プラグインの com.google.cloud.tools.endpoints-framework-client を使用します。

以前の

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

backend/build.gradle ファイルの更新

App Engine スタンダード環境の Gradle ツールが更新されました。Endpoints Frameworks バージョン 1.0 プロジェクトでは com.google.appengine 内の gradle-appengine-plugin を使用していましたが、Endpoints Frameworks バージョン 2.0 プロジェクトでは appengine-gradle-plugin を使用します。

このビルド スクリプトでは、サーバー側プラグインの com.google.cloud.tools.endpoints-framework-server を使用します。

以前の

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

web.xml ファイルの更新

Endpoints Frameworks バージョン 2.0 では、servlet-class が SystemServiceServlet から EndpointsServlet に変わりました。

URL パターンも /_ah/spi/* から /_ah/api/* に更新されました。

以前の

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

プロジェクトの再ビルド

最後に、Android Studio ビルドリストを使用し、新しい依存関係を適用して Android Studio プロジェクトをクリーンアップおよび再ビルドします。

Android Studio 再ビルド

バックエンド モジュールのデプロイ

新しい Gradle App Engine プラグインを使用してバックエンド モジュールをデプロイする場合は、backend モジュールで次の Gradle タスクを使用します。

gradle appengineDeploy

クライアント ライブラリの生成

クライアント ライブラリを生成する場合は、backend モジュールで次の Gradle タスクを使用します。

gradle endpointsClientLibs

Endpoints Frameworks Gradle プラグインで使用可能なタスクの詳細を確認してください。

Endpoints API 管理の追加

Endpoints Frameworks バージョン 2.0 では、次のような API 管理機能を有効にすることもできます。

  • API キー管理
  • API 共有
  • ユーザー認証
  • API 指標
  • API ログ

Cloud Endpoints Frameworks 2.0 の機能を使い始めるには、Endpoints Frameworks for App Engine に関する Java のページをご覧ください。