Search code examples
androidkotlinruntime-errorclassnotfoundexception

'java.lang.ClassNotFoundException' when Trying to Launch 'MainActivity' in Android App


I'm facing a puzzling issue while developing an Android application and would greatly appreciate your insights. Despite meticulously reviewing my code and configuration, I'm encountering a java.lang.ClassNotFoundException error when attempting to launch the MainActivity of my app.

Problem Details:

The package structure, import statements, and AndroidManifest.xml are all correctly set up. The error occurs during the instantiation of the activity component. The error stack trace suggests that the runtime is struggling to locate the class com.project.notetaker.feature_note.presentation.MainActivity. The build completes successfully without any apparent issues.

below is my AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.project.notetaker">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@drawable/baseline_edit_note_24"
        android:label="@string/app_name"
        android:roundIcon="@drawable/baseline_edit_note_24"
        android:supportsRtl="true"
        android:theme="@style/Theme.NoteTaker"
        tools:targetApi="31">
        <activity
            android:name="com.project.notetaker.feature_note.presentation.MainActivity"
            android:exported="true"
            android:theme="@style/Theme.NoteTaker"
            tools:ignore="ExtraText">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

here is my MainActivity.kt

package com.project.notetaker.feature_note.presentation

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.project.notetaker.feature_note.presentation.add_edit_note.AddEditNoteScreen
import com.project.notetaker.feature_note.presentation.notes.NotesScreen
import com.project.notetaker.feature_note.presentation.util.Screen
import com.project.notetaker.ui.theme.NoteTakerTheme
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            NoteTakerTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    color = MaterialTheme.colorScheme.background
                ){
                    val navController = rememberNavController()
                    NavHost(navController = navController,
                        startDestination = Screen.NotesScreen.route
                        ){
                        composable(route = Screen.NotesScreen.route){
                            NotesScreen(navController = navController)
                        }
                        composable(route = Screen.AddEditNoteScreen.route +
                                "?noteId={noteId}&noteColor={noteColor}",
                            arguments = listOf(
                                navArgument(
                                    name = "noteId"
                                ){
                                    type = NavType.IntType
                                    defaultValue = -1
                                },
                                navArgument(
                                    name = "noteColor"
                                ){
                                    type = NavType.IntType
                                    defaultValue = -1
                                },
                            )
                        ){
                            val color = it.arguments?.getInt("noteColor") ?: -1
                            AddEditNoteScreen(
                                navController = navController,
                                noteColor = color
                            )
                        }

                    }
                }
            }
        }
    }
}

Troubleshooting Steps Taken:

Cleared caches, restarted Android Studio, and invalidated caches/restarted. Double-checked package names, imports, and AndroidManifest.xml entries. Verified build configuration and Gradle settings. Ensured that the class file MainActivity.kt is located at the correct path: app/src/main/java/com/project/notetaker/feature_note/presentation/MainActivity.kt.

Here is the stacktrace

FATAL EXCEPTION: main
Process: com.project.notetaker, PID: 23881
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.project.notetaker/com.project.notetaker.feature_note.presentation.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.project.notetaker.feature_note.presentation.MainActivity" on path: DexPathList[[zip file "/data/app/~~L34MfAJ6YP_Hko4w8tyjlQ==/com.project.notetaker-J8AU4LB827YOnjsIQxkfHA==/base.apk"],nativeLibraryDirectories=[/data/app/~~L34MfAJ6YP_Hko4w8tyjlQ==/com.project.notetaker-J8AU4LB827YOnjsIQxkfHA==/lib/x86_64, /system/lib64, /system_ext/lib64]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3689)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8176)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.project.notetaker.feature_note.presentation.MainActivity" on path: DexPathList[[zip file "/data/app/~~L34MfAJ6YP_Hko4w8tyjlQ==/com.project.notetaker-J8AU4LB827YOnjsIQxkfHA==/base.apk"],nativeLibraryDirectories=[/data/app/~~L34MfAJ6YP_Hko4w8tyjlQ==/com.project.notetaker-J8AU4LB827YOnjsIQxkfHA==/lib/x86_64, /system/lib64, /system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
at android.app.Instrumentation.newActivity(Instrumentation.java:1378)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3676)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loopOnce(Looper.java:205) 
at android.os.Looper.loop(Looper.java:294) 
at android.app.ActivityThread.main(ActivityThread.java:8176) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) 
Suppressed: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/project/notetaker/feature_note/presentation/Hilt_MainActivity;
at java.lang.VMClassLoader.findLoadedClass(Native Method)
at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:738)
at java.lang.ClassLoader.loadClass(ClassLoader.java:363)
... 17 more

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.project.notetaker.feature_note.presentation.Hilt_MainActivity" on path: DexPathList[[zip file "/data/app/~~L34MfAJ6YP_Hko4w8tyjlQ==/com.project.notetaker-J8AU4LB827YOnjsIQxkfHA==/base.apk"],nativeLibraryDirectories=[/data/app/~~L34MfAJ6YP_Hko4w8tyjlQ==/com.project.notetaker-J8AU4LB827YOnjsIQxkfHA==/lib/x86_64, /system/lib64, /system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 20 more                                                                                                  

here is build.gradle

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'com.google.devtools.ksp'
    id 'dagger.hilt.android.plugin'
}

android {
    compileSdk 34

    defaultConfig {
        applicationId "com.project.notetaker"
        multiDexEnabled = true
        minSdk 21
        targetSdk 34
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary true
        }
    }
    configurations.all {
        resolutionStrategy {
            force "androidx.navigation:navigation-common:2.6.0"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
        //useIR = true
    }
    kotlin {
        jvmToolchain(8)
    }
    buildFeatures {
        compose true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.4"
    }
    packagingOptions {
        resources {
            excludes += '/META-INF/{AL2.0,LGPL2.1}'
        }
    }
    namespace 'com.project.notetaker'
}

dependencies {

    implementation 'androidx.core:core-ktx:1.10.1'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation "androidx.compose.material3:material3:1.1.1"
    //noinspection GradleDependency
    implementation "androidx.compose.ui:ui:$compose_version"
    //noinspection GradleDependency
    //implementation "androidx.compose.material:material:$compose_version"
    //noinspection GradleDependency
    implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
    implementation 'androidx.activity:activity-compose:1.7.2'
    implementation 'androidx.navigation:navigation-runtime-ktx:2.6.0'
    testImplementation 'junit:junit:'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
    //noinspection GradleDependency
    androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
    //noinspection GradleDependency
    debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"

    // Compose dependencies
    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1"
    implementation "androidx.navigation:navigation-compose:2.6.0"
    //noinspection GradleDependency
    implementation "androidx.compose.material:material-icons-extended:$compose_version"
    implementation "androidx.hilt:hilt-navigation-compose:1.1.0-alpha01"

    // Coroutines
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'

    //Dagger - Hilt
    implementation "com.google.dagger:hilt-android:2.45"
    ksp "com.google.dagger:hilt-android-compiler:2.37"
    implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
    ksp "androidx.hilt:hilt-compiler:1.0.0"

    // Room
    implementation "androidx.room:room-runtime:2.5.2"
    ksp "androidx.room:room-compiler:2.5.2"

    // Kotlin Extensions and Coroutines support for Room
    implementation "androidx.room:room-ktx:2.5.2"
    // Multi Dex Dependency
    implementation "androidx.multidex:multidex:2.0.1"
}

Solution

  • I see you are using Hilt.

    • Check if you have an Application class which is annotated with @HiltAndroidApp annotation
    • Add it to your manifest in Application tag inside name attribute.
    • Make sure you are using kapt as annotation processor of Hilt library not ksp or other annotation processors.
    plugins {
           id 'kotlin-kapt'
    }
    
    dependencies {
        implementation "com.google.dagger:hilt-android:2.45"
        kapt "com.google.dagger:hilt-compiler:2.45"
    }