Slide 1

Slide 1 text

解決むずかったバグ3選
 2022/04/12
 Android個人開発LT 
 @horitamon


Slide 2

Slide 2 text

● モバイルアプリエンジニア
 (Androidがメイン)
 ● 2021/09 Voicy入社
 ● 今年スノボにハマって
 18回ゲレンデへ
 ● なぜか小学校の教員免許持ってる 
 
 自己紹介
 horitamon(堀 多聞)


Slide 3

Slide 3 text

©2022 Voicy, Inc. はじめに
 
 ● Bluetooth LE使ってデータやりとりできるアプリをつくってます
 ● 全然進んでないので今日は話しません()
 ● アプリ開発をしていて「ちゃんと事前に検証しておけばよかった…」と
 反省したバグを赤裸々にご紹介
 ● ご迷惑をかけたユーザーのみなさま、大変申し訳ありませんでした。
 今回の発表内容


Slide 4

Slide 4 text

バグ①
 RecyclerViewの読み込みがめっちゃ重い


Slide 5

Slide 5 text

Android
 iOS


Slide 6

Slide 6 text

原因:
 RecyclerViewの高さを可変にしていることで描画処 理が毎回走る


Slide 7

Slide 7 text

©2022 Voicy, Inc. 原因
 ● RecyclerViewは同じようなレイアウトをたくさん表示するときに
 描画を効率化してくれる
 →画面に表示されていない範囲は描画しない
 ● 「もっと見る」を押してRecyclerViewの要素を追加すると
 RecyclerViewの表示範囲が広がるように実装していた
 →全要素の描画処理が一気に走ってしまう


Slide 8

Slide 8 text

端末の表示範囲
 NestedScrollView
 RecyclerView
 端末の表示範囲
 NestedScrollView
 RecyclerView


Slide 9

Slide 9 text

端末の表示範囲
 NestedScrollView
 RecyclerView
 端末の表示範囲
 NestedScrollView
 RecyclerView
 全部描画!

Slide 10

Slide 10 text

©2022 Voicy, Inc. 対策
 
 ● ベストは併用しないこと
 ● 併用するとしたらRecyclerViewの高さを固定にする
 →表示範囲外のitemはスクロールした後に描画処理が走る


Slide 11

Slide 11 text

端末の表示範囲
 NestedScrollView
 RecyclerView
 端末の表示範囲
 NestedScrollView
 RecyclerView
 暫定的に固定して スクロールできるように

Slide 12

Slide 12 text

バグ②
 たまにしかPush通知が届かない


Slide 13

Slide 13 text

©2022 Voicy, Inc. 現象
 ● Firebase Cloud Messagingを使ってPush通知を実装している
 ● 動作確認のタイミングでは大体通知が届く
 ● 放送開始、運営からのお知らせなど、種別問わずすべての通知が届く
 ● 開発版でも製品版でも届く
 
 ● でもしばらく使ってると届かなくなる…
 Push通知が来ることには来る、でも来なくなる
 


Slide 14

Slide 14 text

原因:
 トークン更新処理が完了する前に
 トークンを再発行していた


Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

https://firebase.google.com/docs/reference/android/com/google/firebase /messaging/FirebaseMessaging?authuser=0#public-methods

Slide 18

Slide 18 text

https://firebase.google.com/docs/reference/android/com/google/firebase /messaging/FirebaseMessaging?authuser=0#public-methods

Slide 19

Slide 19 text

https://firebase.google.com/docs/reference/android/com/google/firebase /messaging/FirebaseMessaging?authuser=0#public-methods 非同期

Slide 20

Slide 20 text

©2022 Voicy, Inc. 原因と対策
 
 ● firebase-bomを26.2.0→28.2.0にアップデートした
 →そのタイミングでFirebaseMessaging.deleteToken()が
  非同期メソッドに変わった
 ● トークンの削除が完了する前に発行処理をしていたので
 発行後にトークンが更新されていた
 ● 完了を待機してから再発行するように修正


Slide 21

Slide 21 text

削除完了を 待機

Slide 22

Slide 22 text

バグ③
 Android 8の端末だけアプリ起動できない


Slide 23

Slide 23 text

©2022 Voicy, Inc. 現象
 
 ● シンプルにAndroid 8だけ起動しない
 ● 8より古いOSも、新しいOSも起動する
 Android 8だけアプリが起動しない
 


Slide 24

Slide 24 text

©2022 Voicy, Inc. 原因と対策
 
 ● 以下の条件を満たすとクラッシュする
 ○ Android 8.0 の端末
 ○ targetSdkVersion が 27 以上 
 ○ 背景を透過にしている 
 ○ 画面の向きを固定している 
 ● アプリ全てで使ってるStyleで
 android:windowIsTranslucentをtrueにしてしまった
 →すぐ設定を削除


Slide 25

Slide 25 text

©2022 Voicy, Inc. 原因と対策
 
 ● 下記の記事に救われました…ありがとう…
 ○ java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation - Qiita 


Slide 26

Slide 26 text

ぜひ日々のプロダクト開発や個人開発で
 同じ轍を踏まないよう
 参考にして頂けますと幸いです…


Slide 27

Slide 27 text

音声×テクノロジーでワクワクする社会をつくる