You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用启动崩溃:已存在的Composable类触发ClassNotFoundException

问题:Compose应用真机启动崩溃触发ClassNotFoundException(模拟器正常)

使用Kotlin 1.9.10结合Jetpack Compose开发的古兰经应用,可正常构建并安装到三星S908E真机,但启动后立即崩溃。

崩溃核心日志

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.warattil.quran.ui.components.AllSurahsScreen" on path: ...

类存在验证

该类确认真实存在,文件路径:

app/src/main/java/com/warattil/quran/ui/components/AllSurahsScreen.kt

类定义代码:

package com.warattil.quran.ui.components

@Composable
fun AllSurahsScreen(surahs: List<Surah>) {
    // UI Code here...
}

代码使用场景(MainActivity.kt)

import com.warattil.quran.ui.components.AllSurahsScreen

@Composable
fun MainNavigation(navController: NavHostController, surahs: List<Surah>) {
    NavHost(navController = navController, startDestination = "all_surahs") {
        composable("all_surahs") {
            AllSurahsScreen(surahs = surahs)
        }
    }
}

其他关键信息

  • 应用在模拟器上运行正常,仅真机崩溃
  • 未启用ProGuard/R8混淆
  • AndroidManifest.xml配置正确

已尝试的解决方法

  • 清理并重建项目
  • 清除缓存并重启Android Studio
  • 验证包名和类路径
  • 检查导入和文件名是否有拼写错误
  • 查看logcat寻找其他线索

疑问

为何已编译构建正常的类会触发ClassNotFoundException?是否与Compose导航或Gradle有关?


可能的原因及解决方案

1. 真机系统与Compose版本兼容性不匹配

三星S908E(Galaxy S22 Ultra)的系统版本多为Android 12/13/14,若你的Compose版本与Kotlin 1.9.10不匹配,可能在高版本真机上出现类加载异常。Kotlin 1.9.10对应的Compose Compiler版本应为1.5.3,需确保UI、Material等依赖版本与之适配。

  • 操作:检查build.gradle.kts中Compose相关依赖版本,调整至官方兼容性矩阵匹配的版本。

2. ABI过滤导致架构不兼容

若build.gradle中设置了ndk.abiFilters,而真机的CPU架构(三星S22 Ultra为arm64-v8a)不在过滤列表中,会导致部分类未被打包进APK。

  • 操作:在app/build.gradle.kts中添加或调整ABI过滤:
android {
    defaultConfig {
        ndk {
            abiFilters.add("arm64-v8a")
            abiFilters.add("armeabi-v7a")
        }
    }
}

3. Compose导航的惰性类加载问题

Compose导航的composable lambda内部的类引用可能在真机上触发延迟加载异常,导致类未被及时加载。

  • 操作:在MainNavigation函数顶部添加强制类加载的代码:
@Composable
fun MainNavigation(navController: NavHostController, surahs: List<Surah>) {
    // 强制提前加载类
    val _ = ::AllSurahsScreen
    NavHost(navController = navController, startDestination = "all_surahs") {
        composable("all_surahs") {
            AllSurahsScreen(surahs = surahs)
        }
    }
}

4. 真机应用缓存残留

即使清理了项目,真机上可能残留旧APK的缓存或数据,导致类加载冲突。

  • 操作:彻底卸载真机上的应用,清除应用存储的缓存和数据,再重新安装最新构建的APK。

5. Gradle增量构建缓存异常

增量构建可能导致部分类未被正确编译进APK,尤其是多模块项目。

  • 操作:执行全量构建命令,再安装到真机:
./gradlew clean assembleDebug # 或assembleRelease,根据你的构建类型

6. Kotlin字节码版本兼容性问题

Kotlin 1.9.10的默认字节码版本可能与真机ART虚拟机存在兼容性问题,可调整JVM目标版本。

  • 操作:在build.gradle.kts中设置:
android {
    kotlinOptions {
        jvmTarget = "1.8" // 或根据系统版本调整为11/17
    }
}

内容的提问来源于stack exchange,提问作者Nasser Abouzide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:27:42