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=21
    にしてから1年経った話
    Cookpad.apk #3

    View Slide

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

    View Slide

  3. minSdkVersion とは
    3

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. ● 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. ● API level 21 からはネイティブ Multidex サポートが入ったので削除
    ● dexcount-gradle-plugin という dex ファイルのメソッド数を数えるプラグインも削

    ○ 当時もメソッド数を気にしていたわけではなかったが、 Multidex の導入時になんとなく入ってい

    ○ 外すときになってこのプラグインの計測処理に毎回十秒以上かかっていたことが判明する
    Multidex Support Library の削除
    18

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide