NoSuchMethodError after CollectionReference.AddSnapshotListener
Xamarin.Android Version (eg: 6.0):
10.3.1.4
Operating System & Version (eg: Mac OSX 10.11):
macOS 10.15.5
Describe your Issue
Trying to use Firestore.CollectionReference.AddSnapshotListener with version 121.4.3-preview01 leads to a NoSuchMethod error. The AddSnapshotListener call succeeds but shortly afterwards the error is thrown:
So I guess this is when the Firestore libraries try to call back with a change.
This doesn't happen with the latest stable 71.1705.3 release however SetCacheSizeBytes() is unavailable in that version so I'm trying the latest preview release.
Relevant information
This is in a Xamarin.Forms project. The NuGet packages in use are:
Packages used:
<PackageReference Include="Xamarin.Forms" Version="4.7.0.1080" />
<PackageReference Include="Xamarin.Essentials" Version="1.5.3.2" />
<PackageReference Include="Xamarin.Firebase.Auth">
<Version>119.3.1-preview01</Version>
</PackageReference>
<PackageReference Include="Xamarin.Firebase.Firestore">
<Version>121.4.3-preview01</Version>
</PackageReference>
<PackageReference Include="Xamarin.AndroidX.Lifecycle.LiveData" Version="2.1.0" />
<PackageReference Include="Xamarin.AndroidX.Browser" Version="1.0.0" />
<PackageReference Include="Xamarin.Google.Android.Material" Version="1.0.0" />
<PackageReference Include="Xamarin.AndroidX.Legacy.Support.V4" Version="1.0.0" />
Build settings (tools)
<AndroidApplication>True</AndroidApplication>
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
<AndroidResgenClass>Resource</AndroidResgenClass>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<TargetFrameworkVersion>v9.0</TargetFrameworkVersion>
<AndroidEnableSGenConcurrent>true</AndroidEnableSGenConcurrent>
<AndroidUseAapt2>true</AndroidUseAapt2>
<AndroidHttpClientHandlerType>Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
Steps to Reproduce (with link to sample solution if possible):
Need a firestore database setup to be able to provide a demonstration of this.
Include any relevant Exception Stack traces, build logs, adb logs:
{Java.Lang.NoSuchMethodError: No virtual method putPropagating(Lio/opencensus/tags/TagKey;Lio/opencensus/tags/TagValue;)Lio/opencensus/tags/TagContextBuilder; in class Lio/opencensus/tags/TagContextBuilder; or its super classes (declaration of 'io.opencensus.tags.TagContextBuilder' appears in /data/app/com.tebira.firebasetest-1/base.apk:classes2.dex) --- End of managed Java.Lang.NoSuchMethodError stack trace --- java.lang.NoSuchMethodError: No virtual method putPropagating(Lio/opencensus/tags/TagKey;Lio/opencensus/tags/TagValue;)Lio/opencensus/tags/TagContextBuilder; in class Lio/opencensus/tags/TagContextBuilder; or its super classes (declaration of 'io.opencensus.tags.TagContextBuilder' appears in /data/app/com.tebira.firebasetest-1/base.apk:classes2.dex) at io.grpc.internal.CensusStatsModule$ClientCallTracer.<init>(CensusStatsModule.java:359) at io.grpc.internal.CensusStatsModule.newClientCallTracer(CensusStatsModule.java:146) at io.grpc.internal.CensusStatsModule$StatsClientInterceptor.interceptCall(CensusStatsModule.java:689) at io.grpc.ClientInterceptors$InterceptorChannel.newCall(ClientInterceptors.java:156) at io.grpc.internal.ManagedChannelImpl.newCall(ManagedChannelImpl.java:814) at io.grpc.internal.ForwardingManagedChannel.newCall(ForwardingManagedChannel.java:63) at io.grpc.android.AndroidChannelBuilder$AndroidChannel.newCall(AndroidChannelBuilder.java:288) at com.google.firebase.firestore.remote.GrpcCallProvider.lambda$createClientCall$0(com.google.firebase:firebase-firestore@@21.4.3:138) at com.google.firebase.firestore.remote.GrpcCallProvider$$Lambda$1.then(com.google.firebase:firebase-firestore@@21.4.3) at com.google.android.gms.tasks.zzg.run(com.google.android.gms:play-services-tasks@@17.0.2:2) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor$DelayedStartFactory.run(com.google.firebase:firebase-firestore@@21.4.3:229) at java.lang.Thread.run(Thread.java:818) }
OK, looks like if I add a reference to Xamarin.IO.OpenCensus.OpenCensusApi then that fixes the method not found error. Can it be set so this package is automatically referenced?
@aabc123
Xamarin.IO.OpenCensus.OpenCensusApi is for sure transitive reference. From what I recall: GPS-FB uses GRPC and OpenCensus is some kind of telemetry library.
Now, why this was removed? I have no idea. It could be R8 or xamarin linker removing that method overly aggressive or some other problem. Not sure.
Could you create 2 bin logs:
- without explicitly added
Xamarin.IO.OpenCensus.OpenCensusApinuget package - with explicitly added
Xamarin.IO.OpenCensus.OpenCensusApinuget package
please??
@moljac Would be happy to. How do I create a bin log?
*. add /bl to commandline invocation
*. install VS extension Project System Tools
See:
https://msbuildlog.com/
https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.ProjectSystemTools
https://github.com/dotnet/project-system-tools
https://lastexitcode.com/blog/2019/12/31/ProjectSystemToolsForVisualStudioMac/
I'm having a similar problem with this stacktrace and adding Xamarin.IO.OpenCensus.OpenCensusApi (version 0.21.0) solved it for me as well.
binlogs.zip contains the bin logs as you've requested. Hope this helps :)