>100 Views
March 02, 17
スライド概要
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
ヤフオク!の快適なカスタマー体験を支えるモバ イルアプリのライブアップデート技術 2017年2月16日 森 洋之 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .
自己紹介 森 洋之 ヤフオク!カンパニーアプリ部 Android黒帯 ヤフオク Androidアプリチームリーダー Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 1
概要 ■アジェンダ ・ ・ ・ ・ ・ モバイルアプリの競争は激しい 改善速度で差をつけよう 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
モバイルアプリを 取り巻く環境 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .
モバイルアプリを取り巻く環境 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
モバイルアプリを取り巻く環境 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
モバイルアプリを取り巻く環境 平均評価は★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
モバイルアプリを取り巻く環境 国内ではアプリダウンロード数が減少 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
モバイルアプリを取り巻く環境 まとめ ・高品質なアプリが、多く世に出ている ・新規ダウンロードは横ばい →出せば使われる時代は終わり 競争は激しくなっている Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 8
モバイルアプリを取り巻く環境 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
Yahoo! JAPANの アプリ開発について Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .
Yahoo! JAPANのアプリ開発について 使いやすいアプリを開発する ・「あたりまえ」品質の基準を定義 →サポートするプラットフォーム整備 →ワークショップや勉強会の開催 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 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 . 13
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
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
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
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
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
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
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
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
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
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
Yahoo! JAPANのアプリ開発について ターゲティングプッシュツール 自動車好き 自動車が とてもオトク アクセサリ好き パソコン好き Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .
Yahoo! JAPANのアプリ開発について ターゲティングプッシュツール 自動車が とてもオトク 自動車好き アクセサリが タイムセール アクセサリ好き パソコン機器 大バーゲン パソコン好き Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 25
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
アプリ特有の課題 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .
アプリ特有の課題 理想のリリースサイクル 企画 リリース 開発 テスト Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 28
アプリ特有の課題 現実のリリースサイクル 計測 企画 完全 リリース 部分 リリース 審査 開発 テスト Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 29
アプリ特有の課題 新しいバージョンが普及するまでの タイムラグ 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
アプリ特有の課題 新しいバージョンが普及するまでの タイムラグ 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
アプリ特有の課題 新しいバージョンが普及するまでの タイムラグ 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
アプリ特有の課題 不具合のリスク 計測 企画 完全 リリース 開発 部分 リリース 審査 Co p yrig ht © 2 0 1 7 テスト Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 33
アプリ特有の課題 Hot Patchingによるフローの改善 計測 企画 完全 リリース 開発 部分 リリース 審査 Co p yrig ht © 2 0 1 7 テスト Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 34
アプリ特有の課題 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
アプリ特有の課題 メンテナンスコストの増大と コードの複雑化 ・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
アプリ特有の課題 パッチによるサポート 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
一般化するHot Patching Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .
一般化する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
一般化する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
一般化する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
一般化する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
一般化する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
一般化する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
一般化する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
Androidと Hot Patching Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .
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
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
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
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
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
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
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
Hot Patching諸注意 Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .
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
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
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
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
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
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
お手軽Hot Patching Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .
お手軽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
お手軽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
お手軽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
お手軽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
お手軽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
お手軽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
お手軽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
お手軽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
お手軽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
お手軽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
お手軽Hot Patching デモ Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 72
まとめ まとめ ・ モバイルアプリの競争は激しいので ・ 改善速度で差をつけよう ・ Hot Patchingが効果的! Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved . 73
Co p yrig ht © 2 0 1 7 Yaho o Jap an Co rp o ratio n. All Rig hts Reserved .