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
minSdkVersion=21にしてから1年経った話
Search
こやまカニ大好き
July 23, 2019
Programming
2.4k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
minSdkVersion=21にしてから1年経った話
こやまカニ大好き
July 23, 2019
More Decks by こやまカニ大好き
See All by こやまカニ大好き
Androidアプリの One Experience リリース
nein37
0
5.5k
マルチモジュールアプリの画面遷移処理実装
nein37
0
6.7k
クックパッド Android アプリのマルチモジュール化とデモアプリの活用
nein37
1
7k
2020年代の WebView 実装 / saikou_no_webview_2021
nein37
2
12k
Androidアプリをいつまでも楽しく開発し続けるための取り組み
nein37
5
2.7k
Androidアプリエンジニアの基礎知識
nein37
16
11k
クックパッドアプリのマルチモジュール化への取り組み
nein37
11
11k
Android のセキュリティよくなってきた話
nein37
3
2.5k
Androidアプリのデザイン整理への取り組み
nein37
1
1.1k
Other Decks in Programming
See All in Programming
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
150
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
610
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
Vite+ Unified Toolchain for the Web
naokihaba
0
740
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
220
symfony/aiとlaravel/boost
77web
0
120
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
120
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
140
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
110
初めてのKubernetes 本番運用でハマった話
oku053
0
120
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
8.9k
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
5.7k
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
New Earth Scene 8
popppiees
3
2.4k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Navigating Team Friction
lara
192
16k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
360
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
490
Rails Girls Zürich Keynote
gr2m
96
14k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
970
sira's awesome portfolio website redesign presentation
elsirapls
0
300
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
Transcript
minSdkVersion=21 にしてから1年経った話 Cookpad.apk #3
自己紹介 こやまカニ大好き(@nein37) モバイル基盤部所属 社内全Androidプロジェクトの開発効率化と技術サポート minSdkVersion 上げたりモジュール分割したりしてます 2
minSdkVersion とは 3
minSdkVersion とは • アプリがサポートする OSの最低バージョンのこと • 高くすればするほど開発が楽になる • 右図は Android
Studio (stable) で新しくプロジェクト を作るときに出てくる minSdkVersion ごとのサポート 範囲図 • Android Studio (stable) の図は最新のOS分布と比 べて古いので信用してはいけない 4
minSdkVersion を高くすればするほど開発が 楽になる • なぜ開発が楽になるのか? ◦ OS側の挙動の違いが減り考慮すべき部分が少なくなる ▪ targetSdkVersion を低いままにして新しい
OSの都合を無視して古い OSに挙動をあわせ るという手法が存在したがいまはもう使えない ◦ 新しい開発手法や機能が使えるようになる • minSdkVersion を上げるとどうなるのか ◦ 古いAndroid 端末ではインストールやアップデートができなくなる ◦ 以前のアプリはそのまま使えるのでユーザー数がそのまま減るわけではない 5
これまでの話 • クックパッドでは 2018年5月に国内向けAndroidアプリの minSdkVersion を 21 にした • クックパッドアプリだけでなく、
cookpadLive や クックパッドマート といった新しいアプリにも適用 • AndroidアプリのminSdkVersionを21にした話 ◦ https://techlife.cookpad.com/entry/2018-05-15-android-minsdkversion-21 6
今日話す内容 • minSdkVersion=21 にするためにやったこと • minSdkVersion=21 にした後クックパッドアプリでやったこと • minSdkVersion=21 にしてから起きた問題
• 次の minSdkVersion をどうするか 7
minSdkVersion=21 にするまでにやったこと 8
• 2016年7月に minSdkVersion=16 になった • 2017年2月ごろに minSdkVersion=17 検討スレという issue が立つ
◦ 16 -> 17 にするメリットがほとんどなかったため放置される • 2018年1月ごろに minSdkVersion=19 検討スレ に変更される ◦ この時点では主に WebView の挙動に関する議論が中心 ◦ 数ヶ月に一度くらいの頻度で WebView で特定のページ(バナー)が表示されない、表示しようと すると古い端末でアプリがクラッシュするなどの問題が起きていた ◦ 右上画像は社内Slackに存在する絵文字 minSdkVersion = 16 時代 9
• 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
• 2018年2月頃 cookpadLive アプリの開発が始まる ◦ 完全に新規のアプリだったが minSdkVersion=19 でのリリースが検討されていた ◦ これまでの調査で
API Level 21での変更点の多さは把握できていたので、新規アプリに関して は絶対に minSdkVersion=21 のほうが良いという話をする ◦ 社内ブログに「Android アプリの minSdkVersion は Android 5.0 以降 にすべき」という記事を 書いて開発者以外でも問題点などがわかるようにまとめる ◦ cookpadLive では minSdkVersion=21 でリリースすることになった ◦ これ以降リリースする新規アプリに関しては minSdkVersion=21 にする方針ができた minSdkVersion = 21 の検討(1) 11
• クックパッドアプリも minSdkVersion=21 にしたい ◦ 新規アプリでは minSdkVersion=21 になったが、クックパッドアプリでは OSごとのシェアの問題 があった
◦ 16->21の変更なので影響範囲が大きく、 12.6%の端末が対象 ◦ これまでの調査で minSdkVersion=21 にすることで開発効率を改善できることは確信できてい たが、具体的に工数換算することはできない ◦ 最終的に経営層との「クックパッドアプリの開発を高速化するためにはどうすれば良いか」とい う会議で提案をして承認を得て実行することになる ◦ この時点で 2018年4月になっており、方針を決めてから 2ヶ月程度かかっている minSdkVersion = 21 の検討(2) 12
• 定期的に minSdkVersion を上げておいたほうが良い ◦ 実際に上げることはなくても定期的に見直すものという認識は必要 ◦ 今回のように大きくあげようとすると影響範囲が大きくて判断する側も困る ◦ 数年に一度しか変更しないと「
minSdkVersion 変えるとどうなるんだっけ」という部分から説明 し なおすことになり大変 • 次のminSdkVersion 検討issueは先に用意しておく ◦ 困ったときにこの部分は minSdkVersion = XX になったら解消できるなと思ったら issueにコメン トするようにすると判断材料としてとても役に立つ 当時やっておいたら良かったと思ったこと 13
minSdkVersion=21 にしてからやったこと 14
• 当初は古いAPKを残し、minSdkVersionを上げる直前のバージョンまでのアップ デートと新規インストールはできるようにする予定だった • 新規にアプリをインストールする Android 4.x ユーザーの少なさとユーザーサ ポートのしやすさから古いAPKを無効化することにした 古いAPKの無効化
15
• values-v21 リソースなどの整理・削除 • ほとんどは android:colorPrimary などの属性を利用するために用意していた theme/style リソース •
それほど数は多くないが Material Design のバックポートに関する知識がないと 記述箇所と影響範囲を察するのが難しい状態だった 代替リソースの削除 16
• 料理きろくという JobScheduler を利用した機能に関する分岐を削除 • OSバージョンを見てサーバから取ってくる画像を WebP/jpg に分岐していた処 理を削除 ◦
ほぼすべての画像を WebPで取得するようになりました • 4.x 端末でのみ Picasso の一部 transform を無効化していた分岐を削除 ◦ 端末スペックを考慮したものだったが明確な根拠のない分岐だったので消えてスッキリ API Level に関する分岐処理の削除 17
• API level 21 からはネイティブ Multidex サポートが入ったので削除 • dexcount-gradle-plugin という
dex ファイルのメソッド数を数えるプラグインも削 除 ◦ 当時もメソッド数を気にしていたわけではなかったが、 Multidex の導入時になんとなく入ってい た ◦ 外すときになってこのプラグインの計測処理に毎回十秒以上かかっていたことが判明する Multidex Support Library の削除 18
• これまでは2種類の drawable を state によって切り替えている箇所が多かった ◦ 以下のような drawable を
background に指定していた ◦ 画像のタッチフィードバックどうするんだ問題 • 新規実装部分については Ripple で実装する タッチフィードバックの置き換え 19
• https://developer.android.com/training/material/shadows-clipping#Clip • 形状(Outline) を指定することでそこからはみ出した View 自体の描画をカットで きるAPI • ドキュメントに
android:clipToOutline で指定できると書いてあるが実際にやると ビルドエラーになる ◦ https://issuetracker.google.com/issues/37036728 • 現状うまく利用する方法がないので使っていない View Outline による Clipping 20
Ripple Drawable による変形 Ripple 21 • https://developer.android.com/reference/android/graphics/drawable/Ripp leDrawable.html • 既存のDrawable
を元に角丸の Ripple などを定義することができる • 9patch を元にした Ripple も作成可能
• 特に画像を含むレイアウトの手前に Ripple を適用したい場合に必要 • API 23 未満ではFrameLayout以外のViewGroupにおいて android:foreground が解釈されない
• Material Components for Android に ForegroundLinearLayout という便利な やつがある • クックパッドアプリでは ForegroundLinearLayout, ForegroundRelativeLayout を用意して対応 Foreground への Ripple 適用 22
• https://developer.android.com/studio/build/optimize-your-build#use_webp • 画像リソースを WebP 化することによりバイナリサイズの縮小、ビルド時間の短 縮が見込める • minSdkVersion 18
以上で Lossless WebP への変換が可能 ◦ 画質劣化なし、ビルド速度向上、バイナリサイズ縮小 • クックパッドアプリでは1.2MBの縮小に成功 画像リソースの WebP 化 23
minSdkVersion=21 にしてから起きた問題 24
• Android 4.x がサポート外になったことに関する直接のご意見は10件未満 • ほとんどが新しく 4.x 端末を入手したユーザーさんのインストールできないという ご意見 •
事前にサポートチームと連携していたので大きな問題はなかった Android 4.x のサポートに関する問題 25
• 2014年にリリースしたバージョンで非常に再現率の高いクラッシュが発生 • 対象端末はほぼ全てOS 4.x でアプリの更新を案内できない • 大抵はAPIなどの挙動変更によるものなので個別に方針を決めて対処する • クラッシュ監視やログなどの実装ができていることを確認してから
minSdkVersion を上げましょう 古いアプリバージョンでのクラッシュ 26
• 現状開発で困っているのは foreground ripple くらいだが、 API level 23 での変 更点は多いので次上げるなら23だと思っている
• AndroidX Security ライブラリの minSdkVersion が 23 になっている ◦ まだ alpha で、かつ minSdkVersion=19 にする作業が進行中? ◦ https://issuetracker.google.com/issues/132280280 • シェアを見つつどこかのタイミングでminSdkVersion=23推奨にしたい 次の minSdkVersion をどうすべきか 27
ありがとうございました 28