Googleが提示する最新のマテリアルデザインUI要素を使用したいと思います。したがって、プロジェクトgradleファイルにcom.google.Android.material:material:1.0.0-beta01
を追加しました。しかし、それ以来、次のエラーが発生します。
マニフェストの統合に失敗しました:属性application @ appComponentFactory value =(androidx.core.app.CoreComponentFactory)from [androidx.core:core:1.0.0-beta01] AndroidManifest.xml:22:18-86も[com.Android .support:support-compat:28.0.0-beta01] AndroidManifest.xml:22:18-91 value =(Android.support.v4.app.CoreComponentFactory)。提案:オーバーライドするには、AndroidManifest.xml:5:5-40:19の要素に「tools:replace = "Android:appComponentFactory"」を追加します。
マテリアルライブラリがなければ、すべて正常に動作します。
私がすでに試したもの
tools:replace="Android:appComponentFactory"
を追加しようとしました。しかし、これにより新しいエラーメッセージが残りました。Java.lang.RuntimeException:マニフェストのマージが複数のエラーで失敗しました。com.Android.build.gradle.tasks.ProcessManifest.doFullTaskAction(ProcessManifestのcom.Android.builder.core.AndroidBuilder.mergeManifestsForApplication(AndroidBuilder.Java:524)のログを参照してください。 .Java:75)at com.Android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.Java:106)
ログファイルを確認しましたが、idea.logに表示される警告は
2018-08-08 11:08:21,500 [スレッド267]警告-.tools.idea.model.ManifestInfo-getMergedManifestが失敗しましたマニフェストのマージが複数のエラーで失敗しました。ログを参照してください2018-08-08 11:08:21,642 [スレッド267]警告-.tools.idea.model.ManifestInfo-getMergedManifestが失敗しましたマニフェストのマージが複数のエラーで失敗しました。ログを参照してください2018-08-08 11:08:21,917 [Jプール0/7]
詳細
APIバージョン
Android {
compileSdkVersion 28
buildToolsVersion '28.0.0'
defaultConfig {
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
}
(同じAPIがファイルで選択されているAndroid Studioのプロジェクト構造)
依存関係:
dependencies {
api fileTree(include: ['*.jar'], dir: 'libs')
/** Android LIBRARIES **/
implementation 'com.Android.support:multidex:1.0.2'
implementation 'com.Android.support:appcompat-v7:28.0.0-beta01'
api 'com.Android.support:support-v13:28.0.0-beta01'
api 'com.google.Android.material:material:1.0.0-beta01'
api 'com.Android.support:design:28.0.0-beta01'
api 'com.Android.support:preference-v7:28.0.0-beta01'
api 'com.Android.support:cardview-v7:28.0.0-beta01'
api 'com.Android.support:customtabs:28.0.0-beta01'
api 'com.Android.support:support-v4:28.0.0-beta01'
/** GOOGLE PLAY SERVICE **/
api 'com.google.Android.gms:play-services-auth:15.0.1'
api 'com.google.Android.gms:play-services-drive:15.0.1'
api 'com.google.Android.gms:play-services-fitness:15.0.1'
api 'com.google.Android.gms:play-services-maps:15.0.1'
api 'com.google.Android.gms:play-services-wearable:15.0.1'
api 'com.google.Android.gms:play-services-vision:15.0.2'
api 'com.google.firebase:firebase-core:16.0.1'
api 'com.google.firebase:firebase-perf:16.0.0'
api 'com.crashlytics.sdk.Android:crashlytics:2.9.4'
//sunrise and sundown calculation for map day and night mode
api 'com.luckycatlabs:SunriseSunsetCalculator:1.2'
/** GOOGLE MAPS **/
implementation 'com.google.maps.Android:android-maps-utils:0.5'
implementation 'com.google.code.gson:gson:2.8.0'
/** EXTERNAL LIBRARIES **/
implementation 'org.osmdroid:osmdroid-Android:5.6.5'
implementation 'org.osmdroid:osmdroid-mapsforge:5.6.5'
implementation 'org.mapsforge:mapsforge-map-Android:0.6.1'
implementation 'org.mapsforge:mapsforge-map:0.6.1'
implementation 'com.caverock:androidsvg:1.2.2-beta-1'
//dropbox api
implementation 'com.dropbox.core:dropbox-core-sdk:3.0.6'
androidTestImplementation 'junit:junit:4.12'
implementation files('libs/samsung-health-data-v1.3.0.jar')}
マニフェスト
<manifest
package="com.user.libraries.bluetooth"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:Android="http://schemas.Android.com/apk/res/Android">
<uses-permission Android:name="Android.permission.NFC" />
<uses-permission Android:name="Android.permission.BLUETOOTH" />
<uses-permission Android:name="Android.permission.BLUETOOTH_ADMIN" />
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.BODY_SENSORS" />
<uses-permission Android:name="Android.permission.VIBRATE"/>
<application
tools:replace="Android:appComponentFactory"
Android:allowBackup="true"
Android:supportsRtl="true">
<service Android:name="com.user.libraries.location.LocationService" />
<service Android:name="com.user.libraries.location.BleLocationTrackerService" />
<service Android:name="com.user.libraries.sensors.SensorService"/>
<service Android:name="com.user.libraries.sharing.DataExchangerService"/>
<receiver
Android:name="com.user.libraries.bluetooth.BluetoothStateReceiver"
Android:enabled="true">
<intent-filter>
<action Android:name="Android.bluetooth.adapter.action.STATE_CHANGED"/>
</intent-filter>
</receiver>
<provider
Android:name="Android.support.v4.content.FileProvider"
Android:authorities="${applicationId}.provider"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/provider_paths"/>
</provider>
</application>
この問題を解決する方法はありますか?
ここでの主な問題は、追加することです
com.google.Android.material:material:1.0.0-beta01
これは新しくリリースされたandroidxパッケージに属し、現在、依存関係にあるAndroidサポートライブラリと互換性がありません。
次の2つのオプションがあります。
作業コードのサンプルは次のとおりです。
<Android.support.design.widget.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
app:boxStrokeColor="@color/colorAccent"
app:boxStrokeWidth="5dp">
<Android.support.design.widget.TextInputEditText
Android:id="@+id/messageEditText"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
</Android.support.design.widget.TextInputLayout>
追加することを忘れないでください
Android.useAndroidX=true
Android.enableJetifier=true
gradle.propertiesに。 gradle.propertiesがソース管理にないため、新しいマシンを使用するときにこれを常に忘れています。この場合に理にかなったエラーが発生したら素晴らしいでしょう。
私にもこの問題があります。このライブラリを依存関係で使用する場合
implementation 'com.google.Android.material:material:1.0.0'
これを与える:
マニフェストのマージに失敗しました:属性application @ appComponentFactory value =(androidx.core.app.CoreComponentFactory)from [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86も[com.Android.supportにあります:support-compat:28.0.0] AndroidManifest.xml:22:18-91 value =(Android.support.v4.app.CoreComponentFactory)。提案:オーバーライドするには、AndroidManifest.xml:5:5-40:19の要素に「tools:replace = "Android:appComponentFactory"」を追加します。
AndroidXに切り替えるとこの問題が発生します
リファクタリング-> AndoridXへの移行(Android studio 3.2以降のツールバー)
そして私の問題は解決します
問題は、AndroidXパッケージがAppCompatサポートパッケージと互換性がないことです。いずれかのタイプを選択する必要があります。 AndroidXはより新しく、さまざまなAndroidバージョンの互換性を簡単に操作できるように設計されています。 Googleには AppCompatからAndroidXへの移行 に関するガイドがあります。
アップグレードパスはかなり簡単ですが、少し面倒ですが、古いデザインパッケージにダウングレードするのではなく、最新の状態に保つためにそれを行うことをお勧めします。
以下をgradle.properties
ファイルに追加することにより、AndroidXを使用することを指定できます。
Android.useAndroidX=true
Android.enableJetifier=true
おそらく新しいパッケージの1つに関連する例外 Default interface methods are only supported starting with Android N (--min-api 24)
を回避するために、以下をapp/build.gradle
ファイルに追加する必要があることがわかりました。
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
次に、app/build.gradle
内のすべてのAppCompatパッケージを変更して、一致するAndroidXパッケージを使用する必要があります。上記のドキュメントの Artifact mappings セクションにリストがあり、すべてのパッケージのAppCompatからAndroidXへのマッピングが提供されます。
たとえば、次のパッケージは同じパッケージなので、AppCompatバージョンではなくAndroidXバージョンを使用していることを確認します。
implementation 'com.Android.support:design' # AppCompat version
implementation 'com.google.Android.material:material:1.1.0-alpha08' # AndroidX version
コンパイルしようとすると、新しいパッケージを使用するためにアクティビティを移行する必要があるため、エラーが発生するはずです。私にとっては、サポートライブラリのバージョンを削除し、AndroidXバージョンに置き換えて、次の変更を行う必要がありました。
# remove
-import Android.support.design.widget.FloatingActionButton
-import Android.support.design.widget.Snackbar
-import Android.support.v4.app.ActivityCompat
-import Android.support.v4.content.ContextCompat
-import Android.support.v7.app.AlertDialog
-import Android.support.v7.app.AppCompatActivity
-import Android.support.v7.widget.Toolbar
# add
+import com.google.Android.material.floatingactionbutton.FloatingActionButton
+import com.google.Android.material.snackbar.Snackbar
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.widget.Toolbar
+import androidx.core.app.ActivityCompat
+import androidx.core.content.ContextCompat
KotlinおよびJavaファイルでは、これは簡単です(上記のように)が、コンパイラーはレイアウトファイルに関しては役に立たないため、実行時にレイアウトが膨らんだときにレイアウトインフレーション例外がスローされます。また、レイアウトXMLファイルでそれらを変更する必要があります。
- <Android.support.design.widget.TextInputLayout
+ <com.google.Android.material.textfield.TextInputLayout
このプロセス中に、Gradleをアップグレードするよう求められることがありますが、これは良い考えです。
多少面倒ですが、新しいライブラリがリリースされても使用し続けることができるので、アップグレードパスに価値があると思います。
新しいバージョンのAndroid Studioには、移行を支援するためのいくつかの自動化があり、メニューで利用できます:リファクタリング> AndroidXへの移行。
最近、Googleは依存関係を分離したいと考えています。パッケージの名前を変更し、今からandroidxを使用することを提案します。そのため、最新のgoogle gradleバージョンはすべてandroidxの下にあります。
このためには、プロジェクトAndroid app compactをandroidxに移行する必要があります。 prgradle.propertiesファイルにいくつかのプロパティを使用する必要があります。
Android.useAndroidX=true
Android.enableJetifier=true
プロジェクトをAppCompactからAndroidxに移行する必要があります。ツールを使用してそれを行うことができます
リファクタリング-> AndoridXへの移行(Android studio 3.2以降のツールバー)
その後、通常のgradleをandroidx gradleにアップグレードする必要があります
https://developer.Android.com/jetpack/androidx/migrate
このリストから、alter androidx gradleを選択し、プロジェクトをビルドするだけで問題ありません。
Android stuido 3.4.1を使用して、プロジェクトを選択し、メインツールバーから[リファクタリング]を選択して、AndroidXに移行しました。再びしばらく時間がかかり、正常に完了しました。