2021年3月20日土曜日

Android PieでImageViewやbackgroundに設定した画像の色が変わる

 Android PieでImageViewやbackgroundに設定した画像の色が変わる現象に遭遇した。
(静的に色が変わったり、短い期間に動的に繰り返し変わってチカチカ点滅するような感じになる)

今のところAndroid Pie ( Android 9 )のSO-05KとEssential Phone PH-1で発生。またユーザーさんのレビューとしても上記チカチカが挙がっていて、そちらのOSもAndroid Pie。

モバイルSuicaやウェザーニュースのアプリでも明らかに開発側が意図していないだろう変色が起きていることから、広く発生している問題なのだろうと思う。

というわけで自分のアプリで少し現象を追ってみると大変不思議な挙動で、まず初回インストールでは発生しない。アップデートインストールで発生する。

発生した場合色が変わるタイミングが不明(起動直後に変わったり変わらなかったり)
状況的にはAdmobの特定のバナー広告を読み込むと発生しているように見える。(広告をロードしない場合は発生しなかったが、たまたま顕在化しなかっただけかもしれないので確定的ではない)
Admobのバージョンを18.6.0まで以降19.8.0までいくつかのバージョンで試したが、いずれもNG。

回避方法としてはハードウェアアクセセラレーションをオフにするとこの現象は発生しなくなる。
android:hardwareAccelerated="false"
でもこれだとパフォーマンスが下がってアニメーションがカクカクになってしまうので、
backgroundをvector drawableにする( vector drawableなら発生しない )などしてなるべく影響範囲を抑えたうえ、
どうしてもラスター画像が必要なところに対してだけ
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.P) {
imageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null );
}
としてハードウェアアクセラレーションを無効にするとよい。

おそらく何らかの条件が重なった時にだけ起こる問題のようで、StackOverflowでも全然見つからない。
こんなので困ってる人はそうそういないと思うけど、もしいたら参考にしてください。