Facturación en aplicaciones Android y Proguard (fuente desconocida)

Estoy utilizando el servicio de facturación en la aplicación de Google y Proguard. El archivo de configuración que estoy usando como Proguard es el que está en … / sdk / tools / proguard / proguard-android.txt

Como dice Google aquí: http://developer.android.com/google/play/billing/billing_best_practices.html He añadido la siguiente línea en el archivo de configuración:

-keep class com.android.vending.billing.** 

También utilizo los archivos actualizados de IAB de Google: https://code.google.com/p/marketbilling/source/detail?r=7ec85a9b619fc5f85023bc8125e7e6b1ab4dd69f

El problema es que a veces, los usuarios reportan fallos aleatorios con este stacktrace:

 E/AndroidRuntime: FATAL EXCEPTION: Thread-455 java.lang.NullPointerException at com.xx.xxxx.util.IabHelper.startSetup(Unknown Source) at com.xx.xxxx.util.IabHelper$2.run(Unknown Source) at java.lang.Thread.run(Thread.java:856) 

También sucedió en mi dispositivo (sólo la apertura de la aplicación), pero sólo pasó una vez a mí hoy.

Y no estoy seguro si se trata de problemas de los archivos de Google (de IAB) o algo falta en el archivo de configuración de Proguard.

Añadiendo la siguiente cadena

 -keep class com.android.vending.billing.** 

A la configuración de ProGuard le dice que no ofusque ese paquete.

La excepción viene de com.xx.xxxx.util.IabHelper, por lo que puede intentar agregar algo como

 -keep class com.xx.xxxx.util.IabHelper.** 

Para mantener su paquete como estaba sin ProGuard.

Su configuración de proguard es correcta. Incluso permito a obfuscate generado com.android.vending.billing.IInAppBillingService en mi aplicación y todo funciona bien.

Respecto a la clase IabHelper . No sugeriría utilizarlo "como es". En primer lugar, se ha demostrado ser buggy. En segundo lugar, puede ser hackeado por herramientas automáticas, incluso cuando se ofuscó. Sugiero que escribas tu propia clase basada en IabHelper y escribas junit tests para ello. Esto es lo que hice para mi proyecto también.

Esta línea en IabHelpers startSetup ()

 mContext.getPackageManager() .queryIntentServices(serviceIntent, 0); 

A veces puede devolver null, por lo que al comprobar si la lista está vacía obtiene el nullpointer.

Simplemente lo modifiqué para comprobar si hay nada antes de hacer otra cosa;

 List<ResolveInfo> queryIntentServices = mContext.getPackageManager() .queryIntentServices(serviceIntent, 0); if (queryIntentServices != null && !queryIntentServices.isEmpty()) { // service available to handle that Intent mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE); }else ... 

Sólo tiene que añadir esto a su archivo de configuración proguard para preservar los números de línea, entonces usted no conseguirá fuente desconocida:

-keepattributes Firma, SourceFile, LineNumberTable

Esto funcionó para mí

 -keep class com.android.vending.** { *; } 
  • Proguard: IllegalArgumentException - Error inesperado al evaluar la instrucción
  • Cómo bajar la versión proguard en androide gradle estudio?
  • Configuración de las reglas proguard en android, sólo puede cifrar el código?
  • Proguard Android con barra de acción Sherlock
  • Proguard mientras que la biblioteca Butterknife y otras advertencias
  • Error de Proguard, no se puede exportar la aplicación
  • Proguard config para newrelic en la aplicación android?
  • Cómo corregir la advertencia proguard 'no se puede encontrar el método de referencia' para los métodos existentes 'clonar' y 'finalizar' de la clase java.lang.Object
  • ¿Cómo usar -dontwarn en ProGuard?
  • RestTemplate, Jackson y proguard
  • Proguard Printmapping no funciona en Android Studio 2.0.0 (y 2.1.0)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.