外部SDK間でのAndroidManifestのコンフリクト解消事例

KazuhiroYonekuraPosted by

この記事は GRIPHONE Advent Calendar 2021 10日目の記事です。

こんにちは、Unityエンジニアの米倉です。
今回は外部のSDKをUnityプロジェクトに導入する際、外部SDK同士でAndroidManifestの定義がコンフリクトしてしまった際の解決事例について紹介します。

いきなり詰んだ

もともと導入済みのSDKをA、これから対応したいSDKをBとします。

まず、BのSDK導入対応としてnetwork_security_config.xmlの定義を求められました。(下図①,②)

図①
図②

まずは手順どおり、上記xmlファイルと設定の定義をプロジェクトのAndroidManifestに追記し、ビルドしました。

ところが、ビルドされたapkからManifestの実体を確認したところ、全く異なる内容でnetwork_security_configが設定されていました。この時点では原因不明です。

他のSDKを調査する

設定した覚えのないnetwork_security_configが既に存在していることがわかったため、それがどこで定義されているのかを調査しました。

結果、Aという導入済みのSDKの.aarライブラリに、AndroidManifestとnetwork_security_configがガッチリと定義され内包されていることがわかりました。(下図③,④)

図③
図④

上記AのSDK内で定義されていることは判明しましたが、このSDKのファイルを直接編集することはできないため(出来てもやらないほうがよいため)、この定義をそのままに、自前のManifest側でAとBの内容を適用したnetwork_security_configを作り、定義を奪う必要があります。

Manifest定義のマージ設定を行う

AndroidManifestは、複数ファイルに記載していてもビルド時に自動でマージされます。

このとき、各マージのルールを細かく指定する機能として「マージルール マーカー」というものが提供されています。この機能を利用すれば、他のSDKに定義された属性を、任意でオーバーライドしたり置換することが可能です。

参考リンク:複数のマニフェスト ファイルをマージする

今回はtools:replaceを使用し、自前のnetwork_security_config定義が優先されるように設定します。

自前Manifest側でtools:replaceを宣言(記事用に他の記載は省略しています)
自前network_security_configは両方のSDKで必要な属性を記載(記事用に他の記載は省略しています)

これで、Aに定義されていたnetwork_security_configを自前のファイルで置き換えることができ、AとBのSDKともに無事動作するようになりました。

まとめ

以上、複数SDK間でManifest定義がコンフリクトしてしまった場合の解決事例について紹介させていただきました。

自分自身が対応している中でも、あまり具体的な事例とともに解決が示されているケースが見られなかったため今回記事にまとめさせていただきました。

みなさんのSDK導入時の参考になれば幸いです。

ご覧頂きありがとうございました。