升级Compose最新版本后出现NoSuchMethodError崩溃,求排查原因
问题分析与解决办法
这个NoSuchMethodError本质是Compose依赖版本不兼容或者Appium与最新Compose版本适配冲突导致的,以下是具体排查和解决步骤:
核心原因
崩溃日志里的getCurrentSemanticsNodes()方法在新版Compose的AndroidComposeViewAccessibilityDelegateCompat类中签名发生了变更,但类路径中存在旧版本的类文件,或者Appium的辅助功能逻辑依赖了旧方法签名,导致调用时找不到对应方法。
排查与解决步骤
1. 确认应用自身的Compose依赖是否统一
- 检查项目中所有Compose相关依赖(如
compose-ui、compose-material、compose-ui-tooling等)是否使用完全一致的最新版本,避免混合不同版本的Compose库。 - 推荐使用Compose BOM来统一管理版本,确保所有Compose组件版本同步:
dependencies { // 引入Compose BOM implementation platform('androidx.compose:compose-bom:2024.06.00') // 其他Compose依赖无需指定版本 implementation 'androidx.compose.ui:ui' implementation 'androidx.compose.material3:material3' debugImplementation 'androidx.compose.ui:ui-tooling' } - 用Android Studio的Dependency Analyzer(路径:
File > Project Structure > Dependencies)检查是否有旧版本的compose-ui被第三方库间接引入,如有则强制统一版本:configurations.all { resolutionStrategy { force 'androidx.compose.ui:ui:1.6.7' // 替换为你使用的最新版本 } }
2. 验证是否由Appium导致
- 直接启动应用(不通过Appium),如果应用正常运行不崩溃,说明问题出在Appium与最新Compose的适配:
- 升级Appium到最新稳定版本,同时更新
uiautomator2驱动:执行appium driver update uiautomator2。 - 如果暂时无法升级Appium,可以考虑回退Compose到一个Appium兼容的稳定版本(比如1.5.x系列)。
- 升级Appium到最新稳定版本,同时更新
3. 清理缓存并重新构建
- 执行Gradle清理命令,清除旧的编译缓存和dex文件:
./gradlew clean ./gradlew assembleDebug - 同时清除Android Studio的缓存(路径:
File > Invalidate Caches... > Invalidate and Restart)。
崩溃日志
java.lang.NoSuchMethodError: No super method getCurrentSemanticsNodes()Ljava/util/Map; in class Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat; or its super classes (declaration of 'androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat' appears in /data/app/~~==/com.xxxx.xxxx-p-kmK94qiia5fKufOVHsFg==/base.apk!classes10.dex) at androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat.performActionHelper(Unknown Source:16) at androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat.access$performActionHelper(AndroidComposeViewAccessibilityDelegateCompat.android.kt:132) at androidx.compose.ui.platform.AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider.performAction(AndroidComposeViewAccessibilityDelegateCompat.android.kt:3266) at android.view.AccessibilityInteractionController.performAccessibilityActionUiThread(AccessibilityInteractionController.java:758) at android.view.AccessibilityInteractionController.access$600(AccessibilityInteractionController.java:74) at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:1550) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7842) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
内容的提问来源于stack exchange,提问作者TatiOverflow
相关产品推荐
相关产品推荐

