【问题标题】:Android 5.x ClassNotFoundException works fine on 6.0+Android 5.x ClassNotFoundException 在 6.0+ 上运行良好
【发布时间】:2017-09-25 18:12:55
【问题描述】:

我已将项目的 minSdkVersion 从 19 更新到 21。这导致我无法运行应用程序的 5.0/5.1 设备出现问题。我在我的 Application 类上不断收到 ClassNotFoundException。完整的日志、应用程序类和 gradle 文件如下。如果我将我的项目恢复到 minSdkVersion 19,那么应用程序将在 4.4+ 上运行而没有问题。

我的尝试

  • 清理/重建

  • 更新和降级构建工具版本

  • 跨项目的所有支持库都具有相同的版本号

  • 将我的所有清单类设为相对然后绝对

  • 更新了所有 SDK 和构建工具

日志

04-27 14:37:07.152 6278-6278/? E/AndroidRuntime: FATAL EXCEPTION: main
     Process: com.package.testapp, PID: 6278
     java.lang.RuntimeException: Unable to instantiate application com.package.TestApplication: java.lang.ClassNotFoundException: Didn't find class "com.package.Application" on path: DexPathList[[zip file "/data/app/com.package.testapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.package.testapp-1/lib/x86_64, /vendor/lib64, /system/lib64]]
         at android.app.LoadedApk.makeApplication(LoadedApk.java:563)
         at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4526)
         at android.app.ActivityThread.access$1500(ActivityThread.java:151)
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
         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 "com.package.TestApplication" on path: DexPathList[[zip file "/data/app/com.package.testapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.package.testapp-1/lib/x86_64, /vendor/lib64, /system/lib64]]
         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.newApplication(Instrumentation.java:980)
         at android.app.LoadedApk.makeApplication(LoadedApk.java:558)
         at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4526) 
         at android.app.ActivityThread.access$1500(ActivityThread.java:151) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364) 
         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) 
        Suppressed: java.lang.ClassNotFoundException: com.package.testapp.welcome.TestClaimApplication
         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

Gradle

    buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
    }

    apply plugin: 'com.android.application'
    apply plugin: 'io.fabric'

    repositories {
    maven { url 'https://maven.fabric.io/public' }
    }

android {

    compileSdkVersion 25
    buildToolsVersion '25.0.3'

    defaultConfig {
        applicationId "com.package.testapp"
        minSdkVersion 21
        multiDexEnabled = true
        targetSdkVersion 25
        versionCode 2
        versionName "0.7"
        renderscriptTargetApi 18 // support mode not supported 21+
        renderscriptSupportModeEnabled true
        testInstrumentationRunner 
    "android.support.test.runner.AndroidJUnitRunner"
    }
    dexOptions {
        javaMaxHeapSize "4g"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }

    productFlavors {
        companylocal
        companymaven
    }
}

dependencies {


    def ext = rootProject.ext;

    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile "com.android.support:appcompat-v7:${ext.supportLibraryVersion}"
    compile "com.android.support:design:${ext.supportLibraryVersion}"
    compile 'com.romandanylyk:pageindicatorview:0.0.9'
    compile "com.jakewharton:butterknife:${ext.butterknifeLibraryVersion}"
    annotationProcessor "com.jakewharton:butterknife-compiler:${ext.butterknifeLibraryVersion}"
    compile "uk.co.chrisjenx:calligraphy:2.2.0"
    compile 'com.android.support:multidex:1.0.1'
    // Crashlytics Kit - for crash handling
    compile('com.crashlytics.sdk.android:crashlytics:2.5.2@aar') {
        transitive = true
    }
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    testCompile 'junit:junit:4.12'
    testCompile 'org.robolectric:robolectric:3.0'
    testCompile "com.squareup.okhttp3:mockwebserver:${ext.okHttp3LibraryVersion}"
    testCompile('com.squareup.assertj:assertj-android:1.1.1') {
        exclude module: 'support-annotations'
    }
}

应用程序

public class TestApplication extends Application {

    Engine engine;

    @Override
    public void onCreate() {
        super.onCreate();

        String privateServerUrlLocal = getString(R.string.server_url);
        ProfileLauncher profileLauncher = getProfileLauncher();
        LoginLauncher loginLauncher = getLoginLauncher();

        // Set up Crash Analytics
        final CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder().disabled(DEBUG).build();
        Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());

        Intent intent = new Intent(this, LogoutService.class);
        startService(intent);

        CertificatePinner certificatePinner = new CertificatePinner.Builder()
                .add("")
                .add("")
                .build();

        engine = new Engine.Builder(privateServerUrlLocal, getString(R.string.other_server_url))
                .setCertificatePinner(certificatePinner)
                .setSDKPartnerSetupManager(getSdkPartnerManager())
                .setLogoutActionHandler(getLogoutActionHandler())
                .setVLocationManager(new VLocationManagerImp())
                .setDebug(DEBUG)
                .addDeepLinkHandler(new ClaimDeepLinkHandler(loginLauncher, profileLauncher))
                .addDeepLinkHandler(new LinkGiftCodeDeeplinkHandler(loginLauncher, profileLauncher))
                .addDeepLinkHandler(new OpenLinkDeepLinkHandler())
                .addDeepLinkHandler(new DetailsDeepLinkHandler())
                .addClaimConfig(new ClaimConfig(false, false, false, false, true))
                .build();
        engine.startup(this);
    }



    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }

}

清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.package.testapp">

<uses-feature
    android:name="android.hardware.camera"
    android:required="true" />
<uses-feature
    android:name="android.hardware.camera.autofocus"
    android:required="false" />
<uses-feature
    android:name="android.hardware.camera.flash"
    android:required="false" />

<!-- Required for g+ login -->
<uses-permission android:name="android.permission.CAMERA" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:name=".TestApplication"
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <service
            android:name="com.package.companycommon.ui.LogoutService"
            android:stopWithTask="true" />

        <activity
            android:name=".LaunchActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".welcome.WelcomeActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
        <activity
            android:name=".RegisterActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar.ClearStatus"
            android:windowSoftInputMode="adjustResize" />
        <activity
            android:name=".LoginActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar.ClearStatus"
            android:windowSoftInputMode="adjustResize" />
        <activity
            android:name=".ActivationActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar.ClearStatus"
            android:windowSoftInputMode="adjustResize" />
        <activity
            android:name=".AddPhoneNumberActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar.ClearStatus"
            android:windowSoftInputMode="adjustResize" />
        <activity
            android:name=".ForgotPasswordActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar.ClearStatus"
            android:windowSoftInputMode="adjustResize" />
        <activity
            android:name=".GiftHistoryActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
        <activity
            android:name="com.package.PartnerLoginHiddenActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
        <activity
            android:name=".tutorial.TutorialActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
        <activity
            android:name=".CreateNewPasswordActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
        <activity
            android:name=".settings.SettingsActivity"
            android:screenOrientation="portrait">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".GiftHistoryActivity" />
        </activity>
        <activity
            android:name=".settings.ExtraSettingsActivity"
            android:label="@string/settings"
            android:screenOrientation="portrait">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".settings.SettingsActivity" />
        </activity>
        <activity
            android:name="companyapp.company.NewsActivity"
            android:label="@string/notifications"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme" />
        <activity
            android:name=".termsandconditions.CompanyTermsAndConditionsActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme" />

        <activity
            android:name="com.package.companycommon.ui.PhotoViewerActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme" />

        <activity
            android:name="com.package.company.details.CompanyDetailActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme" />
        <activity
            android:name="com.package.company.details.CompanyDetailActivityLocation"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.package.company.details.CompanyDetailActivity" />
        </activity>
        <activity
            android:name="com.package.company.ClaimActivity"
            android:theme="@style/AppTheme.NoActionBar"
            tools:replace="android:theme" />
    </application>

</manifest>

【问题讨论】:

  • 你能分享你的AndroidManifest.xml吗?
  • 添加了清单
  • 我都试过了,包括不同的android studio、不同的手机和不同的电脑
  • 你找到解决办法了吗?
  • 我也有同样的问题。如果您找到了解决方案,请在此处发布。

标签: java android gradle android-5.0-lollipop android-5.1.1-lollipop


【解决方案1】:

当面向 api 21 时,编译器将读取的 dex 文件限制为 100 个。因此,我发现一个简单的解决方案是将其添加到 gradle 文件中的 dexOptions 中。这会将您的所有 dex 文件合并到尽可能低的数量。

在您的 build.gradle 文件中添加以下内容

android {
    ...
    dexOptions {
        preDexLibraries = false
    }
}

【讨论】:

【解决方案2】:

请尝试禁用 Instant Run 选项,然后运行应用程序。在尝试了很多解决方案后它对我有用,我终于解决了这个问题。

【讨论】:

  • 这也对我有用。我被派去追逐多 dex 保留文件。
  • 这对我不起作用。它确实将缺少的类更改为不同的类,但在启动时仍然失败。
【解决方案3】:

尝试删除compile 'com.android.support:multidex:1.0.1'。谷歌文档 says

因此,如果您的 minSdkVersion 为 21 或更高,则不需要 multidex 支持库。

我不确定这是否有帮助,但可能值得一试。

【讨论】:

    【解决方案4】:

    这意味着您的 multiDex 无法正常工作,因此丢失了一些文件。我认为 android 5.0 有不同的方式来使用 multiDex。您是否覆盖了您的应用程序类中的某些内容?

    【讨论】:

    • 我覆盖的唯一方法是 onCreate 和 attachBaseContext。你可以在上面的代码中看到我对它们的实现
    • 我认为您需要删除 attachBaseContext()。它用于android 4.0。在 5.0 中你不需要它。你可以尝试删除它吗?
    • 尝试清理并重建并告诉我们。
    • 我删除了 attachBaseContext() 然后清理、重建和卸载,同样的事情发生了。
    【解决方案5】:

    由于某种原因,这个类不再在你的主 dex 中了。

    Declare the class in the main-classes list,使用multiDexKeepFile(列出gradle 中的类)或multiDexKeepProguard(指向主类的特定proguard 文件)。

    【讨论】:

      【解决方案6】:

      尝试启用 Progaud 并禁用 multidex。

      您不仅可以解决这个问题,而且您的 apk 更小,安装和运行速度更快。

      请注意,如果您需要这方面的帮助,请发表评论,我们可以解决。

      • 好的,所以它不是 Progaurd 或 MultiDex

      错误是缺少 com.package.Application。您发布的任何代码(或清单)都不包含对该类的引用。你在哪里定义 com.package.Application?如果您不在项目中的哪个位置被引用? (我会在项目范围内搜索“com.package.Application”来解开这个问题。)

      【讨论】:

      • 是的,我禁用了 multidex 并启用了 proguard。仍然遇到同样的错误
      • 更新了答案。请看一下
      • 对不起,我只是在问题中更改了应用程序的名称,忘记在日志中更改它。应用程序的名称与清单和类一样是 TestApplication
      • 注意:在日志中可以看到缺少的类是com.package.testapp.welcome.TestClaimApplication
      【解决方案7】:

      尝试在清单中给出完整路径-

        <application
              android:name=".TestApplication"
      

      还要手动删除构建文件夹-有时清理不起作用。还要手动卸载应用程序并启动。

      【讨论】:

      • 我尝试在清单中使用所有相对和绝对路径。还尝试了 Application 类的相对/绝对路径。还尝试删除构建文件夹。自从出现这个问题后,我总是卸载该应用程序。
      【解决方案8】:

      我从你的代码和配置中制作了demo,它在棉花糖下面工作

      下载并检查它并与您的代码进行比较。还有一件事是您如何使用包名称 com.package.testapp 创建项目。我无法创建具有相同包名的项目

      【讨论】:

        【解决方案9】:

        创建 multidex-config.txt 以将这些类保留在主 DEX 文件中:

        com/package/Application.class
        com/package/TestApplication.class
        com/package/testapp/welcome/TestClaimApplication.class
        

        multiDexKeepFile 添加到 build.gradle 的 android.buildTypes.release 部分,如下所示:

        android {
            buildTypes {
                release {
                    multiDexKeepFile file 'multidex-config.txt'
                }
            }
        }
        

        【讨论】:

          【解决方案10】:

          您需要启用多索引吗?我一直遇到它的问题。如果您仍然达到 65k 方法限制,我一直认为 multidex 被用作最后的手段。如果您没有遇到此方法限制,则不需要 multidex。如果您遇到此限制,我建议您先使用 progaurd 来解决问题。如果在使用 proguard 后仍然超出方法限制,请使用 multidex。

          【讨论】:

          • 我确实需要启用多索引
          【解决方案11】:

          你需要添加你的 android:name 和这样的完整路径。

          android:name="android.support.multidex.MultiDexApplication" 
          

          您的 TestApplication 应该扩展 MultiDexApplication。

          根据文档,如果需要更多详细信息,请参阅。 MultiDex Documentation

          【讨论】:

          猜你喜欢
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 2021-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多