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

时间:2016-07-08 14:39:24

标签: android maven jackson 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>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.13</version>
</dependency>

测试项目的 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>

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

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)

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

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

这是命令和输出:

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

      type          : 'Lorg/codehaus/jackson/JsonFactory;'
      type          : 'Lorg/codehaus/jackson/JsonFactory;'

为什么我得到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&amp;我从中获得了classes.dex

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

    是否只能访问codehaus/jackson/JsonFactory但不包括在内?

0 个答案:

没有答案