【问题标题】:Android In-app Billing and Proguard (Unknown Source)Android 应用内计费和 Proguard(未知来源)
【发布时间】:2013-08-21 13:21:39
【问题描述】:

我正在使用 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 配置文件中缺少某些内容。

【问题讨论】:

  • 我注意到该页面不再提及向 proguard 添加任何内容。无论如何,我一直保留这条线,尽管它现在给了我一个“未解决的类名”警告。我不再使用 iabhelper,因为现在直接实现更简单了,所以不值得。

标签: android proguard in-app-billing


【解决方案1】:

添加以下字符串

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

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

异常来自com.xx.xxxx.util.IabHelper,所以你可以尝试添加类似

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

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

【讨论】:

  • 我明白了...但是,安全性不是更差吗?虽然,IABHelper 是由 Google 提供的,所以可能没有必要滥用它。我想我会尝试它,但我无法调试它。
【解决方案2】:

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

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

【讨论】:

  • 我读到了这个,我想我会实现我自己的 IabHelper。顺便问一下,你知道互联网是否总是必要的吗?我的意思是,当用户购买商品时,是否总是需要检查该购买以通过 Internet 连接到 Google?因为,将此购买值保存在首选项或数据库中似乎不安全......
  • 值得迁移到 In-App Billing V3。 Goole Play 客户端会为您安全地缓存所有购买。您可以每次请求购买并立即得到响应。不再需要在本地存储购买的东西。不需要互联网连接。只有当用户自己执行购买时才需要它。
【解决方案3】:

IabHelpers startSetup() 中的这一行

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

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

我只是在做任何其他事情之前对其进行了修改以检查 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 ...

【讨论】:

    【解决方案4】:

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

    -keepattributes Signature,SourceFile,LineNumberTable

    【讨论】:

      【解决方案5】:

      这对我有用

      -keep class com.android.vending.** { *; }
      

      【讨论】:

        【解决方案6】:

        InApp 计费 ProGuard 规则请参考Verify a purchase on a device -> Below warning

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

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-14
        • 2013-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多