Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
minSdkVersion=21にしてから1年経った話
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
こやまカニ大好き
July 23, 2019
Programming
2.5k
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.6k
マルチモジュールアプリの画面遷移処理実装
nein37
0
6.8k
クックパッド Android アプリのマルチモジュール化とデモアプリの活用
nein37
1
7.1k
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.6k
Androidアプリのデザイン整理への取り組み
nein37
1
1.1k
Other Decks in Programming
See All in Programming
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
400
Building an Out-of-Order CPU
latte72
1
780
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
140
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
480
一人だけ、Kiroが静止する日
hideg
0
110
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
160
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
410
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.8k
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
180
What We Talk About When We Talk About XP
m_seki
2
640
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
130
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
430
Featured
See All Featured
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
660
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.9k
A Modern Web Designer's Workflow
chriscoyier
699
190k
How to build a perfect <img>
jonoalderson
1
6k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
720
Are puppies a ranking factor?
jonoalderson
2
3.9k
Code Reviewing Like a Champion
maltzj
528
40k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
910
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.8k
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