ヤフオク!の快適なカスタマー体験を支えるモバイルアプリのライブアップデート技術

>100 Views

March 02, 17

スライド概要

profile-image

2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

ヤフオク!の快適なカスタマー体験を支えるモバ イルアプリのライブアップデート技術 2017年2月16日 森 洋之 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .

2.

自己紹介 森 洋之 ヤフオク!カンパニーアプリ部 Android黒帯 ヤフオク Androidアプリチームリーダー Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 1

3.

概要 ■アジェンダ ・ ・ ・ ・ ・ モバイルアプリの競争は激しい 改善速度で差をつけよう Hot Patchingが効果的 AndroidでHot Patchingをするには デモ Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 2

4.

モバイルアプリを 取り巻く環境 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .

5.

モバイルアプリを取り巻く環境 Google Playには約270万のアプリ 2,800,000 2,683,508 2,556,171 2,550,000 2,324,154 2,300,000 2,105,234 2,050,000 1,800,000 2016-04-07 2016-08-01 2016-11-25 2017-01-25 App Tornado GmbH “Number of Android applications” http://www.appbrain.com/stats/number-of-android-apps Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 4

6.

モバイルアプリを取り巻く環境 4割のユーザーは、1日4〜6アプリ使用 50% 43% 40% 28% 30% 20% 20% 8% 10% 1% 0% None 1-3 apps 4-6 apps 7-10 apps more than 10 apps Millward Brown Digital “The New Mobile Mantra” Oct 5, 2015 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 5

7.

モバイルアプリを取り巻く環境 平均評価は★4.1と高水準 1,200,000 1,000,000 800,000 600,000 400,000 200,000 0 None < 2.5 2.5-3.0 3.0-3.5 3.5-4.0 4.0-4.5 > 4.5 App Tornado GmbH “Ratings of apps on Google Play” http://www.appbrain.com/stats/android-app-ratings Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 6

8.

モバイルアプリを取り巻く環境 国内ではアプリダウンロード数が減少 App Annie 2016 Retrospective Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 7

9.

モバイルアプリを取り巻く環境 まとめ ・高品質なアプリが、多く世に出ている ・新規ダウンロードは横ばい →出せば使われる時代は終わり 競争は激しくなっている Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 8

10.

モバイルアプリを取り巻く環境 2016年日本トップパブリッシャーに Rank Company Country 1 Yahoo Japan Japan 2 LINE Japan 3 Apple United States 4 Google United States 5 CyberAgent Japan App Annie 2016 Retrospective Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 9

11.

Yahoo! JAPANの アプリ開発について Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .

12.

Yahoo! JAPANのアプリ開発について 使いやすいアプリを開発する ・「あたりまえ」品質の基準を定義 →サポートするプラットフォーム整備 →ワークショップや勉強会の開催 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 11

13.

Yahoo! JAPANのアプリ開発について 「あたりまえ」品質の基準を定義 ・信頼性 →安心、安全に使用できること ・市場性 →市場優位性、新規性があること ・使用性 →使いやすいこと Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 12

14.

Yahoo! JAPANのアプリ開発について 「あたりまえ」品質の基準を定義 ・機能性 →合目的的で想定通りに動くこと ・改善性 →迅速に改修可能であること Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 13

15.

Yahoo! JAPANのアプリ開発について 全社CI環境 GitHub Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 14

16.

Yahoo! JAPANのアプリ開発について 全社CI環境 GitHub Jenkins Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 15

17.

Yahoo! JAPANのアプリ開発について 全社CI環境 GitHub Jenkins Co p yrig ht © 2 0 1 7 Jacoco Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 16

18.

Yahoo! JAPANのアプリ開発について 全社CI環境 GitHub Jenkins Co p yrig ht © 2 0 1 7 Jacoco Appium Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 17

19.

Yahoo! JAPANのアプリ開発について 全社CI環境 Artifactory GitHub Jenkins Jacoco Appium Android テスト結果 UIテストのスクリーンショット Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 18

20.

Yahoo! JAPANのアプリ開発について 複数のユーザーチャネル Google Play Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 19

21.

Yahoo! JAPANのアプリ開発について 複数のユーザーチャネル Google Play Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 20

22.

Yahoo! JAPANのアプリ開発について 複数のユーザーチャネル Google Play Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 21

23.

Yahoo! JAPANのアプリ開発について 複数のユーザーチャネル Google Play Co p yrig ht © 2 0 1 7 Watson Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . バージョン×機能 別カテゴライズ 22

24.

Yahoo! JAPANのアプリ開発について Rollout.io Rollout.io App Store Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 23

25.

Yahoo! JAPANのアプリ開発について ターゲティングプッシュツール 自動車好き 自動車が とてもオトク アクセサリ好き パソコン好き Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .

26.

Yahoo! JAPANのアプリ開発について ターゲティングプッシュツール 自動車が とてもオトク 自動車好き アクセサリが タイムセール アクセサリ好き パソコン機器 大バーゲン パソコン好き Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 25

27.

Yahoo! JAPANのアプリ開発について ターゲティングプッシュツール ネイティブ画面 自動車が オトク 通知 Web2App URIで 判定 WebView App Indexing Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 26

28.

アプリ特有の課題 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .

29.

アプリ特有の課題 理想のリリースサイクル 企画 リリース 開発 テスト Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 28

30.

アプリ特有の課題 現実のリリースサイクル 計測 企画 完全 リリース 部分 リリース 審査 開発 テスト Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 29

31.

アプリ特有の課題 新しいバージョンが普及するまでの タイムラグ 1 0 月2 5 日 1 0 月1 0 日 Co p yrig ht © 2 0 1 7 1 0 月3 1 日 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 1 1 月8 日 30

32.

アプリ特有の課題 新しいバージョンが普及するまでの タイムラグ 1週間 1 0 月2 5 日 1 0 月1 0 日 Co p yrig ht © 2 0 1 7 1 0 月3 1 日 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 1 1 月8 日 31

33.

アプリ特有の課題 新しいバージョンが普及するまでの タイムラグ 1 0 月2 5 日 1 0 月1 0 日 1 0 月3 1 日 1 1 月8 日 2週間 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 32

34.

アプリ特有の課題 不具合のリスク 計測 企画 完全 リリース 開発 部分 リリース 審査 Co p yrig ht © 2 0 1 7 テスト Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 33

35.

アプリ特有の課題 Hot Patchingによるフローの改善 計測 企画 完全 リリース 開発 部分 リリース 審査 Co p yrig ht © 2 0 1 7 テスト Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 34

36.

アプリ特有の課題 OS Version Diversity https://developer.android.com/about/dashboards/index.html Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 35

37.

アプリ特有の課題 メンテナンスコストの増大と コードの複雑化 ・Camera2 API ・マテリアルデザイン関連 →Android 4.xをはやく切りたい →4系が30%… Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 36

38.

アプリ特有の課題 パッチによるサポート OS 6.x version 1 version 2 version 3 OS 4.x version 1 version 2 Patch サポート Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 37

39.

一般化するHot Patching Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .

40.

一般化するHot Patching 主だったHot Patchingライブラリ iOS - Rollout.io iOS – bang590/JSPatch Android - Tencent/tinker Android – alibaba/AndFix Android - Avocarrot/json2view Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 39

41.

一般化するHot Patching iOS – Rollout.io https://rollout.io/success-stories/ Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 40

42.

一般化するHot Patching iOS – bang590/JSPatch レポジトリにつけられたスター数をグラフ化 http://www.timqian.com/star-history/ を利用 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 41

43.

一般化するHot Patching Android - Tencent/tinker レポジトリにつけられたスター数をグラフ化 http://www.timqian.com/star-history/ を利用 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 42

44.

一般化するHot Patching Android - Tencent/tinker 現バージョン dex dex パッチ dex 新バージョン 現バージョン dex Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 43

45.

一般化するHot Patching Android – alibaba/AndFix レポジトリにつけられたスター数をグラフ化 http://www.timqian.com/star-history/ を利用 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 44

46.

一般化するHot Patching Android – Avocarrot/json2view レポジトリにつけられたスター数をグラフ化 http://www.timqian.com/star-history/ を利用 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 45

47.

Androidと Hot Patching Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .

48.

AndroidとHot Patching 処理の置換 ・ vtable操作 ・ DexClassLoader ・ Script デザインの置換 ・ ひたすらがんばる Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 47

49.

AndroidとHot Patching vtable操作 0 1 Method A 3 2 Method B Co p yrig ht © 2 0 1 7 Method C 4 Method D Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . Method E 48

50.

AndroidとHot Patching vtable操作 0 1 Method A 3 2 Method B Method C 4 Method D Method E Method B’ Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 49

51.

AndroidとHot Patching DexClassLoader external.jar Activity B’ Activity A ProxyActivity Activity B Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 50

52.

AndroidとHot Patching Script if (スクリプトがある) { return スクリプトの実行 } 通常の処理 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 51

53.

AndroidとHot Patching デザインの置換 public void createView(Context ctx, JSONObject obj) { // Classオブジェクトを得て Class viewClass = Class.forName(obj.getString("name")); // 生成する View view = (View)viewClass.getConstructor(Context.class).newInstance(ctx); // プロパティを得て JSONArray properties = obj.getJSONArray("properties"); // 設定する setProperties(view, properties); } Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 52

54.
[beta]
AndroidとHot Patching

デザインの置換
public void setProperties(View view, JSONArray properties) {
for (int i = 0; i < properties.length(); i++) {
JSONObject property = properties.getJSONObject(i);
switch (property.getString("name")) {
case LAYOUT_WIDTH:
…
case LAYOUT_HEIGHT:
…
case GRAVITY:
…
Co p yrig ht © 2 0 1 7

Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .

53

55.

Hot Patching諸注意 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .

56.

Hot Patching諸注意 Hot Patchingとセキュリティ Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 55

57.

Hot Patching諸注意 Hot Patchingとセキュリティ Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 56

58.

Hot Patching諸注意 Hot Patchingとセキュリティ Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 57

59.

Hot Patching諸注意 Hot Patchingとセキュリティ Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 58

60.

Hot Patching諸注意 Hot Patchingとガイドライン Rollout.io ・WebKit / JavaScriptCoreで実行し ・アプリの主要な目的を変更しない ことで、 Apple Developer Program Requirements 3.3.2, 3.3.3に違反していない Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 59

61.

Hot Patching諸注意 Hot Patchingとガイドライン Google Play ・apkバイナリを書き換えてはいけない ・と、あったと思ったんだけど… ・ユーザーは尊重しましょう Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 60

62.

お手軽Hot Patching Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .

63.

お手軽Hot Patching 使用するもの ・Transform API →ビルド時にバイトコード変換を行う ・jboss-javassist/javassist →手軽にバイトコード変換を書ける ・mozilla/rhino →OSS JavaScript実装 ・json2view →jsonからViewを生成する Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . https://goo.gl/MDnvUt 62

64.

お手軽Hot Patching Transform API ・Android Gradle Plugin提供のAPI ・Android Gradle Plugin 1.5〜 ・Jackは未サポート(別のAPIで可能) Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 63

65.

お手軽Hot Patching gradle pluginを作って、registerTransform() で登録する class Patcher implements Plugin<Project>{ @Override void apply(Project project) { // バイトコード変換を行うTransformerを登録する project.android.registerTransform( new PatcherTransformer(project)) } Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 64

66.

お手軽Hot Patching Javassistで処理を挿入する if (スクリプトがある) { return スクリプトの実行 } 通常の処理 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 65

67.

お手軽Hot Patching Javassistで処理を挿入する 全クラス.each{ 全メソッド.each{ メソッド.insertBefore( “スクリプトがあれば実行” ) } } Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 66

68.

お手軽Hot Patching mozilla/rhino ・Javaで書かれたJavaScriptの実装 ・Androidでも動く ・JavaのObjectを渡して、 スクリプト内でアクセス可能 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 67

69.

お手軽Hot Patching Java ObjectをJavaScript用Objectに変換、 実行し、戻り値を受け取る ScriptableObject.putProperty(scope, "instance", Context.javaToJS(instance, scope)); rhino.evaluateString(scope, script, "JavaScript", 1, null); Function function = (Function)scope.get("apply", scope); Object result = function.call(rhino, scope, scope, functionParams); Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 68

70.

お手軽Hot Patching json2view ・xmlをjsonに変換し、それを配信する $ ./gradlew runScript -Pxml=./pathToInputXmlFile.xml Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 69

71.

お手軽Hot Patching レイアウトを設定する箇所に、 こういうコードを書く if (レイアウトパッチがある) { View view = DynamicView.createView( this, パッチ, null); setContentView(view); } else { setContentView(R.layout.default_layout) } Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 70

72.

お手軽Hot Patching サンプルのサーバ ・サンプルなので、なんでもいいです https://goo.gl/DvUggq Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 71

73.

お手軽Hot Patching デモ Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 72

74.

まとめ まとめ ・ モバイルアプリの競争は激しいので ・ 改善速度で差をつけよう ・ Hot Patchingが効果的! Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 73

75.

Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .