【问题标题】:ClassNotFoundException: Didn't find class on path: DexPathListClassNotFoundException:在路径上找不到类:DexPathList
【发布时间】:2015-07-01 05:50:07
【问题描述】:

我在 Playstore 上更新了我的应用后遇到了问题。自本次更新以来,引发了异常,但我没有更改与此异常相关的任何内容。

堆栈跟踪:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{de.opiatefuchs.onthejobtimerlight/de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity}: java.lang.ClassNotFoundException: Didn't find class "de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity" on path: DexPathList[[zip file "/data/app/de.opiatefuchs.onthejobtimerlight-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassNotFoundException: Didn't find class "de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity" on path: DexPathList[[zip file "/data/app/de.opiatefuchs.onthejobtimerlight-1/base.apk"],nativeLibraryDirectories=[/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 android.app.Instrumentation.newActivity(Instrumentation.java:1066)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226)
... 10 more
Suppressed: java.lang.ClassNotFoundException: de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity
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)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

问题是,我之前的应用程序版本运行没有问题,我没有更改与此活动相关的任何内容。我刚刚添加了一个与此活动无关的新信息对话框。这个应用程序是免费的精简版,我在专业版上做了完全相同的更改,没有任何东西被抛出。这按预期工作。 专业版和精简版之间的唯一区别是,我在精简版中集成了 Admob(以新方式),在专业版中集成了 Google Play 许可证。但是我从一开始就已经整合了这一点,并且没有对此进行任何更改。 我也没有对清单进行任何更改,我在这里阅读了很多帖子,但没有任何帮助。

它似乎只发生在 5.0 之后的 Android 版本上。有没有人知道这个问题可能导致什么或有任何人有同样的经历? proguard 是否有可能只是通过混淆(同样在这里,没有变化)破坏了任何东西?

我没有发布代码,因为它对这个问题并不重要,就像我说我没有对这个异常进行任何更改。

此问题被标记为重复,但事实并非如此。带有链接的评论不能解决我的问题,所有库都经过检查并以正确的方式集成。另外,我不使用 NDK。

【问题讨论】:

  • 这不是重复的,正如我所描述的,因为所谓的重复问题与我的不成比例。
  • 反对者!如果这个问题值得被否决并被关闭,请给我一个理由?
  • @TheLittleNaruto...有时我想知道这里是否有一些人只是为了好玩而投反对票。我看到很多次投票的问题,没有解释评论,也没有理由......
  • 他们只能是没有经验的用户。
  • @Opiatefuchs 你能解决这个问题吗?因为我得到了类似的错误。但是当我尝试从备份中导入以前版本的程序时发生了这种情况。

标签: android admob proguard classnotfoundexception


【解决方案1】:

更新

看了半天,原来肯定和proguard有关系。我不能真正说出错误的确切原因,但我尝试了一点,这就是我注意到的(在我使用 Eclipse IDE 的情况下):

  • 我必须关闭我要签名的项目中的每个选项卡
  • 我必须清理项目,清理后,除了导出 apk 什么都不做
  • 在清单中进行小幅更改,保存并撤消更改(并保存)
  • 如果清单中有任何名为“YourClass”或“.YourClass”的类,请将其更改为“com.yourpackage.yourClass”

这就是我所做的四点,然后它奏效了。这看起来很可疑,但我认为混淆存在问题。因为不做这些点,我可以简单地编译我的apk并从eclipse安装它。对我来说,这种行为没有明显的原因。 如果我只从 Eclipse 安装它,包名称也可以在不改变的情况下工作。 我希望这些观点可以帮助某人。

【讨论】:

  • 我遇到了同样的问题,基于我得出了同样的结论:proguard。特别是因为我的非签名调试版本工作得很好。有趣的副作用:搞砸的签名构建导致同一个应用程序的两个图标!仍在努力寻找解决方案。我正在使用 Android Studio
  • 您的意思是在您设备的应用抽屉中安装了两个应用吗?
  • 只安装了一个应用程序 - 但您可以在应用程序启动器中看到两个应用程序图标。正如我最初假设的那样(或至少不完全),问题与 proguard 无关 - 重复的图标和丢失的类是由以特定风格覆盖 AndroidManifest.xml 并具有两个启动器活动 xD 引起的。我仍然对 proguard 有问题,但我想这只是现在找到正确的配置。谢谢你回复我:)!
  • 这对我有用,我只需要将完整的类名添加到我的自定义应用程序类中。此错误仅在将项目移动到我的本地硬盘驱动器后发生。
  • @Peter....这很有趣。好吧,我的项目并非如此,但无论如何都很好知道。
【解决方案2】:

如果你的清单包名没问题, 如果你关闭了项目, 并在文件资源管理器中重命名您的项目 但是在导入一个之后你又遇到了这个问题 这里唯一的方法是

删除该文件夹 .gradle

这个可以使用文件资源管理器在项目文件夹中找到。 它具有包含该旧项目名称的工件文件。 在 Android Studio 中重新打开项目后,文件夹将自动重新创建。

【讨论】:

  • 哇。这是一个非常具体的问题,你有一个答案!非常感谢!
【解决方案3】:

我刚把我的gradle从com.android.tools.build:gradle:2.2.2改成了com.android.tools.build:gradle:2.2.0,问题就解决了!

【讨论】:

  • 你太棒了!
【解决方案4】:

对我来说,它发生在包名称(目录名称)更改时。

我意识到“构建”文件夹神奇地维护了项目构建的中间文件。 我删除了“app”文件夹下的“build”文件夹。现在 gradle 必须用新的包名重新制作所有文件。现在它可以正常工作了。

【讨论】:

    【解决方案5】:

    tl;dr: 这似乎是由AndroidManifest.xml 中的相对声明和绝对声明混合引起的。我认为最好的解决方案是在您的AndroidManifest.xml 中声明<application .../><activity .../><receiver .../><service .../> 时使用相对符号。

    完整解释:

    我遇到这个问题太久了,这是因为我在 AndroidManifest.xml 中同时使用了绝对和相对 <application .../><activity .../><receiver .../><service .../> 声明。这是我为修复它所做的:

    在您的AndroidManifest.xml 中确保<manifest .../> 部分的package: 属性指定正确,它需要是确切的绝对路径,如下所示:

    <manifest
        package="com.my.absolute.package.path"
        xmlns:android="http://schemas.android.com/apk/res/android">...</manifest>
    

    现在您已经在 &lt;manifest .../&gt; 部分中指定了正确的绝对路径,您需要为定义在你的AndroidManifest.xml

    示例:

    <application
        android:name=".BaseApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
    
        <activity
            android:name=".activity.SomeActivity"
            android:configChanges="orientation"
            android:label="@string/app_name"
            android:parentActivityName=".activity.ParentActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".activity.ParentActivity"/>
        </activity>
    
        <activity
            android:name=".activity.MyActivity"
            android:configChanges="orientation"
            android:label="@string/app_name"
            android:parentActivityName=".activity.ParentActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme"
            />
    
        <receiver
            android:name=".receivers.MyReceiver"
            android:enabled="true"
            android:exported="false">
        </receiver>
    
        <service
            android:name=".services.MyService"
            android:enabled="true"
            android:exported="false"
            />
    </application>
    

    当然,也一定要清理你的项目。

    【讨论】:

      【解决方案6】:

      如果您有多个模块,我认为这与 multidex 和多个包名称有关。清理项目并删除所有 build/ 文件夹。

      【讨论】:

        【解决方案7】:

        有时当我们生成签名的apk文件时,如果我们有一些依赖库问题(重复的jar库),那么就会发生这个错误。请检查构建路径并删除重复库,并检查是否有任何库未从订单和导出选项卡中检查。

        【讨论】:

        • 你所说的~"检查构建路径"是什么意思?如何检查?
        【解决方案8】:

        原因是,android无法在dexpath中找到具体的activity。

        所以我们应该在“Manifest 文件”中提供活动的完整路径。

        例如,您的活动名称是“SplashActivity”,它位于“com.packagename.package”中。所以我们应该提供该活动的完整包名。

        com.packagename.package.SplashActivity
        

        【讨论】:

          【解决方案9】:

          我遇到了类似的问题,这是我的解决方案:

          1. 将 AndroidManifest 中的应用名称更改为完整路径
          2. 清理项目
          3. 重建项目
          4. 构建 APK

          【讨论】:

            【解决方案10】:

            我加了

            compile "com.android.support:support-core-utils:25.3.1"
            compile 'com.android.support:support-v4:25.3.1'
            

            【讨论】:

              【解决方案11】:

              通过简单地重命名目录名称并导入来更改我的目录名称后,我得到了类似的错误。不能再安装了。重新启用 USB 调试和重建项目都不起作用。

              我通过创建新项目并手动将所有相关内容复制到新项目来解决它。

              【讨论】:

              • 这可能是一项漫长的任务。尝试删除 app/build 文件夹。它对我有用。
              猜你喜欢
              • 2017-10-21
              • 2018-11-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-05-28
              • 1970-01-01
              • 2016-02-04
              • 2017-09-12
              相关资源
              最近更新 更多