5

我正在使用 Google 和 Proguard 的应用内计费服务。我用作 Proguard 的配置文件位于 .../sdk/tools/proguard/proguard-android.txt

正如谷歌在这里所说:http: //developer.android.com/google/play/billing/billing_best_practices.html我在配置文件中添加了以下行:

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

我也在使用来自 Google 的更新后的 IAB 文件:https ://code.google.com/p/marketbilling/source/detail?r=7ec85a9b619fc5f85023bc8125e7e6b1ab4dd69f

问题是,有时,用户会使用此堆栈跟踪报告随机崩溃:

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)

它也发生在我的设备中(只是打开应用程序),但今天只发生在我身上一次。

而且我不确定是 Google 文件(IAB 的)问题还是 Proguard 配置文件中缺少某些内容。

4

6 回答 6

4

添加以下字符串

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

ProGuard 配置告诉他不要混淆那个包。

异常来自 com.xx.xxxx.util.IabHelper,因此您可以尝试添加类似

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

保持您的包裹在没有 ProGuard 的情况下保持原样。

于 2013-08-21T15:28:53.097 回答
2

IabHelpers startSetup() 中的这一行

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

有时可以返回 null,因此在检查列表是否为空时,您会得到空指针。

我只是在做任何其他事情之前对其进行了修改以检查 null ;

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 ...
于 2014-05-30T06:45:18.057 回答
2

您的 proguard 配置是正确的。我什至允许混淆com.android.vending.billing.IInAppBillingService我的应用程序中生成的内容,一切正常。

关于IabHelper上课。我不建议“按原样”使用它。首先,它被证明是错误的。其次,即使被混淆,它也可以被自动工具破解。我建议基于它编写自己的类IabHelper并为其编写junit测试。这也是我为我的项目所做的。

于 2013-08-22T05:51:29.247 回答
0

只需将其添加到您的 proguard 配置文件中以保留行号,然后您就不会得到未知来源:

-keepattributes 签名、源文件、行号

于 2014-11-12T20:05:56.537 回答
0

这对我有用

-keep class com.android.vending.** { *; }
于 2017-06-05T22:03:43.117 回答
0

请参阅在设备上验证购买 -> InApp 计费 ProGuard 规则的以下警告。

因为它只定义了一个 InApp 计费规则是

-keep class com.android.vending.billing.**
于 2019-01-22T11:53:19.547 回答