【问题标题】:New Relic Class Not Found ... I don't even use new relic未找到新的遗物类...我什至不使用新的遗物
【发布时间】:2014-08-05 06:42:25
【问题描述】:

我什至不使用新的遗物,而且我遇到了错误。它只是突然发生的。

我使用的是最新的 Android Studio 版本 (0.61)。甚至我的主分支也有同样的错误。我的机器上还有其他项目使用新的遗物,但不是这个。这个项目不以任何方式使用 new relic,与其说是一个任性的 gradle 依赖。

我已尝试清除我的 gradle 缓存并重新下载所有第三方库,但没有成功。

堆栈跟踪:

06-15 01:05:54.872  20117-20117/com.waxwings.happyhour.staging D/HappyHourApplication﹕ CREATE TABLE job_holder (_id integer  primary key autoincrement , `priority` integer, `group_id` text, `run_count` integer, `base_job` byte, `created_ns` long, `delay_until_ns` long, `running_session_id` long, `requires_network` integer );
    06-15 01:05:54.874  20117-20117/com.waxwings.happyhour.staging D/AndroidRuntime﹕ Shutting down VM
    06-15 01:05:54.877  20117-20117/com.waxwings.happyhour.staging E/AndroidRuntime﹕ FATAL EXCEPTION: main
        Process: com.waxwings.happyhour.staging, PID: 20117
        java.lang.NoClassDefFoundError: Failed resolution of: Lcom/newrelic/agent/android/instrumentation/SQLiteInstrumentation;
                at com.path.android.jobqueue.persistentQueue.sqlite.DbOpenHelper.onCreate(DbOpenHelper.java:42)
                at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
                at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
                at com.path.android.jobqueue.persistentQueue.sqlite.SqliteJobQueue.<init>(SqliteJobQueue.java:42)
                at com.path.android.jobqueue.JobManager$DefaultQueueFactory.createPersistentQueue(JobManager.java:594)
                at com.path.android.jobqueue.JobManager.<init>(JobManager.java:77)
                at com.waxwings.happyhour.HappyHourApplication.configureJobManager(HappyHourApplication.java:84)
                at com.waxwings.happyhour.HappyHourApplication.onCreate(HappyHourApplication.java:38)
                at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1030)
                at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4425)
                at android.app.ActivityThread.access$1500(ActivityThread.java:139)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1270)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:136)
                at android.app.ActivityThread.main(ActivityThread.java:5102)
                at java.lang.reflect.Method.invoke(Native Method)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
         Caused by: java.lang.ClassNotFoundException: Didn't find class "com.newrelic.agent.android.instrumentation.SQLiteInstrumentation" on path: DexPathList[[zip file "/data/app/com.waxwings.happyhour.staging-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.waxwings.happyhour.staging-1, /vendor/lib, /system/lib]]
                at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
                at com.path.android.jobqueue.persistentQueue.sqlite.DbOpenHelper.onCreate(DbOpenHelper.java:42)
                at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
                at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
                at com.path.android.jobqueue.persistentQueue.sqlite.SqliteJobQueue.<init>(SqliteJobQueue.java:42)
                at com.path.android.jobqueue.JobManager$DefaultQueueFactory.createPersistentQueue(JobManager.java:594)
                at com.path.android.jobqueue.JobManager.<init>(JobManager.java:77)
                at com.waxwings.happyhour.HappyHourApplication.configureJobManager(HappyHourApplication.java:84)
                at com.waxwings.happyhour.HappyHourApplication.onCreate(HappyHourApplication.java:38)
                at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1030)
                at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4425)
                at android.app.ActivityThread.access$1500(ActivityThread.java:139)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1270)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:136)
                at android.app.ActivityThread.main(ActivityThread.java:5102)
                at java.lang.reflect.Method.invoke(Native Method)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        Suppressed: java.lang.ClassNotFoundException: com.newrelic.agent.android.instrumentation.SQLiteInstrumentation
                at java.lang.Class.classForName(Native Method)
                at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
                at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
                ... 19 more
         Caused by: java.lang.NoClassDefFoundError: Class "Lcom/newrelic/agent/android/instrumentation/SQLiteInstrumentation;" not found
                ... 23 more

模块的build.gradle:

apply plugin: 'android'
apply plugin: 'newrelic'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"

    }

    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }

    }

    useOldManifestMerger true

    productFlavors {

        staging {
            applicationId "com.waxwings.happyhour.staging"
        }

        production {
            applicationId "com.waxwings.happyhour"
        }
    }

    packagingOptions {
        exclude 'LICENSE.txt'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }


}

dependencies {
    compile 'com.path:android-priority-jobqueue:1.1.2'
    compile "com.android.support:support-v4:19.1.0"
    compile 'com.google.android.gms:play-services:4.4.52'

//    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('libs/wearable-preview-support.jar')
    compile group: 'com.squareup.okhttp', name: 'okhttp', version: '1.5.3'
    compile group: 'com.squareup.picasso', name: 'picasso', version: '2.2.0'
    compile 'com.jakewharton:butterknife:5.0.1'
    compile 'com.squareup.retrofit:retrofit:1.5.1'
    compile 'com.squareup:otto:+'
    compile 'com.squareup.phrase:phrase:+'
    compile 'com.newrelic.agent.android:android-agent:3.402.0'

    // Mockito dependencies
    androidTestCompile "org.mockito:mockito-core:1.9.5"
    androidTestCompile files(
            'libs/dexmaker-1.0.jar',
            'libs/dexmaker-mockito-1.0.jar')

    androidTestCompile ('com.squareup:fest-android:1.0.8'){
        exclude group:'com.android.support', module: 'support-v4'
    }
    androidTestCompile 'com.squareup.spoon:spoon-client:1.1.1'

    androidTestCompile('junit:junit:4.11') {
        exclude module: 'hamcrest-core'
    }

    androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3') {
        exclude group: 'org.hamcrest:hamcrest-core:1.1'
        exclude group: 'org.hamcrest:hamcrest-library:1.1'
        exclude group: 'org.hamcrest', module: 'hamcrest-integration'
        exclude group:'com.android.support', module: 'support-v4'

    }

    androidTestCompile ('com.jakewharton.espresso:espresso-support-v4:1.1-r3'){
        exclude group:'com.android.support', module: 'support-v4'
    }

}

项目的build.gradle:

buildscript {
    repositories {
        mavenCentral()
        maven {
            url 'https://oss.sonatype.org/content/repositories/comnewrelic-1153'
        }
        maven {
            url 'https://oss.sonatype.org/content/repositories/comnewrelic-1154'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.11.+'
        classpath 'com.newrelic.agent.android:agent-gradle-plugin:3.402.0'

    }
}

allprojects {
    repositories {
        mavenCentral()
        maven {
            url 'https://oss.sonatype.org/content/repositories/comnewrelic-1153'
        }
    }
}

编辑

项目现在根据用户的建议在 build.gradle 中导入 New Relic。这解决了问题,但我仍在探索原因,因为它似乎没有必要。 抛出错误的类在 Path 的 JobQueue 库中,该库已经 4 个月没有更新,我的应用程序一直运行良好,这只是突然发生的。在 3rd 方库中出错的类甚至不使用 New Relic。

编辑 2

优先作业队列lib 不使用新的遗物。我不知道为什么堆栈跟踪说它确实如此,似乎是一条红鲱鱼。我听说 New Relic SDK 修改了 Android API 并给出了奇怪的错误。但同样,我不会在我的项目中使用新的遗物。是否有可能在另一个项目中使用 NR sdk 以某种方式感染了这个(可能是 Android Studio 中的错误)?

编辑 3

好的,原始堆栈跟踪中的 Priority Job Queue lib 绝对是一个错误标志。在 JobQueue 有机会访问它之前,我继续访问了我自己的 Provider(知道这将强制在 JobQueue 库之前创建我自己的数据库)。我的逻辑是,如果 Android Sqlite 被 New Relic 感染,那么它会在我自己的 OpenHelper 上导致类似的错误,确实如此。

06-15 15:29:39.848    1368-1368/com.waxwings.happyhour.staging W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4d81b20)
06-15 15:29:39.848    1368-1368/com.waxwings.happyhour.staging E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.waxwings.happyhour.staging, PID: 1368
    java.lang.NoClassDefFoundError: com.newrelic.agent.android.instrumentation.SQLiteInstrumentation
            at com.waxwings.happyhour.services.HHOpenHelper.onCreate(HHOpenHelper.java:56)
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
            at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
            at com.waxwings.happyhour.services.HappyHourProvider.query(HappyHourProvider.java:121)
            at android.content.ContentProvider.query(ContentProvider.java:857)
            at android.content.ContentProvider$Transport.query(ContentProvider.java:200)
            at android.content.ContentResolver.query(ContentResolver.java:461)
            at android.content.ContentResolver.query(ContentResolver.java:404)
            at com.waxwings.happyhour.HappyHourApplication.onCreate(HappyHourApplication.java:39)
            at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
            at android.app.ActivityThread.access$1500(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

编辑 4

我刚刚在一台从未在任何项目中安装过 New Relic 库的机器上运行该项目,它运行良好。我认为这是一个强有力的证据,证明 New Relic 正在使用他们的插件/库做一些有趣的事情。

编辑 5

我更新了我的 gradle-wraper.properties 文件以使用 rc-1 发行版,这似乎已经解决了这个问题。我从我的 build.gradle 中删除了一位评论者建议的新的 relic 依赖项,该应用程序仍然运行良好。

distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-rc-1-all.zip

我的猜测是 New Relic 库被缓存在 1.12-all gradle 发行版中,这是导致其他项目出错的常见链接。我仍然不确定是什么让 New Relic 库与众不同,以至于 gradle 认为它应该将它包含在其他项目中。鉴于不久前 New Relic 与他们的 Eclipse 插件有一个几乎相同的问题,我认为假设他们的 Maven 发行版发生了一些事情是合理的。我已经向他们开放了支持票,我将继续调查并报告。

奇怪的是,如果我删除 ~/.gradle 目录中的所有 gradle 发行版/缓存/等,并尝试使用 1.12-all 发行版,它仍然会引发新的遗物错误。唯一可行的方法是我使用 1.12-rc-1-all gradle 发行版。

【问题讨论】:

  • 天哪,当 SO 添加 Shift+Tab 以将您的代码格式化为可读时,我会再次停下来。
  • 看com.path.android.jobqueue.persistentQueue.sqlite.DbOpenHelper,这个类使用的是newRelic
  • @Wakim ,这是一个第三方库,JobQueue by Path。我通过 maven 依赖项固定了版本,自从它工作以来没有任何改变。但是,我确实查看了class,并没有发现任何异常。
  • 第 3 方库仍然可以使用第 4 方库。找到并下载newrelic,看看它是否可以编译。
  • @GabeSechan 做到了,但我仍然不知道为什么?第三方库不应该编译它们需要运行的所有依赖项,尤其是像 new relic 这样的崩溃报告库吗?另外,不明白为什么我的应用程序运行了好几个月,今天就退出了?导致它的第 3 方应用程序在 4 个月内未更新。虽然这确实修复了它,但感觉不对,就像是创可贴,而不是真正的修复。

标签: android newrelic


【解决方案1】:

Android Studio 似乎已切换到 gradle daemon 以加快构建速度。不幸的是,这会缓存 New Relic 代理的一部分,当您切换到没有代理的项目(或其他版本)时,必须停止守护进程。您只需运行以下命令即可完成此操作:

gradle --stop

您还需要清理您的项目以确保类被重建和索引。

虽然这应该能让您立即启动并运行,但我们会立即修复此问题,您可以期待它在下一个版本的代理中。

【讨论】:

  • 嗨@asm,我也遇到了这个问题(stackoverflow.com/questions/24933298/…),已经有修复了吗?谢谢。
  • newrelic 污染了守护进程,因此需要以艰难的方式阻止它。我一直在与开发人员交谈并让他们意识到这一点,他们说他们正在努力修复。但截至目前,问题仍然存在。
  • @asm 真的很糟糕,2.5 年过去了,没有修复。为什么我应该擦除我所有的 Gradle 缓存 bcs 的新遗物。
  • 哇,据我所知,我们很久以前就解决了这个问题。您是否尝试过更新到最新的代理(在使用它的项目中)。
  • 2017 仍在发生
【解决方案2】:

我尝试了gradle --stop,但没有成功。

删除.gradle目录,再次同步项目,成功了。

【讨论】:

  • 对我来说也一样。考虑到这个问题是从 2.5 年前开始的,而且他们打算“马上解决这个问题”,然后......
【解决方案3】:

我在 kitkat 中遇到了 NoClassDefFoundError 的奇怪问题。但它在棒棒糖上运行良好。

我尝试了上述所有修复方法,但没有奏效。

最后我知道这是因为 multidex 错误。我越过了 65k 方法。 所以,我从 android 开发者网站关注了这个tutorial。并像魅力一样工作

【讨论】:

  • 这在理论上可以回答这个问题,但最好将答案的基本部分包含在此处以供将来的用户使用,并提供链接以供参考。 Link-dominated answers 可以通过link rot 失效。
【解决方案4】:
./gradlew --stop
./gradlew cleanBuildCache
./gradlew clean

为我工作

【讨论】:

  • 应该是公认的答案。大多数人将通过项目中的包装器使用 Gradle。这也为我解决了这个问题。如果接受的答案对您不起作用,请尝试此操作。
  • 一直在努力解决这个问题(从项目中删除 newrelic),它在 Multidex + Proguard 构建上运行良好,但开发人员构建(API 21+)继续爆炸。删除 .gradle/cache,使缓存失效并重新启动,没有任何效果 - 上面的魔法咒语成功了。
  • 花了 3 个小时谷歌搜索并试图弄清楚这一点。这为我解决了这个问题!谢谢!
  • 这行得通。将我的 gradle_home 更新为 gradle-3.3 并将我的 java_home 更新为 java-1.8 并且可以工作。 (gradlew也是3.3)
猜你喜欢
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 2011-01-08
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多