仅在多模块项目中出现的 Jetpack Compose 性能问题

Yan*_*ick 7 android android-jetpack-compose

我在 Jetpack Compose 中开发了一个非常复杂的键盘布局。最初,布局工作正常,按下按键时动画运行非常流畅。不幸的是,由于事件的一些重新组合后,动画和一切变得非常缓慢和滞后。我曾尝试对 Java 方法调用进行采样,但我只能看到某些函数比平时花费的时间要长得多。

编辑: 我已经能够隔离问题。我发现性能问题只出现在多模块项目中。当我在根模块中放入完全相同的撰写代码时,app问题就消失了。

我创建了一个重现该问题的项目:

如果你想在多模块项目中重现这个问题,你必须多次在类别之间切换,然后一切都会变得非常滞后

示例视频

注意:我知道 Jetpack Compose 仍处于 alpha 阶段,这个问题可能是 Jetpack Compose 中的一个错误。但我想确保这不是我的代码错误或 Compose 的一般限制

Har*_* D. 5

解决方案是使用remember可组合性来Keyboard @Composable防止重组期间的布局计算。

val refs: List<List<Pair<Key, ConstrainedLayoutReference>>> =
         remember {
             keyboard.map { row ->
                row.map {
                   it to createRef()
               }
          }
}

val modifier = remember { ... }

val modifierPressed = remember { ... }        
Run Code Online (Sandbox Code Playgroud)

源代码: https://github.com/dautovicharis/example_compose-keyboard-multimodule/commits/main


Rya*_*ley 2

一般来说,作为 Jetpack Compose 应用程序,它没有什么特别之处。您可以使用Android Studio 中的CPU 分析器并记录跟踪,以更具体地了解应用程序中发生的情况。如果不查看代码,很难知道是什么导致某些函数比平常花费更长的时间,但实际上可能是它们被重复调用(采样方法无法区分)。

您还可以在函数中放置打印语句或断点@Composable。确保这些函数不会在您不期望的情况下被调用(重构)。如果是,您需要调查是什么原因导致他们再次接到电话。