Android 5.1(7.0未満?)でアプリが起動できない問題の解決方法【Android Studio】
先日、私がGoogle Play Storeで公開しているアプリについて、Android 5.1で起動しないとのレビューがあり、その後 Android Studio のエミュレーターでもその症状を確認しました。
この記事では、その際どう対応したのかについて、Android 5.1(7.0未満?)でアプリが起動できない問題の解決方法として以下まとめます。
初心者ですので、間違えていることも多くあると思いますが、少しでも参考になれば幸いです。
環境:
Windows 10 Home
Android Studio 4.0
エミュレーターでの確認
Google Play Console からレビューがあったとの通知があり、確認すると、Android 5.1搭載タブレットにて起動しなかったとのレビューがされていました。
Android 8 や 9 では問題なく起動できていたのですが、古いバージョンには対応できていなかったようです。
私のアプリは、minSdkVersion を22に設定しており(API22はAndroid 5.1)、Android 5.1以上であればダウンロードできるようにしていたので、minSdkVersion の設定ミスではありません。
一応、自分の方でもAndroid 5.1で起動できないか確認することにしました。
Android 5.1搭載の端末は持っていないので、Android Studio のエミュレーターで確認。
とりあえず、レビューとほぼ同じ条件にするため、Nexus10とAPI22の組み合わせで確認しました。結果は画像1の通り。
Unfortunately, DiCalc has stopped. と表示され、アプリが起動できないことが確認されました。
念の為、タブレットであることが起動に影響していないか確認するため、Nexus5とAPI22の組み合わせでもエミュレーターを起動しましたが、これも同様にアプリが起動できませんでした。
Logcatでエラー確認
そこで、起動時にどういったエラーが出ているのか確認するため、Logcatを開いた上でエミュレーター中のアプリを起動します。
すると、D/AndroidRuntime: Shutting down VMの後に、E/AndroidRuntime: FATAL EXCEPTION: mainというエラーが確認され、その中にjava.lang.RuntimeException: Unable to start activity ComponentInfo{com.enoiu.dicalc/com.enoiu.dicalc.MainActivity}: java.lang.RuntimeException: A TaskDescription’s primary color should be opaqueという記述がありました。
Caused by: java.lang.RuntimeException: A TaskDescription’s primary color should be opaqueとも書いてあったので、これが原因のようです。
opaqueは不透明という意味らしいので、primary colorを不透明にしなさいということですね。つまり、primary colorを透過色にしていたのが間違いだったということです。
エラー修正
ということで、app > res > values > color.xml を表示し、primary color を変更します。
私は、アプリ作成時に何を思ったのか、primary color を8桁での指定、つまり透過色での指定にしていました。
これを、6桁での指定にして不透明色にしました。
Android 8 や 9 では問題なく起動できていたので、新しいosバージョンではprimary colorが透明色でも起動できるみたいですね。逆に、そのバージョン未満?だと不透明色であることが必要のようです。
これで解決できたと思ったのですが、、、アプリ起動できず。
まだエラーがあるようです。
再びLogcatでエラー確認
エラーが表示されない?
そこで再びLogcatでエラーを確認しようとしました。
が、なぜかLogcatにエラーが表示されず。
混乱した私は、アプリ内に指定してあるすべての色を透過色から不透明色へ変更するも、変化はなく、アプリ起動もできず。
そこで、Logcat内をじっくり見ると、logcatの上のほうに、デバイス名が表示されていることを発見。
デバイス名を見ると、最後に [DEAD] という表記が。
前回起動したエミュレーターを指定していたため、Logcatにエラーが表示されなかったようです。
エラー確認
ということで、現在実行しているエミュレーターを選択した上で、アプリ起動をしました。
すると、一度目のエラーと同様、D/AndroidRuntime: Shutting down VM の後に、E/AndroidRuntime: FATAL EXCEPTION: mainというエラーが確認され、その中に、java.lang.RuntimeException: Unable to start activity ComponentInfo{com.enoiu.dicalc/com.enoiu.dicalc.MainActivity}: android.view.InflateException: Binary XML file line #158: Error inflating class Buttonという記述が。
さらにその中に、
- Caused by: android.view.InflateException: Binary XML file line #158: Error inflating class Button
- Caused by: android.content.res.Resources$NotFoundException: Resource “com.enoiu.dicalc:drawable/flame_style_red" (7f060061) is not a Drawable (color or path): TypedValue{t=0x1/d=0x7f060061 a=-1 r=0x7f060061}
という記述も確認されたので、これが原因のようです。
ただ、1.中のError inflating class Buttonの意味がよくわからなかったので、先に2.の問題を解決することにしました。
2.で指摘されている原因は、drawable/flame_style_redがDrawableでないということです。
このdrawable/flame_style_redとは、私がdrawableディレクトリ内に作成した、flame_style_red.xmlのことで、activity_main.xml内でボタンの背景色として指定していたものです。
flame_style_red.xmlはきちんとdawableディレクトリ内に作成したはずで、Android Studio の左にあるディレクトリツリーを見ても、flame_style_red.xmlがdrawableディレクトリ内にあることになっていたので、問題ないと思っていました。
しかし、よく見ると、flame_style_red.xmlの隣に、(v24) と薄く表記されていました。
調べてみると、drawableディレクトリには種類があり、古いAPIでも対応しているdrawableディレクトリと、API24?以降から対応しているdrawable-v24ディレクトリとがあるらしい。(API24はAndroid7.0)
私が、flame_style_red.xmlを作成する際に、誤ってdrawableではなくdrawable-v24に作成してしまったのが問題だったようです。
エラー修正
ということで、flame_style_red.xmlをdrawable-v24からdrawableへと移動させます。
画像2のように、移動するファイルを右クリックし、Refactor > Move File… を選択。
画像3で赤枠に囲っている…を選択し、
drawableを選択し、OKを押します(画像4参照)。
他にもdrawable-v24内に色を指定しているファイルがあったので、これもdrawableに移動させました。
その上で、エミュレーターを立ち上げると、、、アプリが起動しました!
きちんと動作もしています。
実機(Android 9)でも動作を確認できました。
Error inflating class Buttonについて直接処置をしたわけではないので、このエラーは、色をうまく読み込めなかったことによるものだったということでしょう。
まとめ
こうした経緯で、Android 5.1でアプリを起動できない問題を解決しました。
- primary color を不透明色にする
- drawable-v24内にあるファイルをdrawableへ移動させる
この2つの修正によってAndroid 5.1でもアプリを起動できるようになりました。
Android8 や 9ではこの修正をしなくとも起動していたこと、そしてdrawable-v24がAPI24(Android7.0)以降で使用できるものであることを踏まえると、Android7.0未満でアプリを起動できない際の対処方法であるといえると思います。
こういったエラー対応が初めてだったこともあって、初歩的なところでつまづいているように思いますが、なんとか対応できてよかったですし、勉強になりました。
修正したアプリについてはこちら
参考:
https://stackoverflow.com/questions/29166809/5-1-crash-a-taskdescriptions-primary-color-should-be-opaque
https://stackoverflow.com/questions/29095063/resourcesnotfoundexception-resource-is-not-a-drawable-color-or-path