Google App Engine を使ってみる

艦隊シミュレーター@androidで外部DBを使ってみたいので、DBを使用する方法としてGoogle App Engine を試してみる。

多くのサイトではEclipseを使って開発しているみたいだが、Android Studioでも出来るみたいなので調べてみる。

私はあまり従いませんが、一応Googleさんがこれをどこに書いているのかぐらいは示しておきます。
Quickstart  _  Cloud Tools for Android Studio  _  Google Cloud Platform
How-to Guides  _  Cloud Tools for Android Studio  _  Google Cloud Platform
gradle-appengine-templates_HelloEndpoints at master · GoogleCloudPlatform_gradle-appengine-templates · GitHub

Android Studio + Google App Engine でお手軽バックエンドサーバ構築 – Qiita
まずこの記事の通りにやってみたが、新規作成したモジュールを実行したら以下のエラーがでた。

“C:\Program Files\android-studio_2_Preview4\jre\bin\java” -javaagent:C:\Users\aillice\.gradle\appengine-sdk\appengine-java-sdk-1.9.34\lib\agent\appengine-agent.jar -Xbootclasspath/p:C:\Users\aillice\.gradle\appengine-sdk\appengine-java-sdk-1.9.34\lib\override\appengine-dev-jdk-overrides.jar -Didea.launcher.port=7533 “-Didea.launcher.bin.path=C:\Program Files\android-studio_2_Preview4\bin” -Dfile.encoding=windows-31j -classpath “C:\Users\aillice\.gradle\appengine-sdk\appengine-java-sdk-1.9.34\lib\appengine-tools-api.jar;C:\Program Files\android-studio_2_Preview4\lib\idea_rt.jar” com.intellij.rt.execution.application.AppMain com.google.appengine.tools.development.DevAppServerMain –address=localhost –port=8080 D:\android_studio_project\KanColleOrg\backend\build\exploded-app
8 15, 2016 6:06:38 午後 java.util.prefs.WindowsPreferences <init>
警告: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(…) returned error code 5.
********************************************************
There is a new version of the SDK available.
———–
Latest SDK:
Release: 1.9.42
Timestamp: Sat Jul 16 03:45:47 JST 2016
API versions: [1.0]

———–
Your SDK:
Release: 1.9.34
Timestamp: Fri Feb 12 04:36:15 JST 2016
API versions: [1.0]

———–
Please visit https://developers.google.com/appengine/downloads for the latest SDK.
********************************************************
8 15, 2016 6:06:40 午後 com.google.appengine.tools.development.SystemPropertiesManager setSystemProperties
情報: Overwriting system property key ‘java.util.logging.config.file’, value ‘C:\Users\aillice\.gradle\appengine-sdk\appengine-java-sdk-1.9.34\config\sdk\logging.properties’ with value ‘WEB-INF/logging.properties’ from ‘D:\android_studio_project\KanColleOrg\backend\build\exploded-app\WEB-INF\appengine-web.xml’

************************************************
Could not open the requested socket: Address already in use: bind
Try overriding –address and/or –port.

Process finished with exit code 2

新規作成したモジュールのbuild.gradleのdependenciesの

appengineSdk ‘com.google.appengine:appengine-java-sdk:1.9.42’
compile ‘com.google.appengine:appengine-endpoints:1.9.42’
compile ‘com.google.appengine:appengine-endpoints-deps:1.9.42’

この辺を全部1.9.34から1.9.42に変更したら解決した。

その後もなんだかエラーが出て実行できなかったが、他のソフトで8080ポートを使用していてアクセス出来ないみたいだった。ちょうど以下の様なエラーメッセージが出てた。

android – Google Cloud Endpoint – Error when project runs backend configuration – Stack Overflow

この辺を乗り越えたらちゃんと実行できた。実行してhttp://localhost:8080/にアクセスすると、

Google App Engine ローカルホスト初期画面

ヽ(=´▽`=)ノあーよかった。ここまで気づくのに結構時間がかかってしまった…。


では気を取り直して次はこっちの記事にしたがってみます。
Android Studioに追加されたGoogle App Engineテンプレートを試そう 導入編 – クックパッド開発者ブログ

自動生成されたjavaファイルは、MyEndpoint.javaとMyBean.javaの2つ。

MyEndpointはエンドポイントを定義するクラスで、アノテーションで宣言しているらしい。(ん?エンドポイントって何?)

@ApiではAPI名、バージョンなどを定義する。
@ApiMethodではname属性にエンドポイント名を定義するらしい。

コード見たほうが早いよねって話でほい↓。

MyEndpoint.java

MyBean.java

MyBeanクラスはデータを持たせるための簡単なクラスで。MyEndpointクラスのsayHi()メソッドは、フォームに入力された値をMyBeanクラスにセットして返すだけのメソッド。

えーと、書き忘れてましたけどlocalhost:8080ではじめに表示されるページでは、フォームに文字を入力して右のボタンを押すと、ページの上の方に「Hi, (入力した文字)」と表示されます。はい。

そんでsayHi()メソッドがどのようにして使われているのかわからんので、自動生成されたsrc/main/webapp/index.htmlを見て、「sayHi」で検索かけると見つけました。javascriptで実行してるんですかね。↓これ。

↑これの6行目にgapi.client.myApi.sayHi({‘name’: name})というのがありますね。

これ以上のことはjavascriptをやっている人間ではないのでわかりません( ;∀;)


続いて同じサイトの「アプリケーションでAPIを利用する」の辺りからならわかりそうなのでざっと見ていきます。

クライアントライブラリは@Apiのnameとnamespaceに従うので、この場合は「com.example.aillice.myapplication.backend.myApi.MyApi」がエンドポイント用のクライアントになるそうです?

通信処理は非同期処理で行うので、以下の処理はAsyncTaskクラスのサブクラス内に書きます。(そういえばAsyncTaskもいじったことありませんでした(´・ω・`))

app(MainActivity.javaがあるパッケージ)にasynctaskというパッケージを作ってSayHiAsyncTaskクラスを作りました。

SayHiAsyncTask.java

こんな感じで書いたは良いけど、何パターンもserRootUrl()の中身を書き換えてもローカルホストに接続できなかった。

実機でもエミュレータでもダメでした。時間取られすぎて死にそうなのでとりあえず諦めておく。

この辺はネットワークの知識が足りてないんだろうなあと実感しました。

ローカルじゃなくてサンプル用に適当やつをデプロイしてみればうまくいくのかね。

(´・ω・`)外部DB扱えるようになるまでが遠いなあ。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする