Slide 1

Slide 1 text

ZOZOTOWNアプリへのIn-app updatesの導入と その運用について
 株式会社ZOZO
 ZOZOTOWN開発本部 ZOZOTOWNアプリ部 Androidブロック
 ブロック長 山田 祐介
 
 
 2021/10/28(Thu)
 After DroidKaigi 2021
 Copyright © ZOZO, Inc.

Slide 2

Slide 2 text

© ZOZO, Inc. 株式会社ZOZO
 ZOZOTOWN開発本部 ZOZOTOWNアプリ部 
 Androidブロック ブロック長 山田 祐介
 2015年に現在の株式会社ZOZOに入社。
 ZOZOTOWNアプリ開発には2016年から参画し2019年から Androidアプリチームのマネジメント業務を担当。
 現在9名のメンバーに支えられながら奮闘中。
 好きな言葉は適材適所。
 
 
 2

Slide 3

Slide 3 text

© ZOZO, Inc. https://zozo.jp/
 3 ● ファッション通販サイト
 ● 1,400以上のショップ、8,400以上のブランドの取り扱い
 ● 常時83万点以上の商品アイテム数と毎日平均2,900点以上の新着 商品 を掲載(2021年6月末時点)
 ● ブランド古着のファッションゾーン「ZOZOUSED」や
 コスメ専門モール「ZOZOCOSME」、靴の専門モール
 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン
 「ZOZOVILLA」を展開
 ● 即日配送サービス
 ● ギフトラッピングサービス
 ● ツケ払い など


Slide 4

Slide 4 text

© ZOZO, Inc. 4 アジェンダ
 ● In-app updatesとは? ● 導入背景 ● 仕様・運用方法 ● 導入結果 ● Tips

Slide 5

Slide 5 text

© ZOZO, Inc. In-app updatesとは?
 5

Slide 6

Slide 6 text

© ZOZO, Inc. In-app updatesとは?
 アプリ内でアプリの更新ができる機能
 Play Core ライブラリが提供する機能、Version 1.5.0 以降で利用可能
 Android 5.0以上がサポート対象
 
 フレキシブル アップデートと即時アップデートの2種類のUXフローがある
 6

Slide 7

Slide 7 text

© ZOZO, Inc. In-app updatesとは?
 7 フレキシブル アップデート
 即時アップデート
 ※フレキシブルアップデートの2枚目は独自実装
 ※この資料ではZOZOTOWNの即時アップデート実装に関しては触れません


Slide 8

Slide 8 text

© ZOZO, Inc. 8 In-app updatesとは?
 着目したポイント ● UIの実装はほぼライブラリが提供 ● アプリの利用を極力妨げない(フレキシブル アップデート) デザイナーのリソースをほとんど必要としないため、導入できるかはAndroidエンジニア次第
 フレキシブルアップデートはダウンロードしながらアプリが利用できユーザーフレンドリー


Slide 9

Slide 9 text

© ZOZO, Inc. 導入背景
 9

Slide 10

Slide 10 text

© ZOZO, Inc. 導入背景
 ● クラッシュフリー率の改善
 ● 不具合解消によるUXの向上
 リリース時に発生してしまったクラッシュ/不具合をすぐに修正しリリースしたにもかかわらず、ユーザーが アップデートに気づかずにクラッシュに遭遇したり不具合について問い合わせをいただいていた
 10

Slide 11

Slide 11 text

© ZOZO, Inc. 導入背景
 11 <具体例1>
 2021/3/18にリリースしたVersionにてクラッシュ発生
 Firebase Crashlytics上でのデイリーのクラッシュフリー率が97%まで低下
 (ユーザーがアプリをバックグラウンドにした際にクラッシュ)
 
 2021/3/23修正版リリース
 リリース後徐々に改善したがクラッシュフリー率を元の状態に戻すのに1週間以上必要だった
 ※この期のチーム目標の1つにクラッシュフリー率の維持を掲げていた
 低下した場合は1週間以内にリカバリーするとしていたが上記の通り目標を達成することはできな かった


Slide 12

Slide 12 text

© ZOZO, Inc. 導入背景
 12 <具体例2>
 2021/3/18にリリースしたVersionにて不具合発生
 検索結果の画面でページングすると並び順がリセットされる不具合
 1日に3件前後同じ内容で問い合わせが発生
 
 2021/3/22修正版リリース
 問い合わせはリリースから1週間ぐらいで落ち着いた
 しかし更新に気づいていないユーザーから6、7月にも問い合わせが発生


Slide 13

Slide 13 text

© ZOZO, Inc. 13 導入背景
 ● 迅速に修正してもユーザーが更新に気づかなければ意味がない ● In-app updatesならUIのデザインは最小限で済みそう ○ Androidエンジニアのリソースで大半が解決できる In-app updatesで更新を訴求しよう!


Slide 14

Slide 14 text

© ZOZO, Inc. 仕様・運用方法
 14

Slide 15

Slide 15 text

© ZOZO, Inc. 仕様・運用方法
 15 更新訴求の仕様 ● フレキシブルアップデートを採用 ● 更新内容に応じて訴求の頻度を変更 開発チーム内での仕様検討時に「購入しようとした時に更新が始まると購買意欲が下がる」や「短 い期間に何度も出てくるとキャンセルが常態化する」等の意見があり、訴求の頻度を4パターンに分 類して運用することに決定
 


Slide 16

Slide 16 text

© ZOZO, Inc. 16 仕様・運用方法
 4パターンの訴求頻度 1. 訴求なし 2. 1回のみ訴求 3. 24時間に1回のみ訴求 4. アプリがフォアグラウンドになるたびに訴求 
 
 


Slide 17

Slide 17 text

© ZOZO, Inc. 17 仕様・運用方法
 訴求頻度使い分けイメージ ● 訴求なし → リファクタリングやその他緊急性の低いもの ● 1回のみ訴求 → 機能追加系

Slide 18

Slide 18 text

© ZOZO, Inc. 18 仕様・運用方法
 訴求頻度使い分けイメージ ● 24時間に1回訴求 → キャンペーンと連動する機能のリリースやA/Bテスト、クラッシュ改 善、不具合改修 ● アプリがフォアグラウンドになるたびに訴求 → アプリ利用を妨げる重大な不具合改修 この訴求頻度の制御はIn-app updatesのinAppUpdatePriorityで実施


Slide 19

Slide 19 text

© ZOZO, Inc. 仕様・運用方法
 19 inAppUpdatePriorityについて ● apk・aabごとに設定できる0~5の値
 ● 値の設定はGoogle Play Consoleにapk・aabをアップロード時
 ○ Google Play Developer API でのみ設定可能
 ○ ZOZOTOWNでは gradle-play-publisher を利用して設定
 ● アプリ上ではAppUpdateInfo.updatePriority()で取得

Slide 20

Slide 20 text

© ZOZO, Inc. 仕様・運用方法
 20 inAppUpdatePriorityに値を設定 ZOZOTOWNでは gradle-play-publisher を利用して設定 app/build.gradleに以下のようなブロックを用意し ./gradlew publishReleaseBundle を実行 play { track.set("internal") releaseStatus.set(com.github.triplet.gradle.androidpublisher.ReleaseStatus.DRAFT) updatePriority.set(5) } 上記の場合は内部テスト配信にaabファイルビルドしてDRAFT状態でアップロードしている その際にinAppUpdatePriorityには5を設定している

Slide 21

Slide 21 text

© ZOZO, Inc. 仕様・運用方法
 21 inAppUpdatePriorityの取得 val appUpdateInfo = AppUpdateManagerFactory.create(context).requestAppUpdateInfo() val updatePriority = appUpdateInfo.updatePriority() requestAppUpdateInfo()はsuspend関数でGoogle Play Storeからデータを取得している ここで取得できるinAppUpdatePriorityは単純に最新のアプリバージョンのinAppUpdatePriorityを返 すわけではなくちょっと気が利いた自動計算の仕組みが組み込まれている

Slide 22

Slide 22 text

© ZOZO, Inc. 22 仕様・運用方法
 inAppUpdatePriorityの自動計算の仕組み 公式ドキュメントより アプリのコードで、updatePriority() を使用して特定のアップデートの優先度を確認できます。返される優先度は、 インストールされているバージョンと利用可能な最新バージョン間のすべてのアプリ バージョン コードの inAppUpdatePriority を考慮します。 この文章のみから読み取ることは難しいが、実はこの仕組み
 「現在使っているバージョンと最新バージョンの間のリリースの中でもっとも優先度の高い値が取得 できる」
 ということ


Slide 23

Slide 23 text

© ZOZO, Inc. 23 仕様・運用方法
 inAppUpdatePriorityの自動計算の仕組み(図解) APP Ver:3.1.0 inAppUpdatePriority:1 更新内容:機能追加 APP Ver:3.1.1 inAppUpdatePriority:2 更新内容:不具合修正 10/1 10/2 リリース ユースケース APP Ver:3.1.2 inAppUpdatePriority:0 更新内容:リファクタリング 10/10

Slide 24

Slide 24 text

© ZOZO, Inc. 24 仕様・運用方法
 inAppUpdatePriorityの自動計算の仕組み(図解) APP Ver:3.1.0 inAppUpdatePriority:1 更新内容:機能追加 APP Ver:3.1.1 inAppUpdatePriority:2 更新内容:不具合修正 10/1 10/2 リリース ユースケース APP Ver:3.0.0 updatePriority:1 
 Ver 3.1.0リリース後、Ver 3.1.1がリリースされるまでの間は、updatePriorityは1となる
 APP Ver:3.1.2 inAppUpdatePriority:0 更新内容:リファクタリング 10/10

Slide 25

Slide 25 text

© ZOZO, Inc. 25 仕様・運用方法
 inAppUpdatePriorityの自動計算の仕組み(図解) APP Ver:3.1.0 inAppUpdatePriority:1 更新内容:機能追加 APP Ver:3.1.1 inAppUpdatePriority:2 更新内容:不具合修正 10/1 10/2 APP Ver:3.1.2 inAppUpdatePriority:0 更新内容:リファクタリング 10/10 リリース ユースケース 
 Ver 3.1.1リリース後はVer 3.0.0、3.1.0利用ユーザーのupdatePriorityは2となる
 APP Ver:3.1.0 updatePriority:2 APP Ver:3.0.0 updatePriority:2

Slide 26

Slide 26 text

© ZOZO, Inc. 26 仕様・運用方法
 inAppUpdatePriorityの自動計算の仕組み(図解) APP Ver:3.1.0 inAppUpdatePriority:1 更新内容:機能追加 APP Ver:3.1.1 inAppUpdatePriority:2 更新内容:不具合修正 10/1 10/2 APP Ver:3.1.2 inAppUpdatePriority:0 更新内容:リファクタリング 10/10 リリース ユースケース 
 Ver 3.1.2リリース後、Ver 3.1.1利用ユーザーのupdatePriorityは0となる
 しかし、Ver 3.0.0、3.1.0利用ユーザーのupdatePriorityは2となる
 -> Ver 3.1.1のユーザーにとってはVer 3.1.2の更新は重要ではないが、
 Ver 3.1.0以下のユーザーにとってはVer 3.1.1の修正を含むVer 3.1.2は重要な更新
 APP Ver:3.1.1 updatePriority:0 APP Ver:3.0.0,3.1.0 updatePriority:2

Slide 27

Slide 27 text

© ZOZO, Inc. 仕様・運用方法
 27 inAppUpdatePriorityの仕組みまとめ ● Version毎に0~5の値が設定可能 ● アプリで取得する際には現在のVersionから最新のVersionまでの間で 一番高い値を返す 
 
 この仕組みを利用するためにエンジニアがやることは、apk・aabをGoogle Play Consoleにアップロードす るときに値を設定するのみ
 
 なので、Androidエンジニアのリソースのみで運用可能!


Slide 28

Slide 28 text

© ZOZO, Inc. 仕様・運用方法
 28 inAppUpdatePriorityを仕様に適応 ● 0・・・訴求なし ● 1・・・1回のみ訴求 ● 2・・・24時間に1回のみ訴求 ● 3・・・アプリがフォアグラウンドになるたびに訴求 ● 4,5・・・利用しない(実装上は3と同じ) ZOZOTOWNの仕様としては4パターンで十分だったため0~3を利用することにし、4,5は利用はしないが 実装上は3と同じ扱いにした


Slide 29

Slide 29 text

© ZOZO, Inc. 仕様・運用方法
 29 まとめ ● フレキシブルアップデートを採用 ● 更新内容に合わせて訴求の頻度を制御 ● 制御はAndroidエンジニアが管理可能なinAppUpdatePriorityを利用 
 
 ※こちらZOZOTOWNアプリのVer 7.1.7(2021/6/21リリース)から導入しています


Slide 30

Slide 30 text

© ZOZO, Inc. 導入結果
 30

Slide 31

Slide 31 text

© ZOZO, Inc. 導入結果
 31 赤:優先度2 黄:優先度1 青:優先度0 優先度(inAppUpdatePriority)ごとの浸透率 アプリリリース後から4日後までの最新Ver更新率をグラフ化
 リリース日から4日ほどたつと数値が横ばいになってくるためそこまでのデータを集計
 優先度以外の要因で変化している可能性もある(プレスリリースやリリースした曜日等)


Slide 32

Slide 32 text

© ZOZO, Inc. 導入結果
 32 赤:優先度2 黄:優先度1 青:優先度0 優先度2について ※更新訴求は24時間に1回 優先度(inAppUpdatePriority)ごとの浸透率 リリース1日後から全体的に有意差がある、数値的には10%ほど
 3日後からほぼ横ばい


Slide 33

Slide 33 text

© ZOZO, Inc. 導入結果
 33 赤:優先度2 黄:優先度1 青:優先度0 優先度1について ※更新訴求は1回のみ 優先度(inAppUpdatePriority)ごとの浸透率 データが2回分しかなく、それぞれで結果に差異があるため、もう少しデータが必要そう


Slide 34

Slide 34 text

© ZOZO, Inc. 導入結果
 34 赤:優先度2 黄:優先度1 青:優先度0 優先度0について ※更新訴求なし 優先度(inAppUpdatePriority)ごとの浸透率 優先度2に比べると全体を通して低い数値となっている
 1つ高い数値をとっているものは2日前に優先度2のリリースがあったためその影響が考えられる


Slide 35

Slide 35 text

© ZOZO, Inc. 導入結果
 35 まとめ ● 24時間に1回の訴求(優先度2)で効果はでた ● 特にリリース翌日の数値は10%ほどの差がでた ● 4日目ぐらいから変化が少なくなっている 
 
 迅速にユーザーに更新を提供する効果あり!


Slide 36

Slide 36 text

© ZOZO, Inc. 36 全体のまとめ ● クラッシュ改善&不具合改修を迅速にユーザーに届けたかった ● 実装&運用をAndroidエンジニアのリソースで賄いたかった ○ In-app updatesとInAppUpdatePriorityの仕組みが適していた ● 実際に導入してユーザーの最新Versionへの更新速度に効果があった

Slide 37

Slide 37 text

© ZOZO, Inc. InAppUpdatePriority Tips
 37

Slide 38

Slide 38 text

© ZOZO, Inc. InAppUpdatePriority Tips
 38 UpdatePriority取得の確認方法について ● Google Play Storeのデータを削除が良い(logcatで確認可) ● 内部テスト配信でも確認可能 ● 内部アプリ共有では確認不可 ● 動作確認のapkはApp Bundle エクスプローラから取得が簡単 
 


Slide 39

Slide 39 text

© ZOZO, Inc. InAppUpdatePriority Tips
 39 Google Play Storeのデータを削除が良い(logcatで確認可) 
 
 データ削除後にGoogle Play Storeを起動すると以下のようなログが出力され る I/Finsky: [1596] afae.run(35): UCtl: Package jp.zozo.android.town client staleness timestamp changed from 0 to 1635133443611, available version changed from 0 to 428 or in-app update priority changed from 0 to 2. 上記の場合は2がAppUpdateInfo.updatePriority()で返却されるようになる

Slide 40

Slide 40 text

© ZOZO, Inc. InAppUpdatePriority Tips
 40 内部テスト配信でも確認可能 
 
 スライド20にもある通りInAppUpdatePriorityは Play Store Consoleにアップロード時に設定 内部テスト(internal)でもアップロード可能でその 時点でアプリ側で値を取得できるようになる ※Google Play Storeのデータ削除を推奨

Slide 41

Slide 41 text

© ZOZO, Inc. InAppUpdatePriority Tips
 41 内部アプリ共有では確認不可 
 
 内部アプリ共有にもGoogle Play Developer API を使ってアッ プロードは可能だが、この場合は AppUpdateInfo.updatePriority()は0になってしまう。 ※In-app updates自体の動作確認は内部アプリ共有でも可

Slide 42

Slide 42 text

© ZOZO, Inc. InAppUpdatePriority Tips
 42 動作確認のapkはApp Bundle エクスプローラから取得が簡単 
 
 すでに一度リリースしている前提とはなるが、 App Bundle エクスプローラなら署名付のapk がダウンロード可能なのでこちらを利用するの がおすすめ

Slide 43

Slide 43 text

No content