¿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?

  • ¿Hay alguna manera de obtener actualizaciones de fondo de la API de Google Fit?
  • Servicio de Android: onBind (Intención) y onUnbind (Intención) se llama una sola vez
  • Cómo pasar valor de cadena de servicio a la actividad en android?
  • BadParcelableException: ClaseNotFoundException al unmarshalling
  • Conexión a un servicio web desde android - AsyncTask o Service?
  • android - utiliza la cámara desde el servicio de fondo
  • Servicio con cola de prioridad en Android
  • Adquisición de instancia del servicio de fondo
  • Servicio de asignar un montón de memoria?
  • Depuración de fallos de servicio
  • GCM de Android SERVICE_NOT_AVAILABLE
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.