Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

hideoohashi
October 27, 2017

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

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

hideoohashi

October 27, 2017
Tweet

More Decks by hideoohashi

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

  3. About SmartNews
    3

    View full-size slide

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

    View full-size slide

  5. v4.1.15 v5.0.5
    6

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  8. SmartNewsのminSdkVersion
    ● SmartNewsのminSdkVersionは8(Android 2.2 Froyo)
    ○ SmartNewsユーザの過半数はAndroid 6.0以上
    ○ 一方でAndroid 3.0以下のユーザも約1%ながら存在
    9

    View full-size slide

  9. 想定していなかったこと
    ● targetSdkVersionを上げたらいろいろ起きました
    1. Support LibraryのminSdkVersionが9
    2. Display size変更してもdensityが以前のまま
    3. Applicationクラスが呼ばれないことがある
    10

    View full-size slide

  10. 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

    View full-size slide

  11. 1.Support LibraryのminSdkVersionが9 (2)
    ● できることならminSdkVersionは8のままキープしたい
    ● 幸いなことにがっつりSupport Libraryを使っていなかった
    ● Support Librayへの依存を切り、必要なクラスを実装しました
    12

    View full-size slide

  12. 2.Display size変更してもdensityが以前のまま (1)
    ● targetSdkVersionを上げると、Display sizeの設定を変えても
    densityが以前のままで計算されて文字などが意図しないサイ
    ズで表示されてしまうことがあった
    ● API level 24以上だとDisplay sizeを変更してもプロセスは生
    き残ったままらしく、それが影響しているっぽい
    13

    View full-size slide

  13. 2.Display size変更してもdensityが以前のまま (2)
    ● よく見ると問題が起きるActivityと起きないActivityがある
    ● シンプルなサンプルアプリでは起きない
    ● 諦めようかな
    14

    View full-size slide

  14. 2.Display size変更してもdensityが以前のまま (3)
    ● View周りのソースコードを読んだり
    reflectionを使ってprivate memberの中身を
    覗いてみたりしたところ、
    TypedArray#mMetricsのdensityが
    変わっていなかった
    ● そこからオブジェクトの所有関係を
    辿っていき、WebViewを生成していることが
    densityが変わらなくなる条件の
    1つであることを突き止めました 15

    View full-size slide

  15. 2.Display size変更してもdensityが以前のまま (4)
    ● 実際にWebViewの生成をやめてみると問題が
    起きなくなった
    ● WebViewの生成をやめるわけにはいかないので、
    TypedArrayのキャッシュを追い出すworkaroudを入れること
    で対応しました
    16

    View full-size slide

  16. 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);
    }
    }




    17

    View full-size slide

  17. 3.Applicationクラスが呼ばれないことがある (1)
    ● targetSdkVersionをあげたものをリリースして1週間ほど経っ
    たくらいに、1人のユーザから「アプリが起動できない」という報
    告が届く
    ● Crashlyticsには特にそれらしきバグが見当たらない
    ● そのときは再インストール&端末の再起動を案内し、現象が
    解決した
    18

    View full-size slide

  18. 3.Applicationクラスが呼ばれないことがある (2)
    ● 数日後、別のユーザから同じような報告が届く
    ● Google Developer Consoleを見てみると日に日に増えている
    クラッシュがあった
    ● Applicationを継承したクラスのonCreate()が呼ばれていない
    と思われるようなクラッシュだった
    ○ onCreate()でCrashlyticsの初期化を行なっているので、検出されないのも辻
    褄があう
    ● ApplicationのonCreate()が呼ばれないことがある?
    19

    View full-size slide

  19. 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

    View full-size slide

  20. 3.Applicationクラスが呼ばれないことがある (4)
    ● しかし自動バックアップのための何かをした覚えはない
    ● targetSdkVersionを上げたことが影響してました
    21

    View full-size slide

  21. 3.Applicationクラスが呼ばれないことがある (5)
    ● コマンドラインからのバックアップ実行とアプリ起動をぶつけて
    みる
    ○ adb shell bmgr fullbackup
    ● クラッシュが発生し、同じコールスタックが取れた
    ○ クラッシュ発生以降、普通に起動してもクラッシュが発生する状態になった(お
    そらくActivityManagerService側のフラグ管理がおかしくなったため)
    22

    View full-size slide

  22. 3.Applicationクラスが呼ばれないことがある (6)
    ● 以前からallowBackup=”true”だったが特にバックアップ機能を
    意識して使ってはいなかったので、falseに変更した
    ● クラッシュが落ち着きました
    23

    View full-size slide

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

    View full-size slide

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

    View full-size slide