Androidの通信周りの環境について(Swagger, gRPC, GraphQL) ~ DroidKaigi2018参加備忘録~


# はじめに
DroidKaigi2018に、スポンサーであるWantedly様の協賛のもとスカラーシッププログラムに採択され、参加させていただきました。
その際に聴講したセッション、特に興味を持ったセッション(Androidの通信周りの環境の話がメイン、Swagger、gRPC、GraphQL)について書きたいと思います。

# 参加したSession
各セッションの簡易紹介と、その発表スライド等へのリンクを添付しております。
Androidとかにも詳しくない人でもざっくりと内容がわかるようにキーワードの意味なども一部引用して載せています。
また、理解に誤りがある場合は編集リクエスト等で教えていただければと思います。

## DataBindingのコードを読む

### リンク
[DataBindingのコードを読む - DroidKaigi 2018 // Speaker Deck](https://speakerdeck.com/star_zero/databindingfalsekodowodu-mu-droidkaigi-2018)


### 概要
そもそもデータバインディングとは
> Data BindingとはXMLなどのデータソースUIを静的または動的に結合する技術
出典 : [[Android] – Data Bindingつかってみた – PSYENCE:MEDIA](https://tech.recruit-mp.co.jp/mobile/android-data-binding/)

そのデータバインディングがどのように実装されているかソースコードから理解しましょうというセッション、Android二年ぶりの私には難しかった。

ANTLRが使われてるとか、構文解析についてもさらっと触れられていました。
> ANTLR (ANother Tool for Language Recognition)はLL構文解析を用いたパーサジェネレータです。ANTLR自身はJavaで記述されていますが、Java、C、C#、Objective-Cなどさまざまな言語向けのパーサを生成することができます。
出典 : [C++でANTLRを使う - CX5 SOFTWARE](http://cx5software.com/article_antlr/)

## AndroidとCPU

### リンク
[AndroidとCPU // Speaker Deck](https://speakerdeck.com/eggpogg/androidtocpu)

### 概要
AndroidにまつわるCPUとSoCについて解説
> SoCは集積回路の1個のチップ上に、プロセッサコアをはじめ一般的なマイクロコントローラが持つような機能の他、応用目的の機能なども集積し、連携してシステムとして機能するよう設計されている、集積回路製品である。
出典 : https://ja.wikipedia.org/wiki/System-on-a-chip

AndroidのCPUのシェア98%をなぜARMが握っているのか、x86はなぜシェアが取れなかったかみたいな背景について。
最初のAndroid端末がSoCとしてQualcomm iMSM7201だったことからAndroidに搭載されているSoCのもっとも多くがQualcommのSnapdragonであるという話とか。
最近の他の会社が出してるSoCとか。

特に二、三年前にAndroidのエミュレーターが高速化された理由はAndroidがx86対応したからという話とか懐かしいものもありました。

MeltdownとSpectreに関しても少し触れられていました。


## 素晴らしいNDKの世界 / Building High Performance Android Apps with NDK

### リンク
見つからず

### 概要
Google 松田白朗さんと Gerry Fanさんの講演。
ゲームとか、グラフィックス、ハイパフォーマンスなアプリケーションを作成する場合Android NDKを触る必要があるが、そのNDKに関する開発状況、プロファイリングツールやチップスなどを全般的に解説。

> Android NDKとは？
Android Native Development Kitの略称である。
Androidアプリケーションの一部または全部をC/C++言語で開発するためのキットです。
出典 : [Android NDKを触ってみる - Qiita](https://qiita.com/alingogo/items/203477c9da373ab7eacb)


## 既存アプリへのInstant Apps導入


### リンク
[IntroduceInstantApps(DroidKaigi2018) // Speaker Deck](https://speakerdeck.com/aakira/introduceinstantapps-droidkaigi2018)

### 概要
CyberAgent AbemaTV FRESH!の荒谷さんの発表。
表題通りInstant Appsの概要から、Instant Apps対応のため工夫について。またその際のモジュールの設計についてを体系的に解説していただきました。

> Instant appsとは、Googleがユーザー体験の向上を目的として、ユーザーがアプリをインストールすることなくすぐに実行できるようにしたアプリです。Google検索結果などからURLをクリックした際にその時点で必要とされる機能だけをダウンロードすることで一時的にそのアプリの一部機能を使えるようになります。
これにより、アプリのインストールの手間を省き、高速化が可能になっています。
出典 : [Android Instant Appsとは | SEO研究所サクラサクラボ](https://www.sakurasaku-labo.jp/blogs/android-instant-apps)


## TensorFlow for Mobile Heroes

### リンク
見つけられず

### 概要
Google製のDeepLearning FrameworkであるTensorFlowをAndroidで使うにはどうするか、その使用例について。
TensorFlow を AndroidでBuildするにはBazelを使いましょうとか基礎的なことから始まり、分類の例、検出例、分析例などの紹介がありました。

> Bazelは、Googleが社内で自社プロダクトのビルドに使っていたツール「Blaze」をベースとするビルドツールだ。 現在はまだベータ版というステータスだが、今後はAndroid開発向けの標準ビルドツールになるのではとも言われている。
出典 : [Googleが開発する最新ビルドツール「Bazel」を使ってみよう | さくらのナレッジ](https://knowledge.sakura.ad.jp/6174/)


# Androidの通信周りの環境についての話(Swagger, gRPC, GraphQL)

サーバーとクライアント(Android)間のAPI通信に関する三つの手法に関して、DroidKaigi2018のセッションで紹介されていました。
Swagger(フレームワーク), gRPC(プロトコル), GraphQL(クエリ言語)に関して紹介されたそれぞれのセッションについて紹介します。

## [WIP]すばらしきGraphQLのSEKAIへようこそ

### リンク
[すばらしきGraphQLのSEKAIへようこそ // Speaker Deck](https://speakerdeck.com/gfx/subarasikigraphqlfalsesekaiheyoukoso)

### 概要

GraphQLに関するセッション。
> GraphQLはFacebookにより開発されたオープンソースの言語です。API作成の仕組みとしてRESTの代わりに使えます。RESTはAPIの設計と実装に使う概念上の設計モデルですが、GraphQLは標準化された言語、型付け、仕様を持ちクライアントとサーバー間を強力に結びつけます。異なるデバイス間の通信に標準化された言語があることで、大型かつクロスプラットフォームのアプリ開発がよりシンプルになります。
出典 : https://www.webprofessional.jp/rest-2-0-graphql/

Web APIがRESTに代わりGraphQLで提供されるようになるのであれば、Androidエンジニアにとっても無縁ではないので、GraphQLとは何なのか、RESTful APIと比べてどういう利点・欠点があるのか、Java/Kotlinから使うにはどのようにするのかなどを全般的に解説していただきました。

GraphQLは特徴として、リソース取得に特化したWebAPI仕様であり(リクエストからレスポンスの構造がわかり、必要なフィールドだけをリクエストすることが可能)、WebAPIなので通信プロトコルはHTTP準拠ということが挙げられます。

RESTとの違いはこちらが参考になりました
- https://www.slideshare.net/atsu666/rest-graphql-75297436
- https://www.webprofessional.jp/rest-2-0-graphql/

また、Facebookが開発しているGraphQL用のreactベースのView FrameworkであるRelayについても触れられていました。

> Relayは、「データ駆動型のReactアプリケーションを開発するためのJavaScriptのフレームワーク」です。RelayはReact同様、Facebookが開発を進めています。Relayを使うと、サーバから取得したデータをReactのコンポーネントに「props」を使って渡すことが簡単にできるようになります。
出典 : https://mae.chab.in/archives/2732

## [WIP]gRPCとProtocol Buffersで作る、一味違う通信周り

### リンク
[DroidKaigi 2018 gRPC/Protobuf // Speaker Deck](https://speakerdeck.com/kmats/protobuf)

### 概要

サーバーとクライアント(Android)間のAPI通信に関してREST+JSONではなくgRPC+Protocol Buffersを使うという選択肢に関しての検討と導入について解説いただきました。
gRPC, Protocol Buffers共にGoogleが開発した比較的新しい？通信フレームワークおよびシリアライズフォーマットです。
DeepLearningを触ってる方だと、Distributed TensorFlowでgRPCが使われていますし、CaffeでProtocol Buffersが使われていたり、馴染みのある方も多いと思います。

RPC(Remote procedure call)
gRPCはGoogleのProtocol Buffersを利用したRPCのこと

そんなgRPC + Protocol BuffersをどのようにAndroidアプリ開発で用いるのか、メリットやデメリットは何なのか、開発の上で工夫した点などのお話。

## [WIP]まだAPI定義管理で消耗してるの？〜Swaggerを用いた大規模アプリ時代のAPI定義管理とコードジェネレート〜

### リンク

[まだAPI定義管理で消耗してるの？〜Swaggerを用いた大規模アプリ時代のAPI定義管理とコードジェネレート〜 // Speaker Deck](https://speakerdeck.com/magiepooh/madaapiding-yi-guan-li-dexiao-hao-siterufalse-swaggerwoyong-itada-gui-mo-apurishi-dai-falseapiding-yi-guan-li-tokodozienereto)

### 概要

>
昨今のアプリ開発は大規模になってきており、モバイルアプリのエンジニアとサーバサイドのエンジニアが分担し開発することも多いと思います。
>
その際、仕様を含めたAPI定義のすり合わせ、変更についての情報共有などの円滑なコミュニケーションが必要になります。
>
また、API定義の変更に関してはモバイルアプリは漏れがないように迅速に追従していく必要があります。
>
本セッションでは、API定義を管理するSwaggerに焦点を当てます。
>
また、Swaggerを用いてAPI定義からJSONのマッピングオブジェクトを自動生成することにより工数削減と品質向上を図り、生産性を高める方法を紹介します。
>
- Swaggerとは
- Swaggerを用いたAPI定義
- AndroidにおけるSwagger Code Generatorを用いたコード自動生成
- （時間があれば）mustache記法について

# まとめ
今回、初めてDroidKaigiに参加しましたが、Android Developerの熱量というか熱気みたいなものを肌で感じました、何よりこんなに開発者いるんだと素直に思いました。
また、通信周りの話はAndroidに限らず、とても参考になるなと思いました。
改めまして、参加させていただくにあたり、スカラシッププログラムで資金援助をしていただいたWantedly株式会社様、DroidKaigi2018の運営・発表に携わられた全ての皆様に感謝いたします。