AndroidのこれまでのSupport Libraryと新しいAndroidXは共存できません
ある日Android StudioでGradle Syncしたら次のようなエラーに出くわした。
Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0-rc01] AndroidManifest.xml:22:18-91
is also present at [androidx.core:core:1.0.0-rc02] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).
Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:7:5-36:19 to override.
言っている内容としてはapplication@appComponentFactoryというAttributeが重複して定義されているとのこと。一応Suggestionはあるがこれをしても解決しない様子。
バージョンの違うサポートライブラリを入れるとLintの警告が出ることは知っていたが、この問題はそれと似たようなものだった。明らかに28.0.0-rc01と1.0.0-rc02はバージョン名として違い過ぎる。
Android Developers Blogの記事によるとAndroidのSupport Libraryはこれまでのcom.android.supportから始まるものからandroidxから始まるパッケージにリファクタリングされるとのこと。Migrationのために今もcom.android.supportの方も並行してアップデートを続けてくれるがそれは28.0.0のstable releaseを持って終了するとのこと。どうりで28.0.0のバージョンはやたらとalphaやbetaやらRelease Candidateばかりなわけだ。
ほとんどこの記事のいっているままやが、理由としてはアプリが使っているAPIがアプリパッケージに同梱されたSupport Libraryから呼び出されるのか、アプリがインストールされたAndroidのOSのものが呼び出されるのかわかりやすくする目的だそう。日本語がやばい。