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:
- ProGuard puede causar cálculos incorrectos
- ¿Cómo sé las clases de probIem Proguard se refiere a
- El uso de MultiDex en Android App ejecuta ProGuard dos veces y sólo segunda vez con Advertencias / Notas?
- Cambiar a Gradle: ¿por qué tengo que mantener las vistas personalizadas de ser ofuscada?
- Kotlin, Proguard y lambdas
-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.
- Android Studio - ProGuard IOException Duplicate Zip Entry
- Android form build.xml con proguard no se construye en la versión
- Android proguard obfuscated código está causando NullPointerException cuando realmente no debe ser
- Cómo incluir una configuración proguard en mi biblioteca de Android (AAR)
- ¿Cómo usar el ProGuard en Android Studio?
- Proguard con la colección parametrizada orrmlite
- Cómo proteger la llamada a webservice en Android
- Eliminar la llamada de registro mediante 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.** { *; }