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

Compose UI测试遇两类问题:耗时久+InitializationProvider类找不到异常

Compose UI测试问题排查与解决方案

问题描述

我正在运行一个简单的Compose UI测试,SignUp页面包含WebView,测试中校验其contentDescription,测试代码如下:

class SignUpTest {

@get:Rule
val signUpTestRule = createComposeRule()

@Test
fun verify_signUpWebView_isDisplayed() {
    signUpTestRule.setContent {
        TestTheme {
            SignUpScreen(
                signUpUiState = SignUpUiState(),
                signUpWebViewMessageListener = {

                }
            )
        }
    }

    with(signUpTestRule) {
        onNodeWithContentDescription("Sign up page").assertIsDisplayed()
    }
}

目前遇到两个问题:

  • 从Launcher Activity启动测试耗时约40秒;
  • 测试执行成功,但结束时抛出异常,日志如下:
Process: com.test.app, PID: 15790

java.lang.RuntimeException: Unable to get provider androidx.startup.InitializationProvider: java.lang.ClassNotFoundException: Didn't find class "androidx.startup.InitializationProvider" on path: DexPathList[[zip file "/data/app/~~ULkUjY-6LlUkmHkSUOjLCg==/com.test.app-9T9LoZkXgy-RnWTqEAtj_A==/base.apk"],nativeLibraryDirectories=[/data/app/~~ULkUjY-6LlUkmHkSUOjLCg==/com.test.app-9T9LoZkXgy-RnWTqEAtj_A==/lib/arm64, /system/lib64, /system_ext/lib64]]

    at android.app.ActivityThread.installProvider(ActivityThread.java:8463)


    at android.app.ActivityThread.installContentProviders(ActivityThread.java:7963)


    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7649)


    at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)


    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2478)


    at android.os.Handler.dispatchMessage(Handler.java:106)


    at android.os.Looper.loopOnce(Looper.java:230)


    at android.os.Looper.loop(Looper.java:319)


    at android.app.ActivityThread.main(ActivityThread.java:8893)


    at java.lang.reflect.Method.invoke(Native Method)


    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:608)


    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)


Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.startup.InitializationProvider" on path: DexPathList[[zip file "/data/app/~~ULkUjY-6LlUkmHkSUOjLCg==/com.test.app-9T9LoZkXgy-RnWTqEAtj_A==/base.apk"],nativeLibraryDirectories=[/data/app/~~ULkUjY-6LlUkmHkSUOjLCg==/com.test.app-9T9LoZkXgy-RnWTqEAtj_A==/lib/arm64, /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.instantiateProvider(AppComponentFactory.java:147)


    at android.app.ActivityThread.installProvider(ActivityThread.java:8447)


    ... 11 more




BUILD SUCCESSFUL in 1m 41s

我已在proguard-rules文件中添加如下规则,但无效:

# Keep the InitializationProvider class to prevent it from being stripped out.
-keep class androidx.startup.InitializationProvider { *; }
# Keep the names of classes that extend Initializer to ensure they are not obfuscated,
# which is necessary because these classes are looked up by name during app startup.
-keepnames class * extends androidx.startup.Initializer

# Keep the public no-argument constructors of Initializer implementations.
-keepclassmembers class * extends androidx.startup.Initializer {
    public <init>();
}

同时尝试引入了androidx-startup-startup-runtime依赖,问题仍未解决,求原因及解决方案。


解决方案

1. 解决InitializationProvider找不到的异常

  • 修正依赖引入范围:确保androidx.startup:startup-runtime依赖添加到androidTestImplementation,因为测试环境独立于主App环境,需要单独引入:
    androidTestImplementation "androidx.startup:startup-runtime:1.1.1" // 使用最新稳定版本
    
  • 移除不必要的Provider声明:如果你的App没有用到App Startup的自动初始化功能,直接在AndroidManifest.xml中移除该Provider,避免测试时触发加载:
    <provider
        android:name="androidx.startup.InitializationProvider"
        android:authorities="${applicationId}.androidx-startup"
        tools:node="remove" />
    
  • 检查多Dex配置:如果开启了多Dex,确保测试构建包含androidx.startup相关类。在测试构建类型中启用多Dex,并引入测试用多Dex依赖:
    android {
        buildTypes {
            debug {
                multiDexEnabled true
            }
        }
    }
    
    androidTestImplementation "androidx.multidex:multidex-testing:2.0.1"
    

2. 缩短测试启动耗时

  • 使用空测试Activity:默认的createComposeRule会启动App的Launcher Activity,换成指定空Activity可以大幅减少启动时间:
    首先创建一个空Activity:
    class EmptyTestActivity : ComponentActivity()
    
    然后在AndroidManifest.xml的debug节点中声明:
    <activity android:name=".EmptyTestActivity" />
    
    最后修改测试规则:
    @get:Rule
    val signUpTestRule = createAndroidComposeRule<EmptyTestActivity>()
    
  • 优化测试实例生命周期:添加@TestInstance(TestInstance.Lifecycle.PER_CLASS)注解,让测试类只实例化一次,减少重复初始化开销。

内容的提问来源于stack exchange,提问作者Edhar Khimich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:57:35