Wir möchten die aktuellsten Materialdesign-Elemente von Google verwenden. Deshalb habe ich com.google.Android.material:material:1.0.0-beta01
in unsere Projekte-Datei aufgenommen. Aber seitdem bekomme ich folgende Fehlermeldung.
Manifest Fusion fehlgeschlagen: Attribut application @ appComponentFactory value = (androidx.core.app.CoreComponentFactory) von [androidx.core: core: 1.0.0-beta01] AndroidManifest.xml: 22: 18-86 ist auch anwesend bei [com.Android.support:support-compat:28.0.0-beta01] AndroidManifest.xml: 22: 18-91 value = (Android.support.v4.app.CoreComponentFactory) . Vorschlag: Fügen Sie 'tools: replace = "Android: appComponentFactory"' zu Element bei AndroidManifest.xml hinzu: 5: 5-40: 19, um es zu überschreiben.
Ohne die Materialbibliothek funktioniert alles gut.
Was ich schon probiert habe
tools:replace="Android:appComponentFactory"
zu unserer Manifest-Datei hinzuzufügen, wie in der Fehlermeldung vorgeschlagen. Dies hat mich jedoch mit einer neuen Fehlermeldung verlassen:Java.lang.RuntimeException: Manifest-Fusion mit mehreren Fehlern fehlgeschlagen, siehe Protokolle at com.Android.builder.core.AndroidBuilder.mergeManifestsForApplication (AndroidBuilder.Java:524) at com.Android.build.gradle.tasks.ProcessManifest.doFullTaskAction (ProcessManifest.Java:75) at com.Android.build.gradle.internal.tasks.IncrementalTask.taskAction (IncrementalTask.Java:106)
Ich habe die Protokolldatei überprüft, aber die einzige in idea.log angezeigte Warnung ist
2018-08-08 11: 08: 21,500 [Gewinde 267] WARN - .tools.idea.model.ManifestInfo - getMergedManifest ist fehlgeschlagen. Manifest Fusion mit mehreren Fehlern fehlgeschlagen, siehe Protokolle 2018-08-08 11: 08: 21.642 [Thread 267] WARN - .tools.idea.model.ManifestInfo - getMergedManifest fehlgeschlagen Manifestfusion mit mehreren Fehlern fehlgeschlagen, siehe Protokolle 2018-08-08 11: 08: 21,917 [J pool 0/7]
Mehr Informationen
API-Version
Android {
compileSdkVersion 28
buildToolsVersion '28.0.0'
defaultConfig {
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
}
(Dieselbe API wird in Datei> Projektstruktur in Android Studio ausgewählt.)
Abhängigkeiten:
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
<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>
Irgendeine Idee, wie ich dieses Problem lösen kann?
Hauptproblem hier ist, dass Sie hinzufügen
com.google.Android.material:material:1.0.0-beta01
das zum neu veröffentlichten androidx-Paket gehört und heutzutage nicht mit der Android-Support-Bibliothek kompatibel ist, die Sie in Ihren Abhängigkeiten haben.
Sie haben 2 Möglichkeiten:
Hier ist ein Beispiel für einen Arbeitscode:
<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>
Ich habe auch dieses Problem. Wenn Sie diese Bibliothek in Abhängigkeiten verwenden
implementation 'com.google.Android.material:material:1.0.0'
Gib das :
Manifestfusion ist fehlgeschlagen: Attribut [email protected] value = (androidx.core.app.CoreComponentFactory) aus [androidx.core: core: 1.0.0] AndroidManifest.xml: 22: 18-86 ist auch anwesend bei [com.Android.support:support-compat:28.0.0 __ AndroidManifest.xml: 22: 18-91 value = (Android.support.v4.app.CoreComponentFactory). Vorschlag: hinzufügen 'tools: replace = "Android: appComponentFactory"' zum Element bei AndroidManifest.xml: 5: 5-40: 19 überschreiben.
Ich habe dieses Problem, indem ich zu AndroidX wechsle
Gehen Sie zu Refactor-> Auf AndoridX migrieren (in der Symbolleiste von Android Studio 3.2 und höher)
Und mein Problem lösen
Vergiss nicht hinzuzufügen
Android.useAndroidX=true
Android.enableJetifier=true
zu Ihren gradle.properties. Ich vergesse das immer, wenn ich auf eine neue Maschine komme, weil gradle.properties nicht in der Quellcodeverwaltung ist. Wäre toll, wenn wir in diesem Fall einen vernünftigen Fehler erhalten würden.
Das Problem ist, dass AndroidX-Pakete nicht mit AppCompat-Support-Paketen kompatibel sind. Sie müssen den einen oder anderen Typ auswählen. AndroidX ist neuer und wurde entwickelt, um das Arbeiten mit Kompatibilitäten verschiedener Versionen von Android zu vereinfachen. Google hat eine Anleitung zu Migration von AppCompat auf AndroidX .
Der Upgrade-Pfad ist recht unkompliziert, aber etwas umständlich, aber ich würde empfehlen, dies zu tun, um auf dem neuesten Stand zu bleiben, anstatt ein Downgrade auf das ältere Design-Paket durchzuführen.
Sie können festlegen, dass Sie AndroidX verwenden möchten, indem Sie Folgendes zu Ihrer gradle.properties
- Datei hinzufügen:
Android.useAndroidX=true
Android.enableJetifier=true
Ich musste außerdem Folgendes zu meiner app/build.gradle
- Datei hinzufügen, um die Ausnahme Default interface methods are only supported starting with Android N (--min-api 24)
zu umgehen, die wahrscheinlich mit einem der neueren Pakete zusammenhängt:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Als nächstes müssen Sie alle Ihre AppCompat-Pakete in app/build.gradle
Ändern, um das passende AndroidX-Paket zu verwenden. Sie finden eine Liste im Abschnitt Artefaktzuordnungen der oben genannten Dokumentation, in der die AppCompat-Zuordnungen für AndroidX für alle Pakete bereitgestellt werden.
Das folgende Paket ist zum Beispiel dasselbe, sodass Sie sicherstellen, dass Sie die AndroidX-Version anstelle der AppCompat-Version verwenden:
implementation 'com.Android.support:design' # AppCompat version
implementation 'com.google.Android.material:material:1.1.0-alpha08' # AndroidX version
Wenn Sie versuchen zu kompilieren, sollten Sie Fehler erhalten, da Sie wahrscheinlich Ihre Aktivitäten migrieren müssen, um die neueren Pakete zu verwenden. Für mich musste ich die folgenden Änderungen vornehmen, die Unterstützungsbibliotheksversion entfernen und durch die AndroidX-Version ersetzen:
# 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
In den Kotlin- und Java -Dateien ist dies einfach (wie oben), aber der Compiler ist nicht hilfreich, wenn es um Layoutdateien geht, die zur Laufzeit Ausnahmen beim Aufblasen von Layouts auslösen. Sie müssen sie auch in Ihren Layout-XML-Dateien ändern:
- <Android.support.design.widget.TextInputLayout
+ <com.google.Android.material.textfield.TextInputLayout
Während dieses Vorgangs werden Sie wahrscheinlich aufgefordert, Gradle zu aktualisieren, was eine gute Idee ist.
Obwohl es etwas umständlich ist, denke ich, dass der Upgrade-Pfad es wert ist, weiterhin neue Bibliotheken verwenden zu können, wenn sie herauskommen.
Es sieht so aus, als ob in neueren Versionen von Android Studio eine gewisse Automatisierung vorhanden ist, die Sie bei der Migration unterstützt. Diese finden Sie im Menü: Refactor> Auf AndroidX migrieren.
Vor kurzem will Google die Abhängigkeit trennen. Sie benennen die Pakete um und schlagen vor, ab sofort Androidx zu verwenden. Die neuesten Versionen von Google Gradle sind also alle unter Androidx.
Sie müssen Ihr Projekt Android app compact zu androidx migrieren. Sie müssen einige Eigenschaften in der Datei prgradle.properties verwenden:
Android.useAndroidX=true
Android.enableJetifier=true
und Sie müssen Ihr Projekt von AppCompact auf Androidx migrieren, dafür können Sie es einfach mit Tools tun
Gehen Sie zu Refactor-> Zu AndoridX migrieren (in der Symbolleiste von Android studio 3.2 und höher)
Danach musst du dein reguläres gradle auf androidx gradle upgraden. Du findest es auf der offiziellen google seite wie
https://developer.Android.com/jetpack/androidx/migrate
Wählen Sie aus dieser Liste einfach das Alter Androidx Gradle und Ihr Projekt wird in Ordnung sein.
mit Android stuido 3.4.1 Ich konnte mein Projekt auswählen, Refactor in der Hauptsymbolleiste auswählen und dann auf AndroidX migrieren ... dies dauerte einige Augenblicke und dann gab es eine Schaltfläche 'Do Build ', dies dauerte erneut einige Momente und wurde erfolgreich abgeschlossen.