Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Androidアプリをいつまでも楽しく開発し続けるための取り組み
Search
こやまカニ大好き
February 13, 2020
Programming
5
2.4k
Androidアプリをいつまでも楽しく開発し続けるための取り組み
cookpad.apk #4
https://cookpad.connpass.com/event/165136/
こやまカニ大好き
February 13, 2020
Tweet
Share
More Decks by こやまカニ大好き
See All by こやまカニ大好き
マルチモジュールアプリの画面遷移処理実装
nein37
0
6k
クックパッド Android アプリのマルチモジュール化とデモアプリの活用
nein37
1
6.6k
2020年代の WebView 実装 / saikou_no_webview_2021
nein37
2
11k
minSdkVersion=21にしてから1年経った話
nein37
8
2.2k
Androidアプリエンジニアの基礎知識
nein37
16
11k
クックパッドアプリのマルチモジュール化への取り組み
nein37
11
10k
Android のセキュリティよくなってきた話
nein37
3
2.3k
Androidアプリのデザイン整理への取り組み
nein37
1
930
Androidアプリのタブレット向けレイアウト
nein37
4
1.1k
Other Decks in Programming
See All in Programming
dRuby 入門者によるあなたの身近にあるdRuby 入門
makicamel
4
340
現代のVueとTypeScript - 型安全の活用術
minako__ph
4
3.1k
月間4.5億回再生を超える大規模サービス TVer iOSアプリのリアーキテクチャ戦略 - iOSDC2024
techtver
PRO
1
560
マイグレーションコード自作して File-Based Routing に自動移行!! ~250 ページの歴史的経緯を添えて~
cut0
1
240
長期運用プロダクトの開発速度を維持し続けるためのリファクタリング実践例
wataruss
8
2.5k
connect-go で面倒くささと戦う / 2024-08-27 #newmo_layerx_go
izumin5210
2
580
Some more adventure of Happy Eyeballs
coe401_
2
150
Swiftで高速フーリエ変換してオーディオビジュアライザーを作る / iOSDC Japan 2024 Day1 Track D
kyome22
2
460
Using Livebook to build and deploy internal tools @ ElixirConf 2024
hugobarauna
0
210
Hono・Prisma・AWSでGeoなAPI開発
nokonoko1203
5
600
Boost Your Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
1
900
TypeScriptで 負荷テストを書こう 〜k6のシングルバイナリの秘密〜
dora1998
7
2.8k
Featured
See All Featured
Building Adaptive Systems
keathley
36
2.1k
Optimizing for Happiness
mojombo
375
69k
Documentation Writing (for coders)
carmenintech
65
4.3k
[RailsConf 2023] Rails as a piece of cake
palkan
44
4.6k
Designing the Hi-DPI Web
ddemaree
278
34k
It's Worth the Effort
3n
182
27k
The Invisible Customer
myddelton
119
13k
Typedesign – Prime Four
hannesfritz
38
2.3k
Being A Developer After 40
akosma
82
580k
Six Lessons from altMBA
skipperchong
26
3.3k
Clear Off the Table
cherdarchuk
90
320k
The Mythical Team-Month
searls
218
43k
Transcript
Androidアプリをいつまでも楽しく開発 し続けるための取り組み Cookpad.apk #4
自己紹介 こやまカニ大好き(@nein37) モバイル基盤部所属 社内全Androidプロジェクトの開発効率化と技術サポート minSdkVersion 上げたりモジュール分割したりしてます 2
android-cookpad アプリのこ れまでの歩み 3
2012年にAndroidアプリをリリース • 一つのチームでアプリを開発 • 当初はほぼWebViewで構成されたアプリ ◦ コンテンツの更新や新機能をすばやくユーザーに提供することを目的としていた ◦ 探すと当時のインタビュー記事が出てくる ◦
https://el.jibun.atmarkit.co.jp/rails/2012/10/html5-d1ba.html • JavascriptInterface を利用 ◦ Javascript からネイティブ実装を呼び出すための仕組み ◦ この時入った仕組みの一部はいまだにクックパッドアプリで利用されている • 課題 : WebViewによるテスト、不具合検知の難しさ 4
2014年にフルリニューアル • ネイティブアプリとしてリニューアル • ネイティブ実装によるユーザー体験の向上、メンテナンス性の向上 • 当時は Android Developers の実装ガイドなどが充実していなかったため、
書いた時期や開発者によって実装スタイルがバラバラ • このころまでは一つのチームで開発を行っていた • 課題 : いつ/どの機能がリリースされるのか周知することが難しい 5
モバイル基盤誕生 • 各部署のメンバーが担当する機能の開発を行う方式へ • CI整備やリリース作業などどの部署にも属さない役割のカバーや全体的な効率 化のためにモバイル基盤グループが誕生 • アプリの状態監視や各機能のバグ修正も行っていた • 課題
: リリースごとに各部署の調整が必要になっていて高コスト 6
フルリニューアル後リリースフローを整備 • アプリの運用ルールを整備 ◦ 2週間毎のリリース ◦ 開発・テスト・リリース後監視フローの整理 ◦ リリーマネージャ・監視の手順化・持ち回り •
課題:各施策・各部署の連携と開発リソース調整 7
モバイル基盤の役割の明確化 • モバイル開発に関する課題を解決する部署へ • バグ調査やリリースまわりの調整から開発しやすさの向上へ • Danger などのコードレビュー負荷軽減 • CI・開発環境の改善
• ビルド時間の計測・改善に向けた努力 • リリースに関する負荷の軽減 8
楽しいAndroid開発#とは 9
Androidアプリの開発 • ユーザーに価値を届けるための開発 • 最小のコストで機能開発/バグ修正を行う • 最小のコストでユーザーの手元に届ける • コスト=時間+手間 10
時間がかかると楽しくない • ビルド時間が長い • CIの待ち時間が長い • 変更がマージされてから リリースまでの時間が長い 11
• コードをどこに書けば良いのかわからない • コードをどう書けば良いのかわからない • 認証処理・ユーザー状態の判定が難しい • 古いJavaコード触りたくない • 意味不明なビルドバリアント
手間がかかると楽しくない 12
モバイル基盤部の役割 • 時間と手間を最小限にするために取り組む • アプリ開発を魅力的なものにする • ユーザーに新しい価値を 素早く届けられるようにする • モバイル基盤部の目標にも「生産性について」
という項目があり、機能開発にかかる時間を 最小化することを明確に目標にしている 13
実際の取り組み(時間) 14
ビルド時間の削減 • ビルドの時間が遅いと全てが遅いので優先度は高い • まずは測定するところから始める ◦ ビルド時間を可視化できると成果がでたときにも嬉しい • 差分ビルド時間の最小化にフォーカスする ◦
開発者の手元の作業によって大きく変動するので細かい数値は追わないほうが良い ◦ 一定期間の傾向としての増減で見ている 15
ビルド時間の削減 • ビルド時間を短くするためにできることは公式に書いてある ◦ https://developer.android.com/studio/build/optimize-your-build • モジュールを分割してキャッシュを有効利用する ◦ Gradleキャッシュへの理解を深める •
Apply Changes がまともに動くようにする ◦ https://developer.android.com/studio/run#apply-changes ◦ 使えない場面のほうが多いが使えたほうが良い場面はもちろんある ◦ debug build variant がまともに動くようにする 16
ビルド時間の削減 • minSdkVersion を上げる ◦ 過去のOSバージョンをサポートするためにやっている処理が不要になるビルド時間を短縮 ◦ 特に minSdkVersion 21
未満の場合に有効 17
ビルド時間の削減 • PCのスペックを上げる ◦ モバイル開発者は全員 MacBook Pro ◦ CPU 2.4GHz
8コア/RAM 32GB ◦ 実際の計測結果などを Gradle build scan で 記録に残しつつ必要スペックを決めている ◦ 検証手順もきちんと残す 18
ビルド時間の削減 • ビルド時間の改善は影響の大きそうなところから崩していく • 後はひたすらモジュール分割とGradle/Gradle Plugin の改善についていく • アプリの仕様やマシンの見直しも必要ならやっていく 19
CI待ち時間の改善 • 最近 CodeBuild に切り替えた ◦ https://techlife.cookpad.com/entry/2020/01/30/100000 • CIビルド時間はまだ改善の余地がありそう •
ジョブの分割によって問題のある箇所がわかりやすくなった 20
リリース待ち時間の改善 • 毎週リリース ◦ これまでは重要な施策がある場合そちらを優先して スケジュールを調整していたため、 実際にリリースされるタイミングは不透明だった ◦ https://techlife.cookpad.com/entry/2018/09/14/090000 •
リリースフローの(半)自動化 • 問題発生時のフロー整備 ◦ 緊急リリースorリリーススキップの判断基準 ◦ 実際の緊急リリース作業のドキュメント化 21
実際の取り組み(手間) 22
アーキテクチャ/コードベースの改善 • 無法状態(+若干のMVP) -> VIPER ◦ 現在画面のおよそ35%がVIPER化されたコード ◦ サンプルコードを含むドキュメントを整備 •
既存画面のVIPER化よりも共有コードの改善を優先 • Kotlin 化は昨年後半でかなり進み現在半分以上が Kotlin 23
レガシーコードの改善 • DIの(再)導入 ◦ 以前 Toothpick を導入していた ◦ Toothpick のコード生成が失敗することがあった
◦ (特に)シングルトンインスタンスの管理が分散 • KOINを導入 ◦ これまでのシングルトンインスタンス管理もすべて DIに寄せる ◦ DIの利用方法・モジュール分割時の記述方法をドキュメント化 ◦ 新規のコードではKOINの利用を推奨(レビュー時の指摘/お手本PR) 24
レガシーコードの改善 • 認証・通信処理の改善 ◦ 最初は認証モジュール・通信モジュールで分離していた ◦ 通信途中での再認証など特殊な処理が多いため、認証・通信モジュールにした ◦ Kotlin の
internal と組み合わせて可視性を最適化 25
レガシーコードの改善 • アプリケーション初期化処理の改善 ◦ ApplicationInitializer というクラスがアプリ内の初期化処理を行っていた ◦ シングルトンインスタンスの初期化など処理順を意識する必要があった ◦ 「depends
on XXX」 という真偽不明のコメントにより触れない処理たち • 初期化処理を KOIN で行えるものは KOIN で行う • 無理なものはきちんとカテゴリごとに整理してこまかくコメント 26
レガシーコードの改善 • その他の取り組みなど ◦ Cookpad.apk や 技術ブログで随時共有しています ◦ https://techlife.cookpad.com/entry/2019/10/21/144205 ◦
https://techlife.cookpad.com/entry/2020/01/16/090000 ◦ https://cookpad.connpass.com/event/137772/ 27
リリース デバッグ ビルドバリアントの整理 • モジュールによる設定解決 ◦ 接続先設定などのモジュール化 ◦ デバッグ機能のモジュール化 ◦
モジュールの依存解決によって アプリの設定・機能の切り替えを行う • 実装方法は2種類 ◦ 同一パッケージ/同一クラスにコードを配置 ◦ インターフェイスを共通モジュールにおいて 実装だけを切り替える 28 App_Release App_Debug Feature_Debug Feature_Release Settings_Release Settings_Debug Settings_Base Libraries Features
まとめ 29
まとめ • アプリ開発にかかる時間と手間を最小化することで 楽しく開発を続けることができる • クックパッドではモバイル基盤が業務として 時間と手間を最小化に取り組んでいる • これからも引き続きユーザーに価値を届けるための開発を サポートしていく
30
おまけ 31
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