Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

4,618 views

Published on

Published in: Technology
  • Be the first to comment

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

  1. 1. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 森 洋之 2017年2月16日 ヤフオク!の快適なカスタマー体験を支えるモバ イルアプリのライブアップデート技術
  2. 2. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 自己紹介 1 森 洋之 ヤフオク!カンパニーアプリ部 Android黒帯 ヤフオク Androidアプリチームリーダー
  3. 3. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 概要 2 ■アジェンダ ・ モバイルアプリの競争は激しい ・ 改善速度で差をつけよう ・ Hot Patchingが効果的 ・ AndroidでHot Patchingをするには ・ デモ
  4. 4. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. モバイルアプリを 取り巻く環境
  5. 5. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. モバイルアプリを取り巻く環境 4 Google Playには約270万のアプリ 2,105,234 2,324,154 2,556,171 2,683,508 1,800,000 2,050,000 2,300,000 2,550,000 2,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
  6. 6. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. モバイルアプリを取り巻く環境 5 4割のユーザーは、1日4〜6アプリ使用 Millward Brown Digital “The New Mobile Mantra” Oct 5, 2015 1% 28% 43% 20% 8% 0% 10% 20% 30% 40% 50% None 1-3 apps 4-6 apps 7-10 apps more than 10 apps
  7. 7. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. モバイルアプリを取り巻く環境 66 平均評価は★4.1と高水準 App Tornado GmbH “Ratings of apps on Google Play” http://www.appbrain.com/stats/android-app-ratings 0 200,000 400,000 600,000 800,000 1,000,000 1,200,000 None < 2.5 2.5-3.0 3.0-3.5 3.5-4.0 4.0-4.5 > 4.5
  8. 8. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. モバイルアプリを取り巻く環境 7 国内ではアプリダウンロード数が減少 App Annie 2016 Retrospective
  9. 9. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. モバイルアプリを取り巻く環境 8 まとめ ・高品質なアプリが、多く世に出ている ・新規ダウンロードは横ばい →出せば使われる時代は終わり 競争は激しくなっている
  10. 10. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. モバイルアプリを取り巻く環境 9 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
  11. 11. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANの アプリ開発について
  12. 12. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 11 使いやすいアプリを開発する ・「あたりまえ」品質の基準を定義 →サポートするプラットフォーム整備 →ワークショップや勉強会の開催
  13. 13. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 12 「あたりまえ」品質の基準を定義 ・信頼性 →安心、安全に使用できること ・市場性 →市場優位性、新規性があること ・使用性 →使いやすいこと
  14. 14. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 13 「あたりまえ」品質の基準を定義 ・機能性 →合目的的で想定通りに動くこと ・改善性 →迅速に改修可能であること
  15. 15. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 14 全社CI環境 GitHub
  16. 16. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 15 全社CI環境 GitHub Jenkins
  17. 17. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 16 全社CI環境 Jenkins JacocoGitHub
  18. 18. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 17 全社CI環境 GitHub AppiumJenkins Jacoco
  19. 19. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 18 全社CI環境 テスト結果 UIテストのスクリーンショット Jenkins Jacoco Appium Artifactory Android GitHub
  20. 20. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 19 複数のユーザーチャネル Google Play
  21. 21. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 20 複数のユーザーチャネル Google Play
  22. 22. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 21 複数のユーザーチャネル Google Play
  23. 23. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 22 複数のユーザーチャネル バージョン×機能 別カテゴライズ Google Play Watson
  24. 24. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 23 Rollout.io Rollout.io App Store ※2017年3月8日、Apple社からRolloutの利用に関する警告を受けたため、こちらの記事にあるRolloutは利用しないようお願いいたします。
  25. 25. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について ターゲティングプッシュツール 自動車好き アクセサリ好き パソコン好き 自動車が とてもオトク
  26. 26. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 25 ターゲティングプッシュツール 自動車好き アクセサリ好き パソコン好き 自動車が とてもオトク アクセサリが タイムセール パソコン機器 大バーゲン
  27. 27. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Yahoo! JAPANのアプリ開発について 26 ターゲティングプッシュツール App Indexing Web2App ネイティブ画面 WebView URIで 判定 自動車が オトク 通知
  28. 28. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題
  29. 29. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題 28 理想のリリースサイクル 企画 テスト 開発リリース
  30. 30. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題 29 現実のリリースサイクル 企画 テスト 開発 部分 リリース 審査 計測 完全 リリース
  31. 31. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題 30 新しいバージョンが普及するまでの タイムラグ 1 0 月1 0 日 1 0 月2 5 日 1 1 月8 日1 0 月3 1 日
  32. 32. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題 31 新しいバージョンが普及するまでの タイムラグ 1 0 月1 0 日 1 0 月2 5 日 1 1 月8 日1 0 月3 1 日 1週間
  33. 33. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題 32 新しいバージョンが普及するまでの タイムラグ 1 0 月1 0 日 1 0 月2 5 日 1 1 月8 日1 0 月3 1 日 2週間
  34. 34. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題 33 不具合のリスク 企画 テスト 開発 部分 リリース 審査 計測 完全 リリース
  35. 35. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題 34 Hot Patchingによるフローの改善 企画 テスト 開発 部分 リリース 審査 計測 完全 リリース
  36. 36. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題 35 OS Version Diversity https://developer.android.com/about/dashboards/index.html
  37. 37. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題 36 メンテナンスコストの増大と コードの複雑化 ・Camera2 API ・マテリアルデザイン関連 →Android 4.xをはやく切りたい →4系が30%…
  38. 38. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリ特有の課題 37 パッチによるサポート version 1 version 2 version 3 version 1 version 2 OS 6.x OS 4.x Patch サポート
  39. 39. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 一般化するHot Patching
  40. 40. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 一般化するHot Patching 39 主だったHot Patchingライブラリ iOS - Rollout.io iOS – bang590/JSPatch Android - Tencent/tinker Android – alibaba/AndFix Android - Avocarrot/json2view ※2017年3月8日、Apple社からRolloutの利用に関する警告を受けたため、こちらの記事にあるRolloutは利用しないようお願いいたします。
  41. 41. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 一般化するHot Patching 40 iOS – Rollout.io https://rollout.io/success-stories/ ※2017年3月8日、Apple社からRolloutの利用に関する警告を受けたため、こちらの記事にあるRolloutは利用しないようお願いいたします。
  42. 42. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 一般化するHot Patching 41 iOS – bang590/JSPatch レポジトリにつけられたスター数をグラフ化 http://www.timqian.com/star-history/ を利用
  43. 43. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 一般化するHot Patching 42 Android - Tencent/tinker レポジトリにつけられたスター数をグラフ化 http://www.timqian.com/star-history/ を利用
  44. 44. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 一般化するHot Patching 43 Android - Tencent/tinker 現バージョン 新バージョン 現バージョン dex dex パッチ dex dex
  45. 45. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 一般化するHot Patching 44 Android – alibaba/AndFix レポジトリにつけられたスター数をグラフ化 http://www.timqian.com/star-history/ を利用
  46. 46. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 一般化するHot Patching 45 Android – Avocarrot/json2view レポジトリにつけられたスター数をグラフ化 http://www.timqian.com/star-history/ を利用
  47. 47. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Androidと Hot Patching
  48. 48. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. AndroidとHot Patching 47 処理の置換 ・ vtable操作 ・ DexClassLoader ・ Script デザインの置換 ・ ひたすらがんばる
  49. 49. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. AndroidとHot Patching 48 vtable操作 Method A Method B Method C Method D Method E 0 1 2 3 4
  50. 50. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. AndroidとHot Patching 49 vtable操作 Method A Method B Method C Method D Method E 0 1 2 3 4 Method B’
  51. 51. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. AndroidとHot Patching 50 DexClassLoader Activity A Activity B ProxyActivity Activity B’ external.jar
  52. 52. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. AndroidとHot Patching 51 Script if (スクリプトがある) { return スクリプトの実行 } 通常の処理
  53. 53. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. AndroidとHot Patching 52 デザインの置換 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); }
  54. 54. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. AndroidとHot Patching 53 デザインの置換 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: …
  55. 55. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Hot Patching諸注意
  56. 56. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Hot Patching諸注意 55 Hot Patchingとセキュリティ
  57. 57. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Hot Patching諸注意 56 Hot Patchingとセキュリティ
  58. 58. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Hot Patching諸注意 57 Hot Patchingとセキュリティ
  59. 59. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Hot Patching諸注意 58 Hot Patchingとセキュリティ
  60. 60. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Hot Patching諸注意 59 Hot Patchingとガイドライン Rollout.io ・WebKit / JavaScriptCoreで実行し ・アプリの主要な目的を変更しない ことで、 Apple Developer Program Requirements 3.3.2, 3.3.3に違反していない ※2017年3月8日、Apple社からRolloutの利用に関する警告を受けたため、こちらの記事にあるRolloutは利用しないようお願いいたします。
  61. 61. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Hot Patching諸注意 60 Hot Patchingとガイドライン Google Play ・apkバイナリを書き換えてはいけない ・と、あったと思ったんだけど… ・ユーザーは尊重しましょう
  62. 62. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching
  63. 63. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 62 使用するもの ・Transform API →ビルド時にバイトコード変換を行う ・jboss-javassist/javassist →手軽にバイトコード変換を書ける ・mozilla/rhino →OSS JavaScript実装 ・json2view →jsonからViewを生成する https://goo.gl/MDnvUt
  64. 64. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 63 Transform API ・Android Gradle Plugin提供のAPI ・Android Gradle Plugin 1.5〜 ・Jackは未サポート(別のAPIで可能)
  65. 65. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 64 gradle pluginを作って、registerTransform() で登録する class Patcher implements Plugin<Project>{ @Override void apply(Project project) { // バイトコード変換を行うTransformerを登録する project.android.registerTransform( new PatcherTransformer(project)) }
  66. 66. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 65 Javassistで処理を挿入する if (スクリプトがある) { return スクリプトの実行 } 通常の処理
  67. 67. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 66 Javassistで処理を挿入する 全クラス.each{ 全メソッド.each{ メソッド.insertBefore( “スクリプトがあれば実行” ) } }
  68. 68. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 67 mozilla/rhino ・Javaで書かれたJavaScriptの実装 ・Androidでも動く ・JavaのObjectを渡して、 スクリプト内でアクセス可能
  69. 69. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 68 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);
  70. 70. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 69 json2view ・xmlをjsonに変換し、それを配信する $ ./gradlew runScript -Pxml=./pathToInputXmlFile.xml
  71. 71. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 70 レイアウトを設定する箇所に、 こういうコードを書く if (レイアウトパッチがある) { View view = DynamicView.createView( this, パッチ, null); setContentView(view); } else { setContentView(R.layout.default_layout) }
  72. 72. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 71 サンプルのサーバ ・サンプルなので、なんでもいいです https://goo.gl/DvUggq
  73. 73. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. お手軽Hot Patching 72 デモ
  74. 74. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. まとめ 73 まとめ ・ モバイルアプリの競争は激しいので ・ 改善速度で差をつけよう ・ Hot Patchingが効果的!
  75. 75. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.

×