App Bundleを使用してる場合、apkファイルがリソースも言語やdpi等で分割されますが、PlayStoreからインストールする際に自動でそのデバイスに必要なものをインストールするようになっています。
しかし、世の中にはapkファイルを取得してきて外部のストアに公開し、さらにそれをインストールする人がいます。
(正規のストア以外からインストールすることを Sideloading
というらしいです)
この場合、baseとなるapkだけが公開されたりするので、リソースのあるapkが足りずにエラーを起こすことになります。
原因不明の Resources$NotFoundException
を見かけたら、これが原因の場合があります。
こういった不正な方法でインストールしたかどうかをチェックできる方法があります。
対策
ライブラリ
使用するのはPlay core libraryを使います。
implementation 'com.google.android.play:core:1.6.4'
単純なチェック
以下のコードでSideloadingかどうかを true/false で返してくれます。trueの場合はSideloadingになります。
MissingSplitsManagerFactory.create(context).isMissingRequiredSplits
ダイアログを表示する
もしSideloadingの場合は自動でダイアログを表示してアプリを使わせなくする方法もあります。
AndroidManifest.xmlで特殊なApplicationクラスを指定します。
もし、自分でApplicationクラスを拡張している場合は、以下のコードでチェックすることができます。
もしSideloadingだった場合は、次のようなダイアログが表示されます。
再現方法
bundletoolを使ってがんばる感じです。
注意
すいません、全然詳しいことは不明なのですが、場合によってはデバッグ実行や、aabを正しくインストールしているにも関わらずアプリが起動しなく現象が確認できました。
ぼくが遭遇したのは新規プロジェクトに今回の対応をしただけのアプリで発生しました。よくわからないですが、 lifecycle-extensions
を依存に追加したら動くようになりました。
ある程度の規模が必要なのか、それとも何か別の条件なのか、なぞです…
参考
※ 以前、ちゃんとしたドキュメントがあったのですが、今はリダイレクトされしまって見つからないです。
https://d.android.com/guide/app-bundle/sideload-check
これを書いてる時点ではAppBundleのKnown issuesのほうに行っちゃます。