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

minSdkVersion=21にしてから1年経った話

 minSdkVersion=21にしてから1年経った話

こやまカニ大好き

July 23, 2019
Tweet

More Decks by こやまカニ大好き

Other Decks in Programming

Transcript

  1. minSdkVersion とは • アプリがサポートする OSの最低バージョンのこと • 高くすればするほど開発が楽になる • 右図は Android

    Studio (stable) で新しくプロジェクト を作るときに出てくる minSdkVersion ごとのサポート 範囲図 • Android Studio (stable) の図は最新のOS分布と比 べて古いので信用してはいけない 4
  2. minSdkVersion を高くすればするほど開発が 楽になる • なぜ開発が楽になるのか? ◦ OS側の挙動の違いが減り考慮すべき部分が少なくなる ▪ targetSdkVersion を低いままにして新しい

    OSの都合を無視して古い OSに挙動をあわせ るという手法が存在したがいまはもう使えない ◦ 新しい開発手法や機能が使えるようになる • minSdkVersion を上げるとどうなるのか ◦ 古いAndroid 端末ではインストールやアップデートができなくなる ◦ 以前のアプリはそのまま使えるのでユーザー数がそのまま減るわけではない 5
  3. これまでの話 • クックパッドでは 2018年5月に国内向けAndroidアプリの minSdkVersion を 21 にした • クックパッドアプリだけでなく、

    cookpadLive や クックパッドマート といった新しいアプリにも適用 • AndroidアプリのminSdkVersionを21にした話 ◦ https://techlife.cookpad.com/entry/2018-05-15-android-minsdkversion-21 6
  4. • 2016年7月に minSdkVersion=16 になった • 2017年2月ごろに minSdkVersion=17 検討スレという issue が立つ

    ◦ 16 -> 17 にするメリットがほとんどなかったため放置される • 2018年1月ごろに minSdkVersion=19 検討スレ に変更される ◦ この時点では主に WebView の挙動に関する議論が中心 ◦ 数ヶ月に一度くらいの頻度で WebView で特定のページ(バナー)が表示されない、表示しようと すると古い端末でアプリがクラッシュするなどの問題が起きていた ◦ 右上画像は社内Slackに存在する絵文字 minSdkVersion = 16 時代 9
  5. • 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
  6. • 2018年2月頃 cookpadLive アプリの開発が始まる ◦ 完全に新規のアプリだったが minSdkVersion=19 でのリリースが検討されていた ◦ これまでの調査で

    API Level 21での変更点の多さは把握できていたので、新規アプリに関して は絶対に minSdkVersion=21 のほうが良いという話をする ◦ 社内ブログに「Android アプリの minSdkVersion は Android 5.0 以降 にすべき」という記事を 書いて開発者以外でも問題点などがわかるようにまとめる ◦ cookpadLive では minSdkVersion=21 でリリースすることになった ◦ これ以降リリースする新規アプリに関しては minSdkVersion=21 にする方針ができた minSdkVersion = 21 の検討(1) 11
  7. • クックパッドアプリも minSdkVersion=21 にしたい ◦ 新規アプリでは minSdkVersion=21 になったが、クックパッドアプリでは OSごとのシェアの問題 があった

    ◦ 16->21の変更なので影響範囲が大きく、 12.6%の端末が対象 ◦ これまでの調査で minSdkVersion=21 にすることで開発効率を改善できることは確信できてい たが、具体的に工数換算することはできない ◦ 最終的に経営層との「クックパッドアプリの開発を高速化するためにはどうすれば良いか」とい う会議で提案をして承認を得て実行することになる ◦ この時点で 2018年4月になっており、方針を決めてから 2ヶ月程度かかっている minSdkVersion = 21 の検討(2) 12
  8. • 定期的に minSdkVersion を上げておいたほうが良い ◦ 実際に上げることはなくても定期的に見直すものという認識は必要 ◦ 今回のように大きくあげようとすると影響範囲が大きくて判断する側も困る ◦ 数年に一度しか変更しないと「

    minSdkVersion 変えるとどうなるんだっけ」という部分から説明 し なおすことになり大変 • 次のminSdkVersion 検討issueは先に用意しておく ◦ 困ったときにこの部分は minSdkVersion = XX になったら解消できるなと思ったら issueにコメン トするようにすると判断材料としてとても役に立つ 当時やっておいたら良かったと思ったこと 13
  9. • values-v21 リソースなどの整理・削除 • ほとんどは android:colorPrimary などの属性を利用するために用意していた theme/style リソース •

    それほど数は多くないが Material Design のバックポートに関する知識がないと 記述箇所と影響範囲を察するのが難しい状態だった 代替リソースの削除 16
  10. • 料理きろくという JobScheduler を利用した機能に関する分岐を削除 • OSバージョンを見てサーバから取ってくる画像を WebP/jpg に分岐していた処 理を削除 ◦

    ほぼすべての画像を WebPで取得するようになりました • 4.x 端末でのみ Picasso の一部 transform を無効化していた分岐を削除 ◦ 端末スペックを考慮したものだったが明確な根拠のない分岐だったので消えてスッキリ API Level に関する分岐処理の削除 17
  11. • API level 21 からはネイティブ Multidex サポートが入ったので削除 • dexcount-gradle-plugin という

    dex ファイルのメソッド数を数えるプラグインも削 除 ◦ 当時もメソッド数を気にしていたわけではなかったが、 Multidex の導入時になんとなく入ってい た ◦ 外すときになってこのプラグインの計測処理に毎回十秒以上かかっていたことが判明する Multidex Support Library の削除 18
  12. • これまでは2種類の drawable を state によって切り替えている箇所が多かった ◦ 以下のような drawable を

    background に指定していた ◦ 画像のタッチフィードバックどうするんだ問題 • 新規実装部分については Ripple で実装する タッチフィードバックの置き換え 19
  13. • https://developer.android.com/training/material/shadows-clipping#Clip • 形状(Outline) を指定することでそこからはみ出した View 自体の描画をカットで きるAPI • ドキュメントに

    android:clipToOutline で指定できると書いてあるが実際にやると ビルドエラーになる ◦ https://issuetracker.google.com/issues/37036728 • 現状うまく利用する方法がないので使っていない View Outline による Clipping 20
  14. Ripple Drawable による変形 Ripple 21 • https://developer.android.com/reference/android/graphics/drawable/Ripp leDrawable.html • 既存のDrawable

    を元に角丸の Ripple などを定義することができる • 9patch を元にした Ripple も作成可能
  15. • 特に画像を含むレイアウトの手前に Ripple を適用したい場合に必要 • API 23 未満ではFrameLayout以外のViewGroupにおいて android:foreground が解釈されない

    • Material Components for Android に ForegroundLinearLayout という便利な やつがある • クックパッドアプリでは ForegroundLinearLayout, ForegroundRelativeLayout を用意して対応 Foreground への Ripple 適用 22
  16. • https://developer.android.com/studio/build/optimize-your-build#use_webp • 画像リソースを WebP 化することによりバイナリサイズの縮小、ビルド時間の短 縮が見込める • minSdkVersion 18

    以上で Lossless WebP への変換が可能 ◦ 画質劣化なし、ビルド速度向上、バイナリサイズ縮小 • クックパッドアプリでは1.2MBの縮小に成功 画像リソースの WebP 化 23
  17. • 現状開発で困っているのは foreground ripple くらいだが、 API level 23 での変 更点は多いので次上げるなら23だと思っている

    • AndroidX Security ライブラリの minSdkVersion が 23 になっている ◦ まだ alpha で、かつ minSdkVersion=19 にする作業が進行中? ◦ https://issuetracker.google.com/issues/132280280 • シェアを見つつどこかのタイミングでminSdkVersion=23推奨にしたい 次の minSdkVersion をどうすべきか 27