I used the Google Cloud Translate API in my app. But in Android 5 and 6 it does not work properly and the Firebase Crashlytics dashboard shows the following types of errors. In other Android versions it works properly and only 100% of the bugs occurred on Android 5 and 6.
Fatal Exception: java.lang.NoClassDefFoundError: com.google.cloud.translate.TranslateImpl$1
at com.google.cloud.translate.TranslateImpl.<clinit>(TranslateImpl.java:44)
at com.google.cloud.translate.TranslateOptions$DefaultTranslateFactory.create(TranslateOptions.java:59)
at com.google.cloud.translate.TranslateOptions$DefaultTranslateFactory.create(TranslateOptions.java:53)
at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:540)
at com.codeboxlk.translator.di.NetworkModule$provideTranslateClient$translateService$2.invoke(NetworkModule.java:66)
at com.codeboxlk.translator.di.NetworkModule$provideTranslateClient$translateService$2.invoke(NetworkModule.java:62)
at kotlin.SynchronizedLazyImpl.getValue(SynchronizedLazyImpl.java:74)
at com.codeboxlk.translator.di.NetworkModule.provideTranslateClient$lambda-0(NetworkModule.java:62)
at com.codeboxlk.translator.di.NetworkModule.provideTranslateClient(NetworkModule.java:69)
at com.codeboxlk.translator.di.NetworkModule_ProvideTranslateClientFactory.provideTranslateClient(NetworkModule_ProvideTranslateClientFactory.java:38)
at com.codeboxlk.translator.DaggerApp_HiltComponents_SingletonC.translateClient(DaggerApp_HiltComponents_SingletonC.java:239)
at com.codeboxlk.translator.DaggerApp_HiltComponents_SingletonC.access$5000(DaggerApp_HiltComponents_SingletonC.java:141)
at com.codeboxlk.translator.DaggerApp_HiltComponents_SingletonC$SwitchingProvider.get(DaggerApp_HiltComponents_SingletonC.java:1146)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
at com.codeboxlk.translator.DaggerApp_HiltComponents_SingletonC$ViewModelCImpl.translateRepository(DaggerApp_HiltComponents_SingletonC.java:906)
at com.codeboxlk.translator.DaggerApp_HiltComponents_SingletonC$ViewModelCImpl.access$3200(DaggerApp_HiltComponents_SingletonC.java:867)
at com.codeboxlk.translator.DaggerApp_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider.get(DaggerApp_HiltComponents_SingletonC.java:994)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
at com.codeboxlk.translator.DaggerApp_HiltComponents_SingletonC$ViewModelCImpl.translateViewModel(DaggerApp_HiltComponents_SingletonC.java:946)
at com.codeboxlk.translator.DaggerApp_HiltComponents_SingletonC$ViewModelCImpl.access$4000(DaggerApp_HiltComponents_SingletonC.java:867)
at com.codeboxlk.translator.DaggerApp_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider.get(DaggerApp_HiltComponents_SingletonC.java:1018)
at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory$1.create(HiltViewModelFactory.java:100)
at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:69)
at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:84)
at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:109)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.java:54)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.java:41)
at com.codeboxlk.translator.ui.translate.TranslateFragment.<clinit>(TranslateFragment.java:108)
at com.codeboxlk.translator.ui.translate.TranslateFragment.onViewCreated(TranslateFragment.java:175)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
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:501)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1266)
at android.app.Activity.performStart(Activity.java:6943)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3277)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3416)
at android.app.ActivityThread.access$1100(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7326)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
I've created a translation service like the following:
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideTranslateClient(@ApplicationContext context: Context): TranslateClient {
val headers: Map<String, String> = ImmutableMap.of(
"X-Android-Package", context.packageName,
"X-Android-Cert", (context.getApplicationSignature()[0])
)
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
val translateService: Translate by lazy {
TranslateOptions.newBuilder()
.setApiKey(context.getString(R.string.path))
.setHeaderProvider { headers }
.build().service
}
return TranslateClient(context, translateService)
}
}