Android Studio运行Kotlin默认应用启动即闪退,NoSuchMethodError如何解决
问题描述
在Android Studio中使用Kotlin开发Jetpack Compose应用时,即使运行IDE自动生成的默认模板应用,也会出现模拟器启动应用后立即闪退、弹出「应用已停止运行」提示的问题,logcat捕获的错误日志如下:
2021-06-06 19:22:42.598 7817-7817/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.myapplication, PID: 7817 java.lang.NoSuchMethodError: No static method drawRect-w2WG-Gw$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/ui/graphics/BlendMode;ILjava/lang/Object;)V in class Landroidx/compose/ui/graphics/drawscope/DrawScope$DefaultImpls; or its super classes (declaration of 'androidx.compose.ui.graphics.drawscope.DrawScope$DefaultImpls' appears in /data/app/~~1FERHlT2eRJdt1EprXEfMQ==/com.example.myapplication-m2_HPlQabeWTbDjc_hkOyA==/base.apk) at androidx.compose.foundation.Background.drawRect(Background.kt:111) at androidx.compose.foundation.Background.draw(Background.kt:103) at androidx.compose.ui.node.ModifiedDrawNode.performDraw(ModifiedDrawNode.kt:102) at androidx.compose.ui.node.LayoutNodeWrapper$invoke$1.invoke(LayoutNodeWrapper.kt:260) at androidx.compose.ui.node.LayoutNodeWrapper$invoke$1.invoke(LayoutNodeWrapper.kt:259) at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121) at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:75) at androidx.compose.ui.node.LayoutNodeWrapper.invoke(LayoutNodeWrapper.kt:259) at androidx.compose.ui.node.LayoutNodeWrapper.invoke(LayoutNodeWrapper.kt:53) at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.android.kt:156) at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.android.kt:229) at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.android.kt:210) at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.kt:244) at androidx.compose.ui.node.ModifiedLayoutNode.performDraw(ModifiedLayoutNode.kt:82) at androidx.compose.ui.node.LayoutNodeWrapper$invoke$1.invoke(LayoutNodeWrapper.kt:260) at androidx.compose.ui.node.LayoutNodeWrapper$invoke$1.invoke(LayoutNodeWrapper.kt:259) at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:1788) at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:116) at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:75) at androidx.compose.ui.node.LayoutNodeWrapper.invoke(LayoutNodeWrapper.kt:259) at androidx.compose.ui.node.LayoutNodeWrapper.invoke(LayoutNodeWrapper.kt:53) at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.android.kt:156) at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.android.kt:229) at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.android.kt:210) at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.kt:244) at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:800) at androidx.compose.ui.node.InnerPlaceable.performDraw(InnerPlaceable.kt:116) at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.kt:249) at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.kt:67) at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.kt:249) at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.kt:67) at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.kt:249) at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.kt:67) at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.kt:249) at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.kt:67) at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.kt:249) at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.kt:800) at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:656) at android.view.View.draw(View.java:22353) 2021-06-06 19:22:42.599 7817-7817/com.example.myapplication E/AndroidRuntime: at android.view.View.updateDisplayListIfDirty(View.java:21226) at android.view.View.draw(View.java:22081) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at android.view.View.updateDisplayListIfDirty(View.java:21217) at android.view.View.draw(View.java:22081) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at android.view.View.updateDisplayListIfDirty(View.java:21217) at android.view.View.draw(View.java:22081) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at android.view.View.updateDisplayListIfDirty(View.java:21217) at android.view.View.draw(View.java:22081) at android.view.ViewGroup.drawChild(ViewGroup.java:4516) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4277) at android.view.View.draw(View.java:22353) at com.android.internal.policy.DecorView.draw(DecorView.java:806) at android.view.View.updateDisplayListIfDirty(View.java:21226) at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:559) at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:565) at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:642) at android.view.ViewRootImpl.draw(ViewRootImpl.java:4101) at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3828) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3099) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972) at android.view.Choreographer.doCallbacks(Choreographer.java:796) at android.view.Choreographer.doFrame(Choreographer.java:731) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
根因说明
该异常是Jetpack Compose各依赖包版本不兼容导致的二进制匹配错误,不同版本的Compose基础库API存在差异,混用测试版、正式版或者跨大版本的依赖就会触发方法找不到的运行时异常。
可行解决方案
- 统一所有Compose相关依赖的版本号:在项目根目录的build.gradle文件中定义全局
compose_version变量,所有模块的Compose相关依赖(包括ui、foundation、runtime、material等)全部引用该变量,禁止出现不同Compose库指定不同版本号的情况,推荐使用1.0.0及以上的正式稳定版,不要混用beta、RC、正式版的依赖。 - 匹配Kotlin版本与Compose版本:不同的Compose版本对Kotlin编译版本有明确要求,比如Compose 1.0.x对应Kotlin 1.5.x,Compose 1.1.x对应Kotlin 1.6.x,Compose 1.2.x对应Kotlin 1.7.x,需保证两者版本对应,避免编译阶段生成不兼容的字节码。
- 清理本地构建缓存:依次执行Android Studio菜单栏的「Build」->「Clean Project」->「Rebuild Project」,也可手动删除项目根目录下的.gradle、build文件夹,以及app模块下的build文件夹后重新构建,排除旧缓存产物导致的依赖冲突。
- 升级Android Studio到最新稳定版:Arctic Fox以下版本的Android Studio生成的Compose默认模板本身就存在依赖配置不匹配的问题,升级到最新稳定版IDE后重新创建模板项目,即可规避原生配置错误。
内容的提问来源于stack exchange,提问作者Nunofernandes.official
相关产品推荐
相关产品推荐

