Slide 1

Slide 1 text

minSdkVersion=21 にしてから1年経った話 Cookpad.apk #3

Slide 2

Slide 2 text

自己紹介 こやまカニ大好き(@nein37) モバイル基盤部所属 社内全Androidプロジェクトの開発効率化と技術サポート minSdkVersion 上げたりモジュール分割したりしてます 2

Slide 3

Slide 3 text

minSdkVersion とは 3

Slide 4

Slide 4 text

minSdkVersion とは ● アプリがサポートする OSの最低バージョンのこと ● 高くすればするほど開発が楽になる ● 右図は Android Studio (stable) で新しくプロジェクト を作るときに出てくる minSdkVersion ごとのサポート 範囲図 ● Android Studio (stable) の図は最新のOS分布と比 べて古いので信用してはいけない 4

Slide 5

Slide 5 text

minSdkVersion を高くすればするほど開発が 楽になる ● なぜ開発が楽になるのか? ○ OS側の挙動の違いが減り考慮すべき部分が少なくなる ■ targetSdkVersion を低いままにして新しい OSの都合を無視して古い OSに挙動をあわせ るという手法が存在したがいまはもう使えない ○ 新しい開発手法や機能が使えるようになる ● minSdkVersion を上げるとどうなるのか ○ 古いAndroid 端末ではインストールやアップデートができなくなる ○ 以前のアプリはそのまま使えるのでユーザー数がそのまま減るわけではない 5

Slide 6

Slide 6 text

これまでの話 ● クックパッドでは 2018年5月に国内向けAndroidアプリの minSdkVersion を 21 にした ● クックパッドアプリだけでなく、 cookpadLive や クックパッドマート といった新しいアプリにも適用 ● AndroidアプリのminSdkVersionを21にした話 ○ https://techlife.cookpad.com/entry/2018-05-15-android-minsdkversion-21 6

Slide 7

Slide 7 text

今日話す内容 ● minSdkVersion=21 にするためにやったこと ● minSdkVersion=21 にした後クックパッドアプリでやったこと ● minSdkVersion=21 にしてから起きた問題 ● 次の minSdkVersion をどうするか 7

Slide 8

Slide 8 text

minSdkVersion=21 にするまでにやったこと 8

Slide 9

Slide 9 text

● 2016年7月に minSdkVersion=16 になった ● 2017年2月ごろに minSdkVersion=17 検討スレという issue が立つ ○ 16 -> 17 にするメリットがほとんどなかったため放置される ● 2018年1月ごろに minSdkVersion=19 検討スレ に変更される ○ この時点では主に WebView の挙動に関する議論が中心 ○ 数ヶ月に一度くらいの頻度で WebView で特定のページ(バナー)が表示されない、表示しようと すると古い端末でアプリがクラッシュするなどの問題が起きていた ○ 右上画像は社内Slackに存在する絵文字 minSdkVersion = 16 時代 9

Slide 10

Slide 10 text

● Chromium WebView 化による開発効率改善 ○ Chromium WebView への移行ドキュメントで変更点 がまとめられている ○ Android 4.4 から WebView のリモートデバッグが可能になっている ○ ただし 4.4 では WebView コンポーネントはOSの一部であり、本格的に各端末の WebView の 挙動が揃うようになるのは Android 5.0 から ● Android 5.0 で変更される部分の多さ ○ elevation, tint, ripple といったデザイン要素の追加 ○ vector drawable や multi dex の標準サポート ○ TLS 1.2 標準サポート ○ いっそ minSdkVersion=21 にしたほうが良いのでは? (ここで思考が停止する ) minSdkVersion = 19 の検討 10

Slide 11

Slide 11 text

● 2018年2月頃 cookpadLive アプリの開発が始まる ○ 完全に新規のアプリだったが minSdkVersion=19 でのリリースが検討されていた ○ これまでの調査で API Level 21での変更点の多さは把握できていたので、新規アプリに関して は絶対に minSdkVersion=21 のほうが良いという話をする ○ 社内ブログに「Android アプリの minSdkVersion は Android 5.0 以降 にすべき」という記事を 書いて開発者以外でも問題点などがわかるようにまとめる ○ cookpadLive では minSdkVersion=21 でリリースすることになった ○ これ以降リリースする新規アプリに関しては minSdkVersion=21 にする方針ができた minSdkVersion = 21 の検討(1) 11

Slide 12

Slide 12 text

● クックパッドアプリも minSdkVersion=21 にしたい ○ 新規アプリでは minSdkVersion=21 になったが、クックパッドアプリでは OSごとのシェアの問題 があった ○ 16->21の変更なので影響範囲が大きく、 12.6%の端末が対象 ○ これまでの調査で minSdkVersion=21 にすることで開発効率を改善できることは確信できてい たが、具体的に工数換算することはできない ○ 最終的に経営層との「クックパッドアプリの開発を高速化するためにはどうすれば良いか」とい う会議で提案をして承認を得て実行することになる ○ この時点で 2018年4月になっており、方針を決めてから 2ヶ月程度かかっている minSdkVersion = 21 の検討(2) 12

Slide 13

Slide 13 text

● 定期的に minSdkVersion を上げておいたほうが良い ○ 実際に上げることはなくても定期的に見直すものという認識は必要 ○ 今回のように大きくあげようとすると影響範囲が大きくて判断する側も困る ○ 数年に一度しか変更しないと「 minSdkVersion 変えるとどうなるんだっけ」という部分から説明 し なおすことになり大変 ● 次のminSdkVersion 検討issueは先に用意しておく ○ 困ったときにこの部分は minSdkVersion = XX になったら解消できるなと思ったら issueにコメン トするようにすると判断材料としてとても役に立つ 当時やっておいたら良かったと思ったこと 13

Slide 14

Slide 14 text

minSdkVersion=21 にしてからやったこと 14

Slide 15

Slide 15 text

● 当初は古いAPKを残し、minSdkVersionを上げる直前のバージョンまでのアップ デートと新規インストールはできるようにする予定だった ● 新規にアプリをインストールする Android 4.x ユーザーの少なさとユーザーサ ポートのしやすさから古いAPKを無効化することにした 古いAPKの無効化 15

Slide 16

Slide 16 text

● values-v21 リソースなどの整理・削除 ● ほとんどは android:colorPrimary などの属性を利用するために用意していた theme/style リソース ● それほど数は多くないが Material Design のバックポートに関する知識がないと 記述箇所と影響範囲を察するのが難しい状態だった 代替リソースの削除 16

Slide 17

Slide 17 text

● 料理きろくという JobScheduler を利用した機能に関する分岐を削除 ● OSバージョンを見てサーバから取ってくる画像を WebP/jpg に分岐していた処 理を削除 ○ ほぼすべての画像を WebPで取得するようになりました ● 4.x 端末でのみ Picasso の一部 transform を無効化していた分岐を削除 ○ 端末スペックを考慮したものだったが明確な根拠のない分岐だったので消えてスッキリ API Level に関する分岐処理の削除 17

Slide 18

Slide 18 text

● API level 21 からはネイティブ Multidex サポートが入ったので削除 ● dexcount-gradle-plugin という dex ファイルのメソッド数を数えるプラグインも削 除 ○ 当時もメソッド数を気にしていたわけではなかったが、 Multidex の導入時になんとなく入ってい た ○ 外すときになってこのプラグインの計測処理に毎回十秒以上かかっていたことが判明する Multidex Support Library の削除 18

Slide 19

Slide 19 text

● これまでは2種類の drawable を state によって切り替えている箇所が多かった ○ 以下のような drawable を background に指定していた ○ 画像のタッチフィードバックどうするんだ問題 ● 新規実装部分については Ripple で実装する タッチフィードバックの置き換え 19

Slide 20

Slide 20 text

● https://developer.android.com/training/material/shadows-clipping#Clip ● 形状(Outline) を指定することでそこからはみ出した View 自体の描画をカットで きるAPI ● ドキュメントに android:clipToOutline で指定できると書いてあるが実際にやると ビルドエラーになる ○ https://issuetracker.google.com/issues/37036728 ● 現状うまく利用する方法がないので使っていない View Outline による Clipping 20

Slide 21

Slide 21 text

Ripple Drawable による変形 Ripple 21 ● https://developer.android.com/reference/android/graphics/drawable/Ripp leDrawable.html ● 既存のDrawable を元に角丸の Ripple などを定義することができる ● 9patch を元にした Ripple も作成可能

Slide 22

Slide 22 text

● 特に画像を含むレイアウトの手前に Ripple を適用したい場合に必要 ● API 23 未満ではFrameLayout以外のViewGroupにおいて android:foreground が解釈されない ● Material Components for Android に ForegroundLinearLayout という便利な やつがある ● クックパッドアプリでは ForegroundLinearLayout, ForegroundRelativeLayout を用意して対応 Foreground への Ripple 適用 22

Slide 23

Slide 23 text

● https://developer.android.com/studio/build/optimize-your-build#use_webp ● 画像リソースを WebP 化することによりバイナリサイズの縮小、ビルド時間の短 縮が見込める ● minSdkVersion 18 以上で Lossless WebP への変換が可能 ○ 画質劣化なし、ビルド速度向上、バイナリサイズ縮小 ● クックパッドアプリでは1.2MBの縮小に成功 画像リソースの WebP 化 23

Slide 24

Slide 24 text

minSdkVersion=21 にしてから起きた問題 24

Slide 25

Slide 25 text

● Android 4.x がサポート外になったことに関する直接のご意見は10件未満 ● ほとんどが新しく 4.x 端末を入手したユーザーさんのインストールできないという ご意見 ● 事前にサポートチームと連携していたので大きな問題はなかった Android 4.x のサポートに関する問題 25

Slide 26

Slide 26 text

● 2014年にリリースしたバージョンで非常に再現率の高いクラッシュが発生 ● 対象端末はほぼ全てOS 4.x でアプリの更新を案内できない ● 大抵はAPIなどの挙動変更によるものなので個別に方針を決めて対処する ● クラッシュ監視やログなどの実装ができていることを確認してから minSdkVersion を上げましょう 古いアプリバージョンでのクラッシュ 26

Slide 27

Slide 27 text

● 現状開発で困っているのは foreground ripple くらいだが、 API level 23 での変 更点は多いので次上げるなら23だと思っている ● AndroidX Security ライブラリの minSdkVersion が 23 になっている ○ まだ alpha で、かつ minSdkVersion=19 にする作業が進行中? ○ https://issuetracker.google.com/issues/132280280 ● シェアを見つつどこかのタイミングでminSdkVersion=23推奨にしたい 次の minSdkVersion をどうすべきか 27

Slide 28

Slide 28 text

ありがとうございました 28