¿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:
- Eventos de apagado en Android
- Depuración de fallos de servicio
- ¿Cómo reiniciar automáticamente un servicio incluso si la fuerza del usuario lo cierra?
- Diferencia entre los receptores de servicio y difusión en android
- Recolector de datos de sensor de fondo en Android
/** * 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
- Servicio de Android que no recibe Actualizaciones de ubicación
- Android - Ejecutar en segundo plano - Service vs. standard java class
- Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE
- El servicio no se reinicia después de que "Clear Memory" + appWidget se bloquea
- Vinculante para ejecutar el servicio (después de finish ()) / callback Handler
- Servicio de asignar un montón de memoria?
- El archivo AIDL no genera un archivo Java
- Cómo pasar valor de cadena de servicio a la actividad en android?
2 Solutions collect form web for “¿Por qué NullPointerException ocurre con el uso de BillingService estándar?”
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?