Konifar's WIP

親方!空からどらえもんが!

potatotips #28 Android発表まとめ

モバイルアプリの知見共有会であるpotatotipsにブログまとめ枠で参加してきました。

potatotips.connpass.com

会場は外苑前にあるエウレカさんのシャレオツなオフィスでした。

f:id:konifar:20160420203750p:plain

f:id:konifar:20160420205748p:plain

資料はいつものGitHubリポジトリに上がると思うので、Androidの発表を聞いて自分が考えたことをメインにざっくりまとめます。

API仕様書をいい感じに管理する

yuyakaidoさんによる、アプリとサーバーサイドのAPI仕様の共有に関する知見の共有でした。

speakerdeck.com

APIのレスポンスがサーバーと違う」「APIの開発待ちでアプリの開発が止まってしまう」といった、ありがちな問題を、APIドキュメントサービスを使って解決しようという話でした。ApiarySwaggerの2つが紹介されていましたが、Swaggerの方がクライアントコードの生成ができるなどApiaryよりよさそうとのことでした。

モックサーバーとして動かせるところは嬉しいですね。レスポンスからクライアントのモデルクラスを出力してくれる機能も地味に便利そうです。一点きになったのは、Swaggerにドキュメントを書くこと自体がめんどくさくならないかという点です。今の会社ではRSpecを実行するとControllerのテストを元にレスポンスなどが書かれたAPIドキュメントを出力するようにしていたのですが、もし実際のサーバーサイドのコードやテストとSwaggerが連携できたら最高だなぁと思いました。

Chrome Custom Tabs を導入した話

shihochanさんによる、Chrome Custom Tabsの知見の共有でした。

本業のキュレーションアプリでWebViewでの実装が辛かったのでChrome Custom Tabsを導入したとのことでした。Chrome Custom TabsはChromeがインストールされてなかったら標準ブラウザを開いてくれたり、起動を高速化するためのプリロードの仕組みも標準で用意されていたりとわりと使いやすくていい感じです。

発表の中ではChromeChrome Custom TabsとWebViewを3つ並べて動作を比較していてわかりやすかったです。アニメーションで動きのある発表は面白くていいですね。

自分が以前に作った時はUtilityメソッドを使って起動するようにしていたんですが、もっとクールなやり方があれば知りたいです。

droidkaigi2016/AppUtil.java at master · konifar/droidkaigi2016 · GitHub

public static void showWebPage(Activity activity, @NonNull String url) {
    CustomTabsIntent intent = new CustomTabsIntent.Builder()
            .setShowTitle(true)
            .setToolbarColor(ContextCompat.getColor(activity, R.color.theme500))
            .build();

    intent.launchUrl(activity, Uri.parse(url));
}

広告SDKのお話

Shigeki Yamatoさんによる、広告SDKの作り手としての話でした。広告SDKの辛みの話かと思いきや、作ってる中の人の話だったので非常に興味深かったです。

ネイティブ、インタースティシャル、動画リワードなどひと通り本業で使ってみていたので、中の話が聞けてなるほどなと思いました。個人的にはもう少し中のコードレベルの開発の話が聞きたかったのですが、LTだと難しいですね。悩ましいところです。

AndroidScreenMonitorのアンチパターンWindows

tarotaroさんによる、AndroidScreenMonitorのニッチなTipsの発表でした。

www.slideshare.net

asm.jarが使えないPCでも実行できるように、Launch4jを使ってjarをラップしてexeを作るというお話でした。

AndroidScreenMonitorを@adakodaさんが作っていたのを初めて知りました!昔Windowsでjava1.4やdelphiを使って仕事していた時代を思い出して、非常にノスタルジックな気持ちになりました。

CQRSの考え方をモバイルに適用してみる

kgmyshinさんによる、CQRSをAndroidの設計にどう落としこむかという発表でした。

speakerdeck.com

CQRSというのはCommand Query Responsibility Segregationの略で、DDDの中に出てくる概念の1つです。

http://martinfowler.com/bliki/CQRS.html

EventBusを使ってどう落としこむかを、具体的なコードを示しながら説明してくれていました。正直聞くだけではいまいちピンとこなかったのですが、こういう設計の話は実際に書いて試行錯誤した者にしかわからないところもあるので、自分も手を動かしながら資料を見返してみたいなぁと思いました。

実際に書いてみたサンプルリポジトリも用意されています。

github.com

Building apps using CustomViews

@KeithYokomaさんによる、FragmentではなくCustomViewを使ってアプリを作るという発表でした。

Fragmentは皆知ってのとおりライフサイクルの複雑さを筆頭にいろいろと辛いところがあります。SquareもFragmentやめると言っていますね。よこまくさんは本業のDrivemodeでもCustomViewを使って開発されているとのことです。使っているのはflowとmortarというSquare製のライブラリです。flowとmortarについてはRealmの記事が参考になります。

realm.io

ActivityがServiceに置き換えられるところが大きなメリットで、Drivemodeでもそこがよくて採用したとのことでした。自分は昔一度ちょろっと触ってみて概念の理解に時間がかかってすぐやめてしまったのですが、また見てみようかなと思いました。

AppLaunchChecker

@magiepoohさんによる、SupportLibrary23.3.0で追加されたAppLaunchCheckerについての発表でした。

ランチャーから起動したかどうかをチェックできるだけという思った以上にシンプルなクラスでした。中のコードも発表のスライドに収まるくらいシンプルな実装でした。

「ランチャーで起動したかを検知できる機能」かと思いきや、実は内部でPreferenceに値をセットしておりその値をリセットしておらず、じつは 「過去に一度でもランチャーから起動したかを検知できる機能」だという話を聞き、やはりAndroidはロックだなぁとしみじみしました。

まとめ

今回も設計やSupport LibraryのTipsなど様々な分野での発表があり、勉強になりました。

iOSでもRxの発表がいくつかあり、RxのSubjectやObservableの概念はAndroidでもiOSでも共通なので、聞いていてすっと理解できておもしろかったです。

現場からは以上です。