Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

About SmartNews 3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

v4.1.15 v5.0.5 6

Slide 7

Slide 7 text

ちょっと苦労したこと 7

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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