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

Release构建中androidx.test.espresso.IdlingResource类找不到问题求助

解决Release构建下Espresso测试找不到IdlingResource的问题

问题核心

Release构建时测试抛出ClassNotFoundException: androidx.test.espresso.IdlingResource,但Debug构建或移除IdlingResource引用后正常。原因是:

  1. 主工程用implementation引入的espresso-idling-resource在Release构建中被ProGuard/R8移除(主代码未直接使用该类)
  2. 测试APK依赖主APK,导致运行时找不到已被移除的类

解决方案1:调整依赖+ProGuard保留规则

步骤1:修改主工程依赖配置

将主工程中espresso-idling-resource的依赖从implementation改为api,确保测试模块能继承该依赖:

dependencies {
    // 替换原来的implementation为api
    api 'androidx.test.espresso:espresso-idling-resource:3.4.0'
}

如果不想让Release包包含Espresso依赖,可改用变体依赖:

dependencies {
    debugImplementation 'androidx.test.espresso:espresso-idling-resource:3.4.0'
}

同时在src/release/java/[你的包名]/下创建空实现类,避免Release构建时编译错误:

package com.myco.myapp;

import androidx.test.espresso.IdlingResource;

public class EmptyIdlingResource implements IdlingResource {
    @Override
    public String getName() { return "EmptyIdlingResource"; }
    @Override
    public boolean isIdleNow() { return true; }
    @Override
    public void registerIdleTransitionCallback(ResourceCallback callback) {}
}

然后在MainActivity中根据构建变体返回对应实例:

public IdlingResource getIdlingResource() {
    if (BuildConfig.DEBUG) {
        return mRealIdlingResource; // 你的真实实现
    } else {
        return new EmptyIdlingResource();
    }
}

步骤2:配置ProGuard保留规则

在proguard-rules.pro中添加规则,防止IdlingResource相关类被移除:

# 保留Espresso核心IdlingResource类
-keep class androidx.test.espresso.IdlingResource { *; }
-keep interface androidx.test.espresso.IdlingResource.ResourceCallback { *; }
# 保留你自己的IdlingResource实现类
-keep class com.myco.myapp.YourIdlingResourceImpl { *; }

解决方案2:解耦主工程与Espresso依赖

通过自定义接口隔离主工程与Espresso库,彻底避免Release构建依赖测试库:

步骤1:主工程定义自定义Idling接口

package com.myco.myapp;

public interface AppIdlingResource {
    boolean isIdle();
    void registerIdleCallback(Runnable callback);
}

步骤2:分变体实现接口

  • Debug版实现(src/debug/java/com/myco/myapp/DebugAppIdlingResource.java):
public class DebugAppIdlingResource implements AppIdlingResource {
    private boolean isIdle = true;
    private Runnable callback;

    @Override
    public boolean isIdle() { return isIdle; }
    @Override
    public void registerIdleCallback(Runnable callback) { this.callback = callback; }

    // 供主代码调用,更新空闲状态
    public void setIdle(boolean idle) {
        this.isIdle = idle;
        if (idle && callback != null) callback.run();
    }
}
  • Release版实现(src/release/java/com/myco/myapp/ReleaseAppIdlingResource.java):
public class ReleaseAppIdlingResource implements AppIdlingResource {
    @Override
    public boolean isIdle() { return true; }
    @Override
    public void registerIdleCallback(Runnable callback) {}
}

步骤3:主工程提供自定义资源实例

public AppIdlingResource getIdlingResource() {
    return BuildConfig.DEBUG ? new DebugAppIdlingResource() : new ReleaseAppIdlingResource();
}

步骤4:测试工程适配为Espresso IdlingResource

在测试类中添加适配方法:

private IdlingResource convertToEspressoIdlingResource(AppIdlingResource appIdlingResource) {
    return new IdlingResource() {
        @Override
        public String getName() { return "AppIdlingResourceAdapter"; }
        @Override
        public boolean isIdleNow() { return appIdlingResource.isIdle(); }
        @Override
        public void registerIdleTransitionCallback(ResourceCallback callback) {
            appIdlingResource.registerIdleCallback(() -> {
                if (callback != null) callback.onTransitionToIdle();
            });
        }
    };
}

然后在测试的@Before方法中使用:

@Before
public void registerIdlingResource() {
    ActivityScenario activityScenario = ActivityScenario.launch(MainActivity.class);
    activityScenario.onActivity(activity -> {
        AppIdlingResource appIdlingResource = activity.getIdlingResource();
        mIdlingResource = convertToEspressoIdlingResource(appIdlingResource);
        IdlingRegistry.getInstance().register(mIdlingResource);
    });
}

验证

完成修改后,构建Release版本的主APK和测试APK,上传至Firebase Test Lab运行测试,确认ClassNotFoundException不再出现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:48:05