SecurityException: Invocación de Binder a una interfaz incorrecta en APK firmado

Estoy desarrollando una aplicación para conocer la ubicación. Integré los servicios de ubicación de Google Play y Google Maps en mi aplicación. Mi aplicación se ejecuta sin un problema en el modo de depuración. Cuando genera un APK firmado en modo de liberación y ejecuto la aplicación, se bloquea en el inicio con la siguiente excepción:

Process: com.example.akif, PID: 4233 java.lang.RuntimeException: Unable to resume activity {com.example.akif/com.example.akif.activities.MainActivity}: java.lang.SecurityException: Binder invocation to an incorrect interface at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3400) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) Caused by: java.lang.SecurityException: Binder invocation to an incorrect interface at android.os.Parcel.nativeEnforceInterface(Native Method) at android.os.Parcel.enforceInterface(Parcel.java:482) at vz.onTransact(:com.google.android.gms.DynamiteModulesB:81) at android.os.Binder.transact(Binder.java:499) at com.google.android.gms.maps.a.bt.c(Unknown) at com.google.android.gms.maps.ib(Unknown) at com.google.android.gms.bdb(Unknown) at com.google.android.gms.bja(Unknown) at com.google.android.gms.maps.hb(Unknown) at com.google.android.gms.maps.ha(Unknown) at com.google.android.gms.bac(Unknown) at com.google.android.gms.bae(Unknown) at com.google.android.gms.maps.gf(Unknown) at android.support.v4.app.k.ay(Unknown) at android.support.v4.app.xl(Unknown) at android.support.v4.app.ax.h(Unknown) at android.support.v4.app.ax.i(Unknown) at android.support.v4.app.ax.run(Unknown) at android.support.v4.app.x.ae(Unknown) at android.support.v4.app.i.aa(Unknown) at android.support.v4.app.a.onPostResume(Unknown) at android.support.v7.app.a.onPostResume(Unknown) at android.app.Activity.performResume(Activity.java:6792) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 

Me di cuenta siguiendo los logs en cada método de ciclo de vida que esto sucede en el método onResume de mi fragmento donde compruebo la disponibilidad de Google Play Services de la siguiente manera:

 @Override public void onResume() { Log.debug(getClass(), "onResume()"); GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); int googlePlayServicesAvailabilityResult = googleApiAvailability.isGooglePlayServicesAvailable(getContext()); if (googlePlayServicesAvailabilityResult != ConnectionResult.SUCCESS) { if (!googleApiAvailability.isUserResolvableError(googlePlayServicesAvailabilityResult)) { Toast.makeText(getContext(), "Your device doesn't support Google Play location services. This application cannot run without it!", Toast.LENGTH_LONG).show(); getActivity().finish(); return; } Dialog errorDialog = googleApiAvailability.getErrorDialog(getActivity(), googlePlayServicesAvailabilityResult, GOOGLE_PLAY_SERVICES_REQUEST_CODE); if (errorDialog != null) { errorDialog.setCancelable(false); errorDialog.setCanceledOnTouchOutside(false); errorDialog.setOnDismissListener((DialogInterface dialogInterface) -> { Toast.makeText(getContext(), "You need Google Play location services to run this application!", Toast.LENGTH_LONG).show(); getActivity().finish(); }); errorDialog.show(); } } else if (googleApiClient.isConnected() && !isUpdatingLocation) { startLocationUpdates(); } super.onResume(); } 

Mi archivo gradle tiene el siguiente aspecto:

 apply plugin: 'com.android.application' android { compileSdkVersion 24 buildToolsVersion "24.0.1" defaultConfig { applicationId "com.example.akif" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "0.1" jackOptions { enabled true } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } buildTypes { debug { applicationIdSuffix '.test' } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:24.2.0' compile 'com.android.support:cardview-v7:24.2.0' compile 'com.android.support:design:24.2.0' compile 'com.android.support:preference-v7:24.2.0' compile 'com.google.android.gms:play-services-location:9.4.0' compile 'com.google.android.gms:play-services-maps:9.4.0' compile 'com.github.mehmetakiftutuncu:toolbelt:1.1.0' compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'joda-time:joda-time:2.9.4' } 

Tengo dos claves de la API de Google Maps configuradas según mis nombres de paquetes com.example.akif.test y com.example.akif respectivamente, para los modos de depuración y liberación. Por lo tanto, no creo que esté relacionado con los nombres de los paquetes, pero de nuevo, podría muy bien ser sobre eso, ya que no he entendido nada del error.

¿Alguna idea de lo que está pasando?

Después de hacer un montón de investigación con casi ningún resultado, pude resolver el problema con las siguientes reglas de Proguard:

 -keep public class com.google.android.gms.* { public *; } -dontwarn com.google.android.gms.** 

Todavía no sé la verdadera razón por la que tuve este problema, pero parece arreglado con esto.

Espero que esto ayude.

  • OutOfMemory Error al intentar girar una imagen dentro de una vista de imagen
  • La orientación de la vista previa en el modo horizontal se gira en el sentido de las agujas del reloj con Camera2 api
  • ¿Existe la posibilidad de ejecutar applets en Android o Blackberry?
  • Hoja inferior de Android - tema de desplazamiento
  • Problemas al importar proyectos en Android Studio con respecto a ActionBarSherlock
  • Registro personalizado para la aplicación de Android
  • Cómo rellenar el adaptador RecyclerView con Firebase
  • ¿Por qué no puedo anular onConfigurationChanged (Configuration)?
  • AUDIOFOCUS_LOSS llamó después de una llamada telefónica en android
  • ¿Cómo puedo obtener datos de frecuencia de PCM usando FFT
  • Android Studio: Cómo elegir qué importar de VCS
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.