Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Androidアプリをいつまでも楽しく開発し続けるための取り組み

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 Androidアプリをいつまでも楽しく開発し続けるための取り組み

Avatar for こやまカニ大好き

こやまカニ大好き

February 13, 2020
Tweet

More Decks by こやまカニ大好き

Other Decks in Programming

Transcript

  1. 2012年にAndroidアプリをリリース • 一つのチームでアプリを開発 • 当初はほぼWebViewで構成されたアプリ ◦ コンテンツの更新や新機能をすばやくユーザーに提供することを目的としていた ◦ 探すと当時のインタビュー記事が出てくる ◦

    https://el.jibun.atmarkit.co.jp/rails/2012/10/html5-d1ba.html • JavascriptInterface を利用 ◦ Javascript からネイティブ実装を呼び出すための仕組み ◦ この時入った仕組みの一部はいまだにクックパッドアプリで利用されている • 課題 : WebViewによるテスト、不具合検知の難しさ 4
  2. 2014年にフルリニューアル • ネイティブアプリとしてリニューアル • ネイティブ実装によるユーザー体験の向上、メンテナンス性の向上 • 当時は Android Developers の実装ガイドなどが充実していなかったため、

    書いた時期や開発者によって実装スタイルがバラバラ • このころまでは一つのチームで開発を行っていた • 課題 : いつ/どの機能がリリースされるのか周知することが難しい 5
  3. ビルド時間の削減 • ビルド時間を短くするためにできることは公式に書いてある ◦ https://developer.android.com/studio/build/optimize-your-build • モジュールを分割してキャッシュを有効利用する ◦ Gradleキャッシュへの理解を深める •

    Apply Changes がまともに動くようにする ◦ https://developer.android.com/studio/run#apply-changes ◦ 使えない場面のほうが多いが使えたほうが良い場面はもちろんある ◦ debug build variant がまともに動くようにする 16
  4. ビルド時間の削減 • PCのスペックを上げる ◦ モバイル開発者は全員 MacBook Pro ◦ CPU 2.4GHz

    8コア/RAM 32GB ◦ 実際の計測結果などを Gradle build scan で 記録に残しつつ必要スペックを決めている ◦ 検証手順もきちんと残す 18
  5. リリース待ち時間の改善 • 毎週リリース ◦ これまでは重要な施策がある場合そちらを優先して スケジュールを調整していたため、 実際にリリースされるタイミングは不透明だった ◦ https://techlife.cookpad.com/entry/2018/09/14/090000 •

    リリースフローの(半)自動化 • 問題発生時のフロー整備 ◦ 緊急リリースorリリーススキップの判断基準 ◦ 実際の緊急リリース作業のドキュメント化 21
  6. アーキテクチャ/コードベースの改善 • 無法状態(+若干のMVP) -> VIPER ◦ 現在画面のおよそ35%がVIPER化されたコード ◦ サンプルコードを含むドキュメントを整備 •

    既存画面のVIPER化よりも共有コードの改善を優先 • Kotlin 化は昨年後半でかなり進み現在半分以上が Kotlin 23
  7. レガシーコードの改善 • DIの(再)導入 ◦ 以前 Toothpick を導入していた ◦ Toothpick のコード生成が失敗することがあった

    ◦ (特に)シングルトンインスタンスの管理が分散 • KOINを導入 ◦ これまでのシングルトンインスタンス管理もすべて DIに寄せる ◦ DIの利用方法・モジュール分割時の記述方法をドキュメント化 ◦ 新規のコードではKOINの利用を推奨(レビュー時の指摘/お手本PR) 24
  8. レガシーコードの改善 • アプリケーション初期化処理の改善 ◦ ApplicationInitializer というクラスがアプリ内の初期化処理を行っていた ◦ シングルトンインスタンスの初期化など処理順を意識する必要があった ◦ 「depends

    on XXX」 という真偽不明のコメントにより触れない処理たち • 初期化処理を KOIN で行えるものは KOIN で行う • 無理なものはきちんとカテゴリごとに整理してこまかくコメント 26
  9. リリース デバッグ ビルドバリアントの整理 • モジュールによる設定解決 ◦ 接続先設定などのモジュール化 ◦ デバッグ機能のモジュール化 ◦

    モジュールの依存解決によって アプリの設定・機能の切り替えを行う • 実装方法は2種類 ◦ 同一パッケージ/同一クラスにコードを配置 ◦ インターフェイスを共通モジュールにおいて 実装だけを切り替える 28 App_Release App_Debug Feature_Debug Feature_Release Settings_Release Settings_Debug Settings_Base Libraries Features
  10. minSdkVersion 23 のお知らせ • クックパッドアプリでは3月からminSdkVersion を 23 にします ◦ AppCompat

    v1.1.0 が 5.x 端末でクラッシュする問題 ◦ 5.x で `android:foreground` 使えない問題 ◦ Drawable への tint 適用時の挙動などが 5.x で異なる問題 ◦ Samsung 5.x 端末での kotlinx.coroutines クラッシュ問題 など 32