¿Por qué NullPointerException ocurre con el uso de BillingService estándar?

Utilizo el servicio de BillingService estándar en mi aplicación (es decir, copiado de la aplicación de muestra sin cambios). Pero a veces mi aplicación se bloquea con los siguientes datos en logcat:

 04-16 10:05:43.556: INFO/ActivityManager(96): Start proc tv.kinobaza.app for service tv.kinobaza.app/tv.kinobaza.billing.BillingService: pid=28748 uid=10081 gids={3003} 04-16 10:05:43.646: DEBUG/AndroidRuntime(28748): Shutting down VM 04-16 10:05:43.656: WARN/dalvikvm(28748): threadid=1: thread exiting with uncaught exception (group=0x400259f8) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): FATAL EXCEPTION: main 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): java.lang.RuntimeException: Unable to start service tv.kinobaza.billing.BillingService@4632f578 with null: java.lang.NullPointerException 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3282) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.access$3600(ActivityThread.java:135) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2211) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.os.Handler.dispatchMessage(Handler.java:99) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.os.Looper.loop(Looper.java:144) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.main(ActivityThread.java:4937) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at java.lang.reflect.Method.invokeNative(Native Method) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at java.lang.reflect.Method.invoke(Method.java:521) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at dalvik.system.NativeStart.main(Native Method) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): Caused by: java.lang.NullPointerException 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at tv.kinobaza.billing.BillingService.onStart(Unknown Source) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.Service.onStartCommand(Service.java:420) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3267) 04-16 10:05:43.656: ERROR/AndroidRuntime(28748): ... 10 more 04-16 10:05:43.736: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0xb947a8), pid=96, w=1, h=1 04-16 10:05:43.736: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0xb947a8), pid=96, w=1, h=1 04-16 10:05:43.766: DEBUG/SurfaceFlinger(96): Layer::requestBuffer(this=0xb947a8), index=0, pid=96, w=480, h=418 success 04-16 10:05:43.986: DEBUG/dalvikvm(28721): GC_FOR_MALLOC freed 9604 objects / 1369120 bytes in 102ms 

Aquí está el código relacionado:

 /** * We don't support binding to this service, only starting the service. */ @Override public IBinder onBind(Intent intent) { return null; } @Override public void onStart(Intent intent, int startId) { handleCommand(intent, startId); } 

¿Qué está mal aquí?

Lo que he notado – cuando el dispositivo duerme durante la noche, una vez que empiece a usarlo, se bloquea dentro de ~ 5 minutos.

Y, aquí hay más detalles: BillingService comenzó desde la pantalla de Preferencias de mi aplicación. Aquí el código de la clase Preferences :

 @Override protected void onDestroy() { mBillingService.unbind(); super.onDestroy(); } 

Actualización. Probablemente, debo iniciar este servicio / desvincularme en la actividad principal.

Aquí está mi proguard.cfg:

 -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keep class com.android.vending.billing.** -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -libraryjars /lib/libGoogleAnalytics.jar -libraryjars /lib/signpost-commonshttp4-1.2.1.1.jar -libraryjars /lib/signpost-core-1.2.1.1.jar -dontwarn org.apache.commons.codec.binary.Base64 

Así que obtienes este NPE después de proguard y no de antemano.

Usted debe estar ofuscando algo que no debería gustar una clase extendiendo Aplicación / Actividad / Servicio

No debes ofuscar estas clases:

http://proguard.sourceforge.net/index.html#/manual/examples.html (Ir al Ejemplo 7)

Sólo señalando lo obvio, pero si proguard eran el problema, entonces no veríamos su nombre de servicio de facturación en el rastro de la pila. (Veríamos un nombre ofuscado, y no tv.kinobaza.billing.BillingService.onStart).

Pruebe esto ¿Por qué el servicio Android falla con NullPointerException?

  • Animar ImageView dentro de WindowManager en un servicio de Android
  • ¿Es posible utilizar la herencia en las interfaces AIDL?
  • NotificationManager.cancel () no funciona para mí
  • ¿Cómo reiniciar automáticamente un servicio incluso si la fuerza del usuario lo cierra?
  • Depurar servicio de fondo en android utilizando intelliJ
  • No puedo encontrar la causa de mi accidente con este seguimiento de pila
  • Cómo mostrar un cuadro de diálogo de un servicio
  • Android - ¿Cómo decidir si ejecutar un servicio en un proceso separado?
  • Cómo detectar la visibilidad del selector de método de entrada sin el permiso de accesibilidad
  • Cómo saber si el usuario está en la pantalla de bloqueo desde el servicio
  • La notificación de la barra de estado de Android lanza una nueva aplicación aunque esté en ejecución. ¿Cómo sincronizar la aplicación de lanzamiento desde el icono de la aplicación y la notificación de barra de estado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.