安卓版Stripe出现ExceptionInInitializerError错误

3
使用Stripe库和示例(位于此处)。当我尝试在我们应用程序的发布版本中创建令牌时,我会得到以下堆栈跟踪:
    java.lang.RuntimeException: An error occured while executing doInBackground()
    at com.stripe.android.compat.AsyncTask$3.done(AsyncTask.java:250)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.ExceptionInInitializerError
    at com.stripe.net.APIResource.<clinit>(APIResource.java:37)
    at com.stripe.android.Stripe$1$1.doInBackground(Stripe.java:28)
    at com.stripe.android.Stripe$1$1.doInBackground(Stripe.java:23)
    at com.stripe.android.compat.AsyncTask$2.call(AsyncTask.java:236)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    ... 3 more
Caused by: java.lang.RuntimeException: Missing type parameter.
    at com.google.a.c.a.getSuperclassTypeParameter(TypeToken.java:84)
    at com.google.a.c.a.<init>(TypeToken.java:62)
    at com.stripe.model.FeeRefundCollectionDeserializer$1.<init>(FeeRefundCollectionDeserializer.java:17)
    at com.stripe.model.FeeRefundCollectionDeserializer.<clinit>(FeeRefundCollectionDeserializer.java:17)
    ... 8 more

使用调试版本似乎可以正常工作。我正在使用proguard,并已添加文档中指定的排除内容:

-keep class com.stripe.** { *; }

我正在使用一张测试卡,当我运行调试apk时,它会优雅地告诉我这是一个带有实际密钥的测试卡。但是,当我在实际apk中尝试相同操作时,会导致崩溃。
现在没有任何混淆测试...
编辑:
好的,我已经完全关闭了混淆,似乎问题已经解决了。所以现在我将尝试用我的极其有限的混淆知识来查找发生了什么问题 :)
这是我的完整proguard-rules.pro文件:
-dontwarn com.facebook.**
-dontwarn org.joda.time.**
-dontwarn org.codehaus.**
-dontwarn java.nio.**
-dontnote **ILicensingService
-keep class com.crashlytics.** { *; }
-keep class com.crashlytics.android.**
-keep class com.stripe.** { *; }
-keepattributes SourceFile,LineNumberTable,*Annotation*
1个回答

1

经过一番搜索,我了解到Proguard似乎在不应该的情况下剥夺了Stripe库中与Gson相关的类。

正如这里发布的那样, Google似乎建议为gson添加一些额外的Proguard设置:

-dontwarn com.facebook.**
-dontwarn org.joda.time.**
-dontwarn org.codehaus.**
-dontwarn java.nio.**
-dontnote **ILicensingService
-keep class com.crashlytics.** { *; }
-keep class com.crashlytics.android.**
-keep class com.stripe.** { *; }
##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-keep class sun.misc.Unsafe { *; }

##---------------End: proguard configuration for Gson  ----------
-keepattributes SourceFile,LineNumberTable

将这些设置添加到proguard似乎已经解决了我的应用程序的发布版本构建问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接