-
Notifications
You must be signed in to change notification settings - Fork 58
Description
Hi
I have encountered a very strange crash while using this library, trying to create a client using PhotosLibraryClient.initialize(clientSettings) crashes the app with the following stack (I have removed paths mentioned in it and changed my package name)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.my.package, PID: 6210
java.lang.NoClassDefFoundError: Failed resolution of: Lio/grpc/CallCredentials2;
at io.grpc.auth.MoreCallCredentials.from(MoreCallCredentials.java:35)
at com.google.api.gax.grpc.GrpcCallContext.withCredentials(GrpcCallContext.java:131)
at com.google.api.gax.grpc.GrpcCallContext.withCredentials(GrpcCallContext.java:64)
at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:174)
at com.google.photos.library.v1.internal.stub.GrpcPhotosLibraryStub.create(GrpcPhotosLibraryStub.java:306)
at com.google.photos.library.v1.internal.stub.PhotosLibraryStubSettings.createStub(PhotosLibraryStubSettings.java:283)
at com.google.photos.library.v1.internal.InternalPhotosLibraryClient.<init>(InternalPhotosLibraryClient.java:183)
at com.google.photos.library.v1.PhotosLibraryClient.<init>(PhotosLibraryClient.java:103)
at com.google.photos.library.v1.PhotosLibraryClient.initialize(PhotosLibraryClient.java:116)
at com.my.package.managers.data.PhotosDataManager.<init>(PhotosDataManager.kt:32)
at com.my.package.managers.data.DataManager.<init>(DataManager.kt:17)
at com.my.package.data.dagger.DependencyProvider.provideDataManager(DependencyProvider.kt:39)
at com.my.package.data.dagger.DependencyProvider_ProvideDataManagerFactory.provideDataManager(DependencyProvider_ProvideDataManagerFactory.java:42)
at com.my.package.DaggerLookApp_HiltComponents_SingletonC.dataManager(DaggerLookApp_HiltComponents_SingletonC.java:128)
at com.my.package.DaggerLookApp_HiltComponents_SingletonC.access$2600(DaggerLookApp_HiltComponents_SingletonC.java:67)
at com.my.package.DaggerLookApp_HiltComponents_SingletonC$SwitchingProvider.get(DaggerLookApp_HiltComponents_SingletonC.java:630)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
at com.my.package.DaggerLookApp_HiltComponents_SingletonC.imageViewModel(DaggerLookApp_HiltComponents_SingletonC.java:132)
at com.my.package.DaggerLookApp_HiltComponents_SingletonC.access$1200(DaggerLookApp_HiltComponents_SingletonC.java:67)
at com.my.package.DaggerLookApp_HiltComponents_SingletonC$FragmentCImpl.injectLookGuidedStepSupportFragment2(DaggerLookApp_HiltComponents_SingletonC.java:428)
at com.my.package.DaggerLookApp_HiltComponents_SingletonC$FragmentCImpl.injectLookGuidedStepSupportFragment(DaggerLookApp_HiltComponents_SingletonC.java:412)
at com.my.package.ui.source_picker.Hilt_LookGuidedStepSupportFragment.inject(Hilt_LookGuidedStepSupportFragment.java:100)
at com.my.package.ui.source_picker.Hilt_LookGuidedStepSupportFragment.onAttach(Hilt_LookGuidedStepSupportFragment.java:51)
at androidx.fragment.app.Fragment.onAttach(Fragment.java:1783)
at com.my.package.ui.source_picker.Hilt_LookGuidedStepSupportFragment.onAttach(Hilt_LookGuidedStepSupportFragment.java:39)
at androidx.fragment.app.Fragment.performAttach(Fragment.java:2922)
at androidx.fragment.app.FragmentStateManager.attach(FragmentStateManager.java:464)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:275)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3138)
at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
E/AndroidRuntime: at android.app.Activity.performStart(Activity.java:7165)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2938)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6680)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassNotFoundException: Didn't find class "io.grpc.CallCredentials2" on path: DexPathList[[zip file "my-path"],nativeLibraryDirectories=[some-more-paths]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 50 more
After digging a bit into it, it seems that the CallCredentials2 class does not exists.
From the source code:
// TODO(zhangkun83): remove the suppression after we change the base class to CallCredential
@SuppressWarnings("deprecation")
final class GoogleAuthLibraryCallCredentials extends io.grpc.CallCredentials2 {
... rest of the class ...After a quick google search of this missing class I found this link to it's docs:
https://www.javadoc.io/static/io.grpc/grpc-api/1.25.0/io/grpc/CallCredentials2.html
where it is stated that THIS CLASS NAME IS TEMPORARY and is part of a migration. This class will BE DELETED as it replaces CallCredentials in short-term. THIS CLASS IS ONLY REFERENCED BY IMPLEMENTIONS. All consumers should be always referencing CallCredentials.
Is it possible that this actually happened? that CallCredentials2 does not exist anymore and the photo library is still attempting to use it?
I'm using version 1.7.1 of the photos library, and this is the way I attempt to create the client:
private val service: PhotosLibraryClient
init {
val token = sharedPrefManager.getPhotosTokenFromPref()
val accessToken = AccessToken(token, null)
val clientSettings = PhotosLibrarySettings.newBuilder()
.setCredentialsProvider(
FixedCredentialsProvider.create(
UserCredentials.newBuilder()
.setClientId("id")
.setClientSecret("secret")
.setAccessToken(accessToken)
.build()
)
).build()
service = PhotosLibraryClient.initialize(clientSettings)
Log.d(TAG, "PhotosLibraryClient initialized!")
}this is the part I think is relevant from my app's build dependency block:
implementation ('com.google.apis:google-api-services-drive:v3-rev110-1.23.0') {
exclude group: 'com.google.guava'
}
implementation ('com.google.api-client:google-api-client-android:1.20.0') {
exclude group: 'com.google.guava'
}
implementation 'com.google.android.gms:play-services-auth:19.2.0'
implementation 'com.google.photos.library:google-photos-library-client:1.7.1'
// hilt
implementation "com.google.dagger:hilt-android:2.38.1"
kapt "com.google.dagger:hilt-compiler:2.38.1"
// grpc
implementation 'io.grpc:grpc-okhttp:1.43.0'
implementation 'io.grpc:grpc-stub:1.43.0'
implementation 'io.grpc:grpc-netty:1.21.1'
implementation 'io.grpc:grpc-protobuf:1.37.0'Could it be something else? How can I go about fixing this issue?
I would be happy to share more code or information if needed
Thanks