3D WebView for Android with Gecko Engine includes several Android libraries as dependencies, and if a project already contains a copy of one of those libraries, it can cause a "Duplicate class" error to occur during the build process. There are two different kinds of these errors:
WebRTC duplicate class errors
The first type of "Duplicate class" build errors are those that mention "webrtc", like this one:
java.lang.RuntimeException: java.lang.RuntimeException: Duplicate class org.webrtc.CalledByNative found in modules classes.jar (:geckoview-97.0.20220202182137-without-gms:) and classes.jar (:libwebrtc:)
The GeckoView library used by 3D WebView contains an embedded copy of libwebrtc, so this build error can happen if the project includes another asset that contains libwebrtc, like the Unity WebRTC package. To resolve this issue, please replace 3D WebView's copy of GeckoView located at the following path with this version that has libwebrtc removed:
Assets/Vuplex/WebView/AndroidGecko/Plugins/libs/geckoview-138.0.20250517143237-without-gms.aar
Note that this will likely disable Gecko's WebRTC functionality because it's unlikely that the other asset uses the same version of libwebrtc as expected by Gecko. For reference, here's the script that was used to remove the libwebrtc classes from GeckoView.
Other duplicate class errors
The second type of "Duplicate class" build errors are those that don't mention "webrtc" and instead mention libraries like core-common, lifecycle-common, and lifecycle-runtime, like this:
java.lang.RuntimeException: Duplicate class androidx.arch.core.internal.FastSafeIterableMap found in modules androidx.arch.core.core-common-2.1.0.jar (androidx.arch.core.core-common-2.1.0.jar) and androidx.arch.core.core-common-2.1.0.jar (core-common-2.1.0.jar)
Duplicate class androidx.arch.core.internal.SafeIterableMap found in modules androidx.arch.core.core-common-2.1.0.jar (androidx.arch.core.core-common-2.1.0.jar) and androidx.arch.core.core-common-2.1.0.jar (core-common-2.1.0.jar)
Duplicate class androidx.arch.core.internal.SafeIterableMap$AscendingIterator found in modules androidx.arch.core.core-common-2.1.0.jar (androidx.arch.core.core-common-2.1.0.jar) and androidx.arch.core.core-common-2.1.0.jar (core-common-2.1.0.jar)
Duplicate class androidx.arch.core.internal.SafeIterableMap$DescendingIterator found in modules androidx.arch.core.core-common-2.1.0.jar (androidx.arch.core.core-common-2.1.0.jar) and androidx.arch.core.core-common-2.1.0.jar (core-common-2.1.0.jar)
Duplicate class androidx.arch.core.internal.SafeIterableMap$Entry found in modules androidx.arch.core.core-common-2.1.0.jar (androidx.arch.core.core-common-2.1.0.jar) and androidx.arch.core.core-common-2.1.0.jar (core-common-2.1.0.jar)
Duplicate class androidx.arch.core.internal.SafeIterableMap$IteratorWithAdditions found in modules androidx.arch.core.core-common-2.1.0.jar (androidx.arch.core.core-common-2.1.0.jar) and androidx.arch.core.core-common-2.1.0.jar (core-common-2.1.0.jar)
Duplicate class androidx.arch.core.internal.SafeIterableMap$ListIterator found in modules androidx.arch.core.core-common-2.1.0.jar (androidx.arch.core.core-common-2.1.0.jar) and androidx.arch.core.core-common-2.1.0.jar (core-common-2.1.0.jar)
Duplicate class androidx.arch.core.internal.SafeIterableMap$SupportRemove found in modules androidx.arch.core.core-common-2.1.0.jar (androidx.arch.core.core-common-2.1.0.jar) and androidx.arch.core.core-common-2.1.0.jar (core-common-2.1.0.jar)
Duplicate class androidx.arch.core.util.Function found in modules androidx.arch.core.core-common-2.1.0.jar (androidx.arch.core.core-common-2.1.0.jar) and androidx.arch.core.core-common-2.1.0.jar (core-common-2.1.0.jar)
Duplicate class androidx.collection.ArrayMap found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.ArrayMap$1 found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.ArraySet found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.ArraySet$1 found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.CircularArray found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.CircularIntArray found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.ContainerHelpers found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.LongSparseArray found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.LruCache found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.MapCollections found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.MapCollections$ArrayIterator found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.MapCollections$EntrySet found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.MapCollections$KeySet found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.MapCollections$MapIterator found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.MapCollections$ValuesCollection found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.SimpleArrayMap found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.collection.SparseArrayCompat found in modules androidx.collection.collection-1.1.0.jar (androidx.collection.collection-1.1.0.jar) and androidx.collection.collection-1.1.0.jar (collection-1.1.0.jar)
Duplicate class androidx.lifecycle.ClassesInfoCache found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.ClassesInfoCache$CallbackInfo found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.ClassesInfoCache$MethodReference found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.CompositeGeneratedAdaptersObserver found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.FullLifecycleObserver found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.FullLifecycleObserverAdapter found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.FullLifecycleObserverAdapter$1 found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.GeneratedAdapter found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.GenericLifecycleObserver found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.Lifecycle found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.Lifecycle$Event found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.Lifecycle$State found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.LifecycleEventObserver found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.LifecycleObserver found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.LifecycleOwner found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.LifecycleRegistry found in modules androidx.lifecycle.lifecycle-runtime-2.1.0-runtime.jar (:androidx.lifecycle.lifecycle-runtime-2.1.0:) and lifecycle-runtime-2.2.0-runtime.jar (:lifecycle-runtime-2.2.0:)
Duplicate class androidx.lifecycle.LifecycleRegistry$1 found in modules androidx.lifecycle.lifecycle-runtime-2.1.0-runtime.jar (:androidx.lifecycle.lifecycle-runtime-2.1.0:) and lifecycle-runtime-2.2.0-runtime.jar (:lifecycle-runtime-2.2.0:)
Duplicate class androidx.lifecycle.LifecycleRegistry$ObserverWithState found in modules androidx.lifecycle.lifecycle-runtime-2.1.0-runtime.jar (:androidx.lifecycle.lifecycle-runtime-2.1.0:) and lifecycle-runtime-2.2.0-runtime.jar (:lifecycle-runtime-2.2.0:)
Duplicate class androidx.lifecycle.LifecycleRegistryOwner found in modules androidx.lifecycle.lifecycle-runtime-2.1.0-runtime.jar (:androidx.lifecycle.lifecycle-runtime-2.1.0:) and lifecycle-runtime-2.2.0-runtime.jar (:lifecycle-runtime-2.2.0:)
Duplicate class androidx.lifecycle.Lifecycling found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.Lifecycling$1 found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.MethodCallsLogger found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.OnLifecycleEvent found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.ReflectiveGenericLifecycleObserver found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
Duplicate class androidx.lifecycle.ReportFragment found in modules androidx.lifecycle.lifecycle-runtime-2.1.0-runtime.jar (:androidx.lifecycle.lifecycle-runtime-2.1.0:) and lifecycle-runtime-2.2.0-runtime.jar (:lifecycle-runtime-2.2.0:)
Duplicate class androidx.lifecycle.ReportFragment$ActivityInitializationListener found in modules androidx.lifecycle.lifecycle-runtime-2.1.0-runtime.jar (:androidx.lifecycle.lifecycle-runtime-2.1.0:) and lifecycle-runtime-2.2.0-runtime.jar (:lifecycle-runtime-2.2.0:)
Duplicate class androidx.lifecycle.SingleGeneratedAdapterObserver found in modules androidx.lifecycle.lifecycle-common-2.1.0.jar (androidx.lifecycle.lifecycle-common-2.1.0.jar) and lifecycle-common-2.2.0.jar (lifecycle-common-2.2.0.jar)
3D WebView for Android with Gecko Engine includes copies of the core-common, lifecycle-common, and lifecycle-runtime Android libraries in the following libs folder:
Assets/Vuplex/WebView/AndroidGecko/Plugins/libs
So, these build errors can occur if the project contains another asset that includes the same Android libraries. To resolve the issue, please delete the libraries mentioned in the build error from 3D WebView's libs folder. That will cause 3D WebView to use the copy of the library included with the other asset that uses it.