AndroidとかiOSとかモバイル多め。その他技術的なことも書いていきます。

Droidkaigi 2019に参加しました

2019/2/7~2/8に行われたDroidkaigi 2019に参加してきました。

droidkaigi.jp

f:id:phicdy:20190208180006j:plain

弁当おいしかった。 f:id:phicdy:20190208173940j:plain f:id:phicdy:20190208180241j:plain

バリスタさんは長蛇の列でした。おいしかった。 f:id:phicdy:20190208181454j:plain

今年はコントリビュートしました🎉(左上) f:id:phicdy:20190208173855j:plain

パーティーはめっちゃ人がいました... f:id:phicdy:20190208173958j:plain f:id:phicdy:20190208174012j:plain

以下参加したセッションのメモです。

1日目

マルチモジュールなプロジェクトでテストはどう変わる?

speakerdeck.com

  • Mutation testing
    • 変更検知してテストが通ってしまったら変更点に関するテストがないと判断されて失敗する
    • 抜けているテストがわかる
    • PIT pitest.org
  • マルチモジュール化したとき、どの組み合わせまでテストを書くか?を要検討

マルチモジュールプロジェクトでのDagger2を用いたDependency Injection

speakerdeck.com

  • Dagger-AndroidのモチベーションとしてはApplicationがinjectできることを知っているのが良くないよね
  • FragmentInjectが上書きされるので考える必要がある

LiveData と Coroutines で実装する DDD の戦術的設計

y-anz-m.blogspot.com

  • IDをStringにしない(理由は2017?で発表済み)
    • Stringで比べたときに他のIDだとしてもマッチングしてしまう
  • 文字列のテキスト表現をどこに置くか?
    • 誰の関心事か?
      • 日付・時間がモデルの関心事で共通ならモデル
      • UIごとに変わるならUIの関心事
  • Repository
    • オブジェクトがメモリ上にあるかのように振る舞う
  • nullableにするのではなく共通項目をsealed classで定義
  • Lunch, PartyをTimelineItemとしたが、そのようなユビキタス言語はないので悩ましいところ。ドメインエキスパートとすり合わせる
  • suspend は非同期を表明するものとも言える

Master of Android Theme

speakerdeck.com

  • どんなattributeがあるかはAndroid Studioの補完→GitHubでコード見る
  • どう共通化するかでstyle(部分的)かtheme(アプリ全体)か選ぶ

The good and bad of modern app architecture

  • BDDでテストかけるようにしてもメンバーの母国語が英語じゃないから逆にわかりづらくなる
  • きれいな設計にしても新人がなぜこんなにコードを書かなければならないのかとなり教育も大変
  • リリースが迫ってくるとワークアラウンド的に規約から外れたコードが入ってメンテナンスが大変になる
  • 層を分けて担当する

Redux for Android

speakerdeck.com

  • ReduxはFlux実装の一部
  • Reduxは状態管理のため

2日目

中規模以上のアプリ開発におけるCIレシピとリリースフロー戦略

speakerdeck.com

  • BitriseだとGUIで組めて属人化しにくくできる
  • tagトリガーでGoogle Playアップロード
  • 規模の大きいときのfeatureのブランチ名をきめておいてCIを設定
  • Bitriseでは_をつけることで単体では実行できないユーティリティフローとして定義できる
  • Google Play Developer APIで段階公開を自動化できる
  • Crashlytics APIでは統計データを取れないので連携はしんどい

Guide to app architectureを踏まえた既存アプリの設計改良

speakerdeck.com

  • 人的リソースや設計の将来性も考慮する
  • イベントはSingleLiveEventで、状態はDatabindigで行う

Deep dive into MotionLayout

  • スワイプやクリックに応じてViewを動かしたり色を変えたりできる
  • CycleEditorでGUIで設定できる
  • KeyTriggerでどこまでスクロールしたかでモーションを指定できる
  • alpha4でRecyclerViewとの組み合わせが入る。SharedElementTransitionみたいなことがMotionLayoutでできる。

Android Studio設定見直してみませんか?

shiraji.hatenablog.com

  • File Colorでバリアントでビルドされるところが色付けされるの助かる
  • Layout EditorでXMLが左に来るのありがたい...

Lifecycle, LiveData, ViewModels - The inner wiring

  • Android PからonSavedInstanceState()がコールされるタイミングがonStop()の後になった
  • FragmentとFragmentのViewのライフサイクルは異なる

Androidにおけるパフォーマンスチューニング実践

speakerdeck.com

  • ライフサイクルを考慮していつ破棄するのかを意識する
  • レンダリングはハード(HWA)とソフトで2種類ある
    • ソフトは全描画
    • ハードはdirty(必要な分)のみ
  • トラバーサルで描画するのでコストが高い
  • 開発者オプションを有効
    • 赤はoverdrawが4回以上走っているので要改善
  • 階層を減らす。inflateの第二引数をtrue。ConstraintLayoutを使う
  • Protocol bufferでサイズを減らす
  • WebPでサイズ圧縮

Navigation Architecture Component によるアプリ内遷移の管理

speakerdeck.com

  • Deeplink時でもバックスタックを自動形成してくれる
  • SafeArgで引数を渡した遷移のためのメソッドが自動生成される

build.gradle.ktsに移行しよう

speakerdeck.com

  • Kotlin移行で補完が効くようになる。エラーが表示されるようになる
  • 一部分だけでも移行できる
  • エラー修正の最終手段はgroovyとして別ファイルで読み込む

おわりに

今年はマルチモジュール関連の話が多かった印象でした。Droidkaigiに参加しているようなエンジニアでもまだまだ導入できてないところが多そうなのでまだ安心・・・という訳じゃないですが、積極的にマルチモジュール化していきたいと感じました。アーキテクチャ系の話もいくつか聞きましたが、MVVMからFluxにしたみたいな話もあったのでFluxの何がいいか調べ始めないとだめだなと。その上でMVP/MVVM/Flux/その他でどのアーキテクチャがアプリに適しているかを検討したい。

MotlonLayoutやNavigationは導入したら面白そうだなという雰囲気を感じれたので導入機会を探っていきたいところ。AACは入っているの当たり前でしょ感があったのでMVPだったらどう入れるか?MVVMにしてViewModel入れるか?等考えたほうがいいなと思いました。

2日間お疲れ様でした。