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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
こやまカニ大好き
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
スマートグラスで並列バイブコーディング
hyshu
0
150
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
120
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
270
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
870
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
820
C# and C++ Interoperability - cho-dotnetnew
harukasao
0
170
Creating Composable Callables in Contemporary C++
rollbear
0
150
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
11
4.2k
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
150
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
140
A2UI という光を覗いてみる
satohjohn
1
140
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
Building Adaptive Systems
keathley
44
3.1k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
GraphQLとの向き合い方2022年版
quramy
50
15k
Code Reviewing Like a Champion
maltzj
528
40k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
440
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Scaling GitHub
holman
464
140k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
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