Java Android ClassNotFoundException位于另一个包中的源文件上

Java Android ClassNotFoundException位于另一个包中的源文件上,java,android,xml,eclipse,Java,Android,Xml,Eclipse,通过尝试访问单独包中的类,我成功地获得了由ClassNotFoundException引起的NoClassDefFoundError 我已经编写了代码,通过按下按钮调用堆栈跟踪下面的函数来重现这个问题 没有任何意义的是,即使我在项目中有源文件,它也找不到类 堆栈跟踪: 07-13 15:58:40.317: E/X(2517): x- java.lang.NoClassDefFoundError: Failed resolution of: Lobd/ObdGatewayService; 07-

通过尝试访问单独包中的类,我成功地获得了由
ClassNotFoundException
引起的
NoClassDefFoundError

我已经编写了代码,通过按下按钮调用堆栈跟踪下面的函数来重现这个问题

没有任何意义的是,即使我在项目中有源文件,它也找不到类

堆栈跟踪:

07-13 15:58:40.317: E/X(2517): x- java.lang.NoClassDefFoundError: Failed resolution of: Lobd/ObdGatewayService;
07-13 15:58:40.317: E/XX(2517): xx- 
07-13 15:58:40.317: E/XX(2517): java.lang.NoClassDefFoundError: Failed resolution of: Lobd/ObdGatewayService;
07-13 15:58:40.317: E/XX(2517):     at piccolo.android.PANDA18.OBDTaximeter.doBindService(OBDTaximeter.java:856)
07-13 15:58:40.317: E/XX(2517):     at piccolo.android.PANDA18.OBDTaximeter.startLiveData(OBDTaximeter.java:823)
07-13 15:58:40.317: E/XX(2517):     at piccolo.android.PANDA18.OBDTaximeter.access$8(OBDTaximeter.java:818)
07-13 15:58:40.317: E/XX(2517):     at piccolo.android.PANDA18.OBDTaximeter$3.onClick(OBDTaximeter.java:313)
07-13 15:58:40.317: E/XX(2517):     at android.view.View.performClick(View.java:5217)
07-13 15:58:40.317: E/XX(2517):     at android.view.View$PerformClick.run(View.java:20983)
07-13 15:58:40.317: E/XX(2517):     at android.os.Handler.handleCallback(Handler.java:739)
07-13 15:58:40.317: E/XX(2517):     at android.os.Handler.dispatchMessage(Handler.java:95)
07-13 15:58:40.317: E/XX(2517):     at android.os.Looper.loop(Looper.java:145)
07-13 15:58:40.317: E/XX(2517):     at android.app.ActivityThread.main(ActivityThread.java:6117)
07-13 15:58:40.317: E/XX(2517):     at java.lang.reflect.Method.invoke(Native Method)
07-13 15:58:40.317: E/XX(2517):     at java.lang.reflect.Method.invoke(Method.java:372)
07-13 15:58:40.317: E/XX(2517):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
07-13 15:58:40.317: E/XX(2517):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
07-13 15:58:40.317: E/XX(2517): Caused by: java.lang.ClassNotFoundException: Didn't find class "obd.ObdGatewayService" on path: DexPathList[[zip file "/system/framework/com.google.android.maps.jar", zip file "/data/app/piccolo.android.PANDA18-2/base.apk"],nativeLibraryDirectories=[/data/app/piccolo.android.PANDA18-2/lib/arm, /vendor/lib, /system/lib]]
07-13 15:58:40.317: E/XX(2517):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
07-13 15:58:40.317: E/XX(2517):     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
07-13 15:58:40.317: E/XX(2517):     at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
07-13 15:58:40.317: E/XX(2517):     ... 14 more
07-13 15:58:40.317: E/XX(2517):     Suppressed: java.lang.NoClassDefFoundError: obd.ObdGatewayService
07-13 15:58:40.317: E/XX(2517):         at dalvik.system.DexFile.defineClassNative(Native Method)
07-13 15:58:40.317: E/XX(2517):         at dalvik.system.DexFile.defineClass(DexFile.java:226)
07-13 15:58:40.317: E/XX(2517):         at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
07-13 15:58:40.317: E/XX(2517):         at dalvik.system.DexPathList.findClass(DexPathList.java:321)
07-13 15:58:40.317: E/XX(2517):         at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
07-13 15:58:40.317: E/XX(2517):         ... 16 more
07-13 15:58:40.317: E/XX(2517):     Suppressed: java.lang.ClassNotFoundException: obd.ObdGatewayService
07-13 15:58:40.317: E/XX(2517):         at java.lang.Class.classForName(Native Method)
07-13 15:58:40.317: E/XX(2517):         at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
07-13 15:58:40.317: E/XX(2517):         at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
07-13 15:58:40.317: E/XX(2517):         at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
07-13 15:58:40.317: E/XX(2517):         ... 15 more
07-13 15:58:40.317: E/XX(2517):     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
请注意,上面的stacktrace仅在我第一次按下按钮时生成。随后的按钮按下会产生一个较短、稍有不同的版本(见下文)

导致错误的代码部分:

// this is from the OBDTaximeter class, and is called whenever I press a specific button. I have a try/catch where I'm calling it to log the error above
private void doBindService() {
    if (!isServiceBound) {
        Log.d(TAG, "Binding OBD service..");
        if (preRequisites) {
            Intent serviceIntent = new Intent(this, ObdGatewayService.class); // Specifically, this line
            bindService(serviceIntent, serviceConn, Context.BIND_AUTO_CREATE);
        } else {
            Intent serviceIntent = new Intent(this, MockObdGatewayService.class);
            bindService(serviceIntent, serviceConn, Context.BIND_AUTO_CREATE);
        }
    }
}
解决方案资源管理器的屏幕截图:

黄色突出显示的部分显示该文件确实位于同一项目中,但位于不同的包中,其中红线表示调用试图使用缺少的类的代码的位置

我考虑过这可能是我的清单声明有问题,但我找不到任何错误-我可能错了,所以我将包含一个压缩版本,其中包含以下相关位

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="piccolo.android.PANDA18"
      android:versionCode="1"
      android:versionName="1.0">
        <activity android:name="OBDTaximeter" />

        <activity android:name="obd.ConfigActivity" />

        <service android:enabled="true" android:name="obd.MockObdGatewayService" />
        <service android:enabled="true" android:name="obd.ObdGatewayService" />
    </application>  
</manifest>

为什么会发生这种情况?

像这样开始:

Intent intent = new Intent();
intent.setClassName("obd", "obd.ObdGatewayService");
startService(intent);

您使用的是Multidex还是自定义ProGuard规则?两者都不使用@Bladecoder你能解释一下你的代码和我的启动意图的代码之间的区别吗?我很惊讶这样就避免了这个问题,因为我的所有其他活动都开始使用代码中详述的格式。虽然这是一个解决异常的方法,但它并不能解决当前的问题。
Class #239            -
  Class descriptor  : 'Lobd/ObdGatewayService$1;'
  Access flags      : 0x0000 ()
  Superclass        : 'Ljava/lang/Object;'
  Interfaces        -
    #0              : 'Ljava/lang/Runnable;'
  Static fields     -
  Instance fields   -
    #0              : (in Lobd/ObdGatewayService$1;)
      name          : 'this$0'
      type          : 'Lobd/ObdGatewayService;'
      access        : 0x1010 (FINAL SYNTHETIC)
    #1              : (in Lobd/ObdGatewayService$1;)
      name          : 'val$job2'
      type          : 'Lobd/ObdCommandJob;'
      access        : 0x1012 (PRIVATE FINAL SYNTHETIC)
  Direct methods    -
    #0              : (in Lobd/ObdGatewayService$1;)
      name          : '<init>'
      type          : '(Lobd/ObdGatewayService;Lobd/ObdCommandJob;)V'
      access        : 0x10000 (CONSTRUCTOR)
      code          -
      registers     : 3
      ins           : 3
      outs          : 1
      insns size    : 8 16-bit code units
      catches       : (none)
      positions     : 
        0x0000 line=1
        0x0004 line=240
      locals        : 
        0x0000 - 0x0008 reg=0 this Lobd/ObdGatewayService$1; 
  Virtual methods   -
    #0              : (in Lobd/ObdGatewayService$1;)
      name          : 'run'
      type          : '()V'
      access        : 0x0001 (PUBLIC)
      code          -
      registers     : 3
      ins           : 1
      outs          : 2
      insns size    : 12 16-bit code units
      catches       : (none)
      positions     : 
        0x0000 line=243
        0x000b line=244
      locals        : 
        0x0000 - 0x000c reg=2 this Lobd/ObdGatewayService$1; 
  source_file_idx   : 4574 (ObdGatewayService.java)
Intent intent = new Intent();
intent.setClassName("obd", "obd.ObdGatewayService");
startService(intent);