ClassNotFoundException 但我可以在 classes.dex 中找到这个类

Lee*_*fin 5 android jackson maven dex android-instrumentation

我有两个项目:

  • 一个是我的android库项目(com.my.lib),
  • 一个是测试项目,用于测试库项目(com.my.lib.test)。

在测试项目中,有一个测试类,用于测试导入和使用org.codehaus.jackson.JsonFactory类的库项目中的相应类。

在测试项目中,我在 maven build 中添加了依赖项:

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.13</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

测试项目的AndroidManifest.xml是这样的:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.my.lib.test"
          android:versionCode="1"
          android:versionName="1.2" >
  <instrumentation
      android:name="android.test.InstrumentationTestRunner"
      android:targetPackage="com.my.lib" />

  <uses-sdk
      android:minSdkVersion="14"
      android:targetSdkVersion="21" />

  <application>
    <uses-library android:name="android.test.runner" />
  </application>

</manifest>
Run Code Online (Sandbox Code Playgroud)

当我运行仪器测试时,我的测试被执行,但在执行该特定测试类时,我总是收到以下运行时错误:

java.lang.ClassNotFoundException: Didn't find class "org.codehaus.jackson.JsonFactory" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.my.lib.test-2/base.apk", zip file "/data/app/com.my.lib-1/base.apk"],nativeLibraryDirectories=[/data/app/com.my.lib.test-2/lib/arm, /data/app/com.my.lib-1/lib/arm, /vendor/lib, /system/lib]]
07-06 18:06:08.041 24082 24998 E AndroidRuntime:    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
07-06 18:06:08.041 24082 24998 E AndroidRuntime:    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
Run Code Online (Sandbox Code Playgroud)

所以,上面的日志抱怨它在这些路径上找不到 org.codehaus.jackson.JsonFactory类。

但是,当我解压缩我的测试项目的 APK 文件 ( MyLibTest.apk),并使用 Android SDK 提供的dexdump工具检查classes.dex的内容时, 我看到了 org/codehaus/jackson/JsonFactory

这是命令和输出:

dexdump classes.dex | grep 'org.codehaus.jackson.JsonFactory'

      type          : 'Lorg/codehaus/jackson/JsonFactory;'
      type          : 'Lorg/codehaus/jackson/JsonFactory;'
Run Code Online (Sandbox Code Playgroud)

为什么我ClassNotFoundException可以在测试项目的 APK 文件的classes.dex中找到这个类?

=== 更新 ===

由于错误日志显示它试图从路径“/data/app/com.my.lib.test-2/base.apk”中查找

因此,我还尝试下载该 base.apk,并通过以下方式检查其中的内容:

  1. 用adb工具下载

    adb pull /data/app/com.my.lib.test-2/base.apk

  2. 解压 base.api & 我从中得到 classes.dex

  3. 通过运行命令检查classes.dex的内容dexdump classes.dex,输出为:

在此处输入图片说明

这是否意味着codehaus/jackson/JsonFactory仅访问但不包括在内?