Android 为什么使用标准BillingService时会发生NullPointerException?

Android 为什么使用标准BillingService时会发生NullPointerException?,android,binding,service,Android,Binding,Service,我在我的应用程序中使用标准的BillingService(即从中复制而不做任何更改)。 但有时我的应用程序会因logcat中的以下数据而崩溃: 04-16 10:05:43.556: INFO/ActivityManager(96): Start proc tv.kinobaza.app for service tv.kinobaza.app/tv.kinobaza.billing.BillingService: pid=28748 uid=10081 gids={3003} 04-16 10:

我在我的应用程序中使用标准的
BillingService
(即从中复制而不做任何更改)。 但有时我的应用程序会因logcat中的以下数据而崩溃:

04-16 10:05:43.556: INFO/ActivityManager(96): Start proc tv.kinobaza.app for service tv.kinobaza.app/tv.kinobaza.billing.BillingService: pid=28748 uid=10081 gids={3003}
04-16 10:05:43.646: DEBUG/AndroidRuntime(28748): Shutting down VM
04-16 10:05:43.656: WARN/dalvikvm(28748): threadid=1: thread exiting with uncaught exception (group=0x400259f8)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): FATAL EXCEPTION: main
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): java.lang.RuntimeException: Unable to start service tv.kinobaza.billing.BillingService@4632f578 with null: java.lang.NullPointerException
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3282)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.ActivityThread.access$3600(ActivityThread.java:135)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2211)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.os.Looper.loop(Looper.java:144)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.ActivityThread.main(ActivityThread.java:4937)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at java.lang.reflect.Method.invokeNative(Native Method)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at java.lang.reflect.Method.invoke(Method.java:521)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at dalvik.system.NativeStart.main(Native Method)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748): Caused by: java.lang.NullPointerException
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at tv.kinobaza.billing.BillingService.onStart(Unknown Source)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.Service.onStartCommand(Service.java:420)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3267)
04-16 10:05:43.656: ERROR/AndroidRuntime(28748):     ... 10 more
04-16 10:05:43.736: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0xb947a8), pid=96, w=1, h=1
04-16 10:05:43.736: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0xb947a8), pid=96, w=1, h=1
04-16 10:05:43.766: DEBUG/SurfaceFlinger(96): Layer::requestBuffer(this=0xb947a8), index=0, pid=96, w=480, h=418 success
04-16 10:05:43.986: DEBUG/dalvikvm(28721): GC_FOR_MALLOC freed 9604 objects / 1369120 bytes in 102ms
以下是相关代码:

/**
 * We don't support binding to this service, only starting the service.
 */
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onStart(Intent intent, int startId) {
    handleCommand(intent, startId);
}
这里怎么了

我注意到——当设备在夜间睡眠时,一旦我开始使用它,它会在5分钟内崩溃

还有更多细节:
BillingService
从我的应用程序的首选项屏幕开始。下面是
首选项
类中的代码:

@Override
protected void onDestroy() {
mBillingService.unbind();
    super.onDestroy();
}
Upd。也许,我应该在主活动中启动此服务/解除绑定

这是我的proguard.cfg:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep class com.android.vending.billing.**

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-libraryjars /lib/libGoogleAnalytics.jar
-libraryjars /lib/signpost-commonshttp4-1.2.1.1.jar
-libraryjars /lib/signpost-core-1.2.1.1.jar
-dontwarn org.apache.commons.codec.binary.Base64
-优化过程5
-dontusemixedcaseclassnames
-DontskipnonPublicLibraryClass
-不要翻转
-冗长的
-优化!代码/简化/算术,!字段/*,!类/合并/*
-keep public class*扩展android.app.Activity
-keep public class*扩展android.app.Application
-keep public class*扩展了android.app.Service
-keep public class*扩展了android.content.BroadcastReceiver
-keep public class*扩展了android.content.ContentProvider
-keep public class*扩展了android.app.backup.BackupAgentHelper
-keep public class*扩展了android.preference.preference
-保持公共类com.android.vending.licensing.ILicensingService
-保留com.android.vending.billing类**
-KeepClassSwithMemberNames类*{
本地人;
}
-KeepClassSwithMemberNames类*{
public(android.content.Context、android.util.AttributeSet);
}
-KeepClassSwithMemberNames类*{
public(android.content.Context,android.util.AttributeSet,int);
}
-keepclassmembers枚举*{
公共静态**[]值();
公共静态**valueOf(java.lang.String);
}
-keep class*实现android.os.Parcelable{
公开静态最终android.os.Parcelable$Creator*;
}
-libraryjars/lib/libGoogleAnalytics.jar
-libraryjars/lib/signpost-commonshttp4-1.2.1.1.jar
-libraryjars/lib/signpost-core-1.2.1.1.jar
-dontwarn org.apache.commons.codec.binary.Base64

所以你在前进后得到这个NPE,而不是在前进前

您必须混淆一些您不喜欢的扩展应用程序/活动/服务的类

您不应混淆这些类:


(转到示例7)

只是指出了显而易见的问题,但如果proguard是问题所在,那么我们就不会在堆栈跟踪中看到他的计费服务名称。(我们将看到一个模糊的名称,而不是tv.kinobaza.billing.BillingService.onStart)


试试这个

从另一个角度看本教程:我假设你的软件包是tv.kinobaza?我不理解stacktrace给出了一个未知的行错误,原因是:java.lang.NullPointerException 04-16 10:05:43.656:error/AndroidRuntime(28748):在tv.kinobaza.billing.BillingService.onStart(未知源),您是否对应用程序进行了升级?是的,这是主程序包。tv.kinobaza.billing-BillingService所在的包。是的,应用程序已经升级了。所以你在升级后得到这个NPE,而不是在升级前?您一定是混淆了一些您不喜欢的扩展应用程序/活动/服务的类。我是在从Eclipse导出项目后得到它的。所以,在proguard之后。我应该将BillingService包括在proguard排除列表中吗?看起来这已经在我的proguard.cfg中处理过了-发布了。我已将proguard.cfg重命名为proguard.cfg.bak-希望它允许跳过模糊处理。现在测试它。好的,看起来它现在工作得很好@布伦德尔,你能帮我理解我需要在proguard.cfg(问题中发布)中更正的内容吗?谢谢。我真的帮不上忙,因为我必须查看整个项目,如果您在proguard.cfg中添加“-keepattributes SourceFile,LineNumberTable”,这也将允许您查看混淆后发生错误的位置