Slide 1

Slide 1 text

stand.fmの最近の取り組み アプリ起動速度の改善 株式会社stand.fm エンジニア 外松 俊尚 2021/10/02 React Native Matsuri 2021

Slide 2

Slide 2 text

外松 俊尚
 stand.fm エンジニア
 React Nativeはstand.fmで初めて触りました
 愛媛からフルリモート
 @toshi__toma


Slide 3

Slide 3 text

stand.fmは誰でもかんたんに
 アプリで収録・LIVE配信ができる音声 プラットフォーム
 
 React Nativeで開発してます


Slide 4

Slide 4 text

最近のstand.fmの取り組み


Slide 5

Slide 5 text

最近のstand.fmの取り組み ● ライブの安定化 ● コラボライブ ● アプリ起動速度の改善 ● 音声の再生速度の改善 ● 新機能開発 ● 技術移行 ● etc

Slide 6

Slide 6 text

最近のstand.fmの取り組み ● ライブの安定化 ● コラボライブ ● アプリ起動速度の改善 ● 音声の再生速度の改善 ● 新機能開発 ● 技術移行 ● etc

Slide 7

Slide 7 text

アプリ起動速度 ● stand.fmは開発から2年以上が経過 ○ 起動速度が問題になってきた ● 色んな事情で起動時に行われる処理の増加 ○ 新機能の追加、認証、初期化処理など ● 最近、改善に取り組んでいます

Slide 8

Slide 8 text

起動速度の計測


Slide 9

Slide 9 text

アプリ起動速度 ● まず大事なのは計測 ○ いま振り返っても、計測が一番大事 ● 計測ツール ○ Sentry Performance Monitoring ○ Firebase Performance Monitoring ● 既に導入されていたSentryで計測を開始

Slide 10

Slide 10 text

React NativeアプリをSentryでPerformance Monitoring @sentry/react-native https://docs.sentry.io/platforms/react-native/performance/

Slide 11

Slide 11 text

計測の導入 ● 最初は単純にrootのindex.jsの最初で計測を開始 結果を見るとなんか速い。こんなに速いはずがない ● 計測を開始してるのは、JSが実行される段階 ○ 「アイコンをタップ」した直後くらいから計測を開始したい

Slide 12

Slide 12 text

react-native-startup-time ● react-native-startup-timeを利用 ○ https://www.npmjs.com/package/react-native-startup-time ○ getTimeSinceStartup() ● ネイティブモジュールの初期化タイミングからの経過時間を JavaScript側で取得 ○ 計測開始のタイムスタンプを作成 ○ 正確ではないけど、十分と判断 ● ストップウォッチで測ったりして、体感とかなり近い結果が出た

Slide 13

Slide 13 text

起動速度計測の定義 ● 計測開始 ○ ユーザー:アイコンがタップされた直後 ○ システム:ネイティブモジュールの初期化タイミング ● 計測終了 ○ ユーザー:Splashスクリーンから抜けた ○ システム:Splashスクリーンの終了 (react-native-splash-screen:Splashスクリーンの終了タイミングを調整 )

Slide 14

Slide 14 text

無事に起動速度を計測できた データの例 ● バージョンごと、iOS/Android単位での推移も確認できる

Slide 15

Slide 15 text

各計測にはボトルネックになりえる処理をマークしておいた データの例

Slide 16

Slide 16 text

ボトルネックの洗い出し ● 計測結果からReact Native側とstand.fm側の処理に分類して ボトルネックを洗い出した ● stand.fm ○ 起動時に必須ではないネットワークリクエストや初期化処理 ○ トップページのデータ読み込み ● React Native ○ JavaScriptの実行開始まで

Slide 17

Slide 17 text

ネットワークリクエストの改善 起動時に必須ではない処理の改善

Slide 18

Slide 18 text

ネットワークリクエストの改善 ● 直列になっていた処理を並列化 ● デフォルトタブ以外の情報のレスポンスを待っていたのを改善 ● APIのモニタリング結果を見て遅いリクエストの精査

Slide 19

Slide 19 text

起動時に必須ではない処理の改善 ● 計測結果や起動までのコードをチェック ○ 計測結果を見て初めて分かることが多い ● 起動時に必須ではないけど、時間がかかってる箇所があったの で改善

Slide 20

Slide 20 text

アラートの設定 ● 起動時の処理は気をつけないといつの間にか処理が増えていく ○ 新機能、ログ、お知らせ、認証などなど ● 意図せず遅くなっている状態に気付きたい Sentryでアラートを設定した ○ 閾値より遅くなるとSlackに通知

Slide 21

Slide 21 text

トップページのデータ読み込み


Slide 22

Slide 22 text

トップページのデータ読み込み ● トップページを表示するために必要な情報を全て取得していた

Slide 23

Slide 23 text

トップページの改善 ● 起動時はファーストビューに見える範囲の情報を取得 ○ 残りは起動に必須とせずに別で取得させるようにした ● react-native-shimmer-placeholder ○ ファーストビュー以降は取得までは シマーを表示させるように ● トップページの情報をサーバーサイドで キャッシュさせてレイテンシの改善など

Slide 24

Slide 24 text

Hermes


Slide 25

Slide 25 text

Hermes ● もともとAndroidではHermesに移行していた ● React Native v0.64にアップデートしたタイミングでiOSも有効化 ○ JSの実行までの時間が短縮された!! ● しかし、Hermesが原因でクラッシュするIssueがあり、いまは一時 的にOFFにしてる ○ React Native v0.66で改善しそう??

Slide 26

Slide 26 text

Hermes化の効果 ● 圧倒的に起動速度が改善した ● Hermesの有効化前後のバージョンで50%tileで650ms速くなった ● 再度有効化できればもっと早くなりそう

Slide 27

Slide 27 text

改善結果


Slide 28

Slide 28 text

改善結果 ● 対応したこと ○ ネットワークリクエストの改善 ○ 起動時に必須ではない処理の改善 ○ トップページのデータ取得の改善 ○ (Hermes化) ● 起動速度が速くなった ○ 50%tile: ⬇1.33s ○ 95%tile: ⬇3.15s

Slide 29

Slide 29 text

We are hiring! エンジニア積極的に募集中です https://corp.stand.fm/recruit 詳細はこちら ● CTO候補 ● VPoE候補 ● クライアントエンジニア ● バックエンドエンジニア ● 機械学習エンジニア ● 配信基盤エンジニア ● QAエンジニア ● エンジニアリングマネージャー ● UI/UXデザイナー 積極募集しているプロダクト開発メンバー

Slide 30

Slide 30 text

現在抱えている技術課題・今後の技術的チャレンジ 
 ▶アプリ起動速度を高速にしたい 
 
 ▶音声編集機能リッチ化 
  写真アプリがスマホだけでお洒落な加工を可能にしたように、機材や知識がなくてもアプリだけで、
  高クオリティの音声配信をシンプルなUI/UXで実現したい
  (例) 複数BGM、BGMの fade in&out、ジングル挿入、効果音挿入、音声スニペットのコピペ、など
 
 ▶アプリの複雑化への対応 
  開発者が増え、機能が増えてもメンテナンスしやすい構造にしたい
 
 ▶異常状態を検知できるようにしたい 
  コラボ収録時に片方だけ音が入っていない・音割れしているなど、単純なエラーではない異常状態を検知したい
 
 ▶高クオリティなサービスをユーザーに届けるためのテストの自動化 
  リグレッションテストの自動化、ネットワーク状態・電話の割り込み・ディスク容量など特殊な状態のテスト
 クライアント


Slide 31

Slide 31 text

stand.fm エンジニア ● iOS、Androidのネイティブが得意な人 ○ JSだけでは実現が難しい要件も多い! ○ チームとして異なる強みの人がいる ● webのReactは経験してるけど、ネイティブアプリ開発は初 ○ RNでは、Reactの知識が普通に生かせる ○ stand.fmは全部がJS ● コードの歴史も長くなってきた ○ 技術移行などにも注力

Slide 32

Slide 32 text

No content