Monacaチームの小田川です。
Android 12(APIレベル 31)のリリースから半年以上が経過し、Monacaで提供しているリモートビルドサーバでもtargetSdkVersion 31
でビルドされるケースが増えてきました。
Android 12では、intent-filter
の設定方法に変更があり、それに伴いビルドエラーも多くなってきました。今回は、Android 12(APIレベル 31)の設定や注意点について見ていきたいと思います。
Android 12(APIレベル 31)の設定
Monacaで作成するアプリでAndroid 12(APIレベル 31)から提供されている機能を利用する場合は、Androidプラットフォーム10系以降を使用する必要があります。
Android 12から提供されている機能を利用する場合は、compileSdkVersionに対して31
を設定する必要があります。
現在提供されているAndroidプラットフォーム10系では、targetSdkVersionに設定した値がcompileSdkVersionに反映されます。そのため、targetSdkVersionに31を設定した場合は、compileSdkVersionも31が設定されます。
Androidプラットフォーム10系に設定されているtargetSdkVersionの標準設定は、30になります。MonacaでtargetSdkVersionを31に設定する場合は、MonacaクラウドIDEのAndroidアプリ設定
画面にあるターゲットSDKバージョン
に31を設定することで対応することができます。
intent-filter設定について
Android 12に対応したアプリに、intent-filterを使用するアクティビティ、サービス、ブロードキャスト レシーバが含まれている場合は、AndroidManifest.xmlにandroid:exported
属性を宣言する必要があります。
Androidプラットフォーム内にあるAndroidManifest.xmlでは、アクティビティ(activity)にintent-filterが含まれています。対象のアクティビティーに対してandroid:exported属性が宣言されていない場合は、ビルドの際に以下のようなandroid:exportedに関するエラーが発生します。
Execution failed for task ':app:processReleaseMainManifest'.
> Manifest merger failed : Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
android:exportedに関するビルドエラーの対応方法
Androidプラットフォーム 10.1.2を使用する
現在リリースされている最新版のAndroidプラットフォーム 10.1.2
では、AndroidManifest.xmlに設定されているアクティビティー(activity)に対して、android:exported属性が宣言されています。そのため、android:exportedに関するビルドエラーが発生した場合は、Androidプラットフォーム 10.1.2を使用することで対応することができます。
Monacaでは、Cordova 11用のMonacaプロジェクトでAndroidプラットフォーム 10.1.2に対応しています。
Androidプラットフォーム 10.1.2の設定は、MonacaクラウドIDEのビルド環境の設定
画面から行うことが出来ます。
Androidプラットフォーム 10.1.2を使用してもビルドエラーが発生する場合
intent-filterの設定は、Androidプラットフォーム内にあるAndroidManifest.xml以外に、Cordovaプラグインの設定ファイル(plugin.xml)でも設定されている場合があります。
Androidプラットフォーム 10.1.2を使用してもandroid:exportedに関するビルドエラーが発生する場合は、使用しているサードパーティー製Cordovaプラグインの設定ファイルにintent-filterが設定されていないか確認してください。
対象のCordovaプラグインの設定ファイルにintent-filterが設定されている場合は、最新版でandroid:exported属性が宣言されているか確認してください。最新版でandroid:exported属性が宣言されている場合は、最新版を利用することで対応することができます。
最新版にandroid:exported属性が宣言されていない場合は、以下の例のようにandroid:exported属性を宣言したカスタム版のCordovaプラグインを作成して利用する必要があります。
<!-- android:exported属性の設定例: -->
<config-file target="AndroidManifest.xml" parent="/manifest/application">
<receiver android:name="xxx.xxx.xxx" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
</intent-filter>
</receiver>
</config-file>
作成したカスタム版のCordovaプラグインは、ZipファイルにすることでMonacaクラウドIDEのCordovaプラグインの管理
画面からインポートして利用することができます。
おわりに
Cordova 11用のMonacaプロジェクトでターゲットSDKバージョンを31に設定したことでandroid:exportedに関するビルドエラーが発生した場合は、はじめに、Androidプラットフォーム 10.1.2を使用してビルドを試してみてください。
Androidプラットフォーム 10.1.2で対応できない場合は、使用しているサードパーティー製Cordovaプラグインの設定ファイル(plugin.xml)を確認し、intent-filterが設定されていて、android:exported属性が宣言されていない場合は、難易度は高くなりますが、android:exported属性を宣言したカスタム版のCordovaプラグインを作成してビルドを試してみてください。