SmartNews 5.0 ちょっと苦労した話 / shibuya.apk #19

SmartNews 5.0 ちょっと苦労した話 / shibuya.apk #19

2017/10/27 shibuya.apk #19で発表したスライドです。
SmartNewsアプリについての簡単な紹介と、主にtargetSdkVersionを上げた時に遭遇した問題とその対応についての説明です。

B9bd405720e9e7bcdd4d46304082e3bb?s=128

hideoohashi

October 27, 2017
Tweet

Transcript

  1. SmartNews 5.0 ちょっと苦労した話 2017/10/27 shibuya.apk #19 SmartNews Inc. Hideo Ohashi

  2. About Me • Androidアプリエンジニア@スマートニュース株式会社 • 2010年(Android 2.2 Froyoが出始めたあたり)からずっと Androidアプリエンジニアしてます 2

  3. About SmartNews 3

  4. 4

  5. SmartNews 5.0 • スライダーの導入 • 一部マテリアルデザインっぽく • targetSdkVersionのバージョンアップ v4.1.15 v5.0.5

    5
  6. v4.1.15 v5.0.5 6

  7. ちょっと苦労したこと 7

  8. SmartNewsのtargetSdkVersion • 約2年ほど前からtargetSdkVersionが22(Android 5.1 Lollipop MR1)のままだった • バージョンをあげよう 8

  9. SmartNewsのminSdkVersion • SmartNewsのminSdkVersionは8(Android 2.2 Froyo) ◦ SmartNewsユーザの過半数はAndroid 6.0以上 ◦ 一方でAndroid

    3.0以下のユーザも約1%ながら存在 9
  10. 想定していなかったこと • targetSdkVersionを上げたらいろいろ起きました 1. Support LibraryのminSdkVersionが9 2. Display size変更してもdensityが以前のまま 3.

    Applicationクラスが呼ばれないことがある 10
  11. 1.Support LibraryのminSdkVersionが9 (1) • compileSdkVersionとSupport Libraryのバージョンが違うと Android Studio上でエラー表示になる • Support

    Libraryのバージョンをあげるとビルドエラー ◦ > Manifest merger failed : uses-sdk:minSdkVersion 8 cannot be smaller than version 9 declared in library [com.android.support:support-v4:25.3.1] • 24.2.0からAPI level 8以下はサポート外になってました 11
  12. 1.Support LibraryのminSdkVersionが9 (2) • できることならminSdkVersionは8のままキープしたい • 幸いなことにがっつりSupport Libraryを使っていなかった • Support

    Librayへの依存を切り、必要なクラスを実装しました 12
  13. 2.Display size変更してもdensityが以前のまま (1) • targetSdkVersionを上げると、Display sizeの設定を変えても densityが以前のままで計算されて文字などが意図しないサイ ズで表示されてしまうことがあった • API

    level 24以上だとDisplay sizeを変更してもプロセスは生 き残ったままらしく、それが影響しているっぽい 13
  14. 2.Display size変更してもdensityが以前のまま (2) • よく見ると問題が起きるActivityと起きないActivityがある • シンプルなサンプルアプリでは起きない • 諦めようかな 14

  15. 2.Display size変更してもdensityが以前のまま (3) • View周りのソースコードを読んだり reflectionを使ってprivate memberの中身を 覗いてみたりしたところ、 TypedArray#mMetricsのdensityが 変わっていなかった

    • そこからオブジェクトの所有関係を 辿っていき、WebViewを生成していることが densityが変わらなくなる条件の 1つであることを突き止めました 15
  16. 2.Display size変更してもdensityが以前のまま (4) • 実際にWebViewの生成をやめてみると問題が 起きなくなった • WebViewの生成をやめるわけにはいかないので、 TypedArrayのキャッシュを追い出すworkaroudを入れること で対応しました

    16
  17. 2.Display size変更してもdensityが以前のまま (5) public class MyActivity extends Activity { @Override

    protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODE.N) { Resources res = getResources(); for (int i = 0; i < 5; i++) { res.obtainTypedArray(R.array.dummy) } } super.onCreate(savedInstanceState); } } <resources> <integer-array name=”dummy”> </integer-array> </resources> 17
  18. 3.Applicationクラスが呼ばれないことがある (1) • targetSdkVersionをあげたものをリリースして1週間ほど経っ たくらいに、1人のユーザから「アプリが起動できない」という報 告が届く • Crashlyticsには特にそれらしきバグが見当たらない • そのときは再インストール&端末の再起動を案内し、現象が

    解決した 18
  19. 3.Applicationクラスが呼ばれないことがある (2) • 数日後、別のユーザから同じような報告が届く • Google Developer Consoleを見てみると日に日に増えている クラッシュがあった •

    Applicationを継承したクラスのonCreate()が呼ばれていない と思われるようなクラッシュだった ◦ onCreate()でCrashlyticsの初期化を行なっているので、検出されないのも辻 褄があう • ApplicationのonCreate()が呼ばれないことがある? 19
  20. 3.Applicationクラスが呼ばれないことがある (3) • あった • 自動バックアップ処理が 実行されるときは AndroidManifest.xmlに Applicationクラスを 設定していても素の

    Applicationクラスが使われる ◦ https://android.googlesource.com/platform/frameworks/bas e/+/android-6.0.0_r7/services/core/java/com/android/server/ am/ActivityManagerService.java#6070 LoadedApk.java 20
  21. 3.Applicationクラスが呼ばれないことがある (4) • しかし自動バックアップのための何かをした覚えはない • targetSdkVersionを上げたことが影響してました 21

  22. 3.Applicationクラスが呼ばれないことがある (5) • コマンドラインからのバックアップ実行とアプリ起動をぶつけて みる ◦ adb shell bmgr fullbackup

    <package> • クラッシュが発生し、同じコールスタックが取れた ◦ クラッシュ発生以降、普通に起動してもクラッシュが発生する状態になった(お そらくActivityManagerService側のフラグ管理がおかしくなったため) 22
  23. 3.Applicationクラスが呼ばれないことがある (6) • 以前からallowBackup=”true”だったが特にバックアップ機能を 意識して使ってはいなかったので、falseに変更した • クラッシュが落ち着きました 23

  24. いろいろありましたが無事解決できました 24

  25. ご静聴ありがとうございました 25