带有浓缩咖啡和Proguard的Java.lang.NoClassDefFoundError
我对浓缩咖啡不是很有经验,但我最终成功地经营了它 我有一个应用程序,需要由Proguard收缩,以便在56K的方法 应用程序以3秒的动画开始,所以我需要等到动画结束后才能继续。这就是我尝试使用方法带有浓缩咖啡和Proguard的Java.lang.NoClassDefFoundError,java,android,junit,android-testing,android-espresso,Java,Android,Junit,Android Testing,Android Espresso,我对浓缩咖啡不是很有经验,但我最终成功地经营了它 我有一个应用程序,需要由Proguard收缩,以便在56K的方法 应用程序以3秒的动画开始,所以我需要等到动画结束后才能继续。这就是我尝试使用方法waitFor(长延迟) 我试图将此方法作为一个独立类、内部类甚至项目类来使用=相同的错误 这是Proguard文件: android { ... compileSdkVersion ANDROID_BUILD_SDK_VERSION buildToolsVersion ANDR
waitFor(长延迟)
我试图将此方法作为一个独立类、内部类甚至项目类来使用=相同的错误
这是Proguard文件:
android {
...
compileSdkVersion ANDROID_BUILD_SDK_VERSION
buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
productFlavors {
// Define separate dev and prod product flavors.
dev {
// dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
// to pre-dex each module and produce an APK that can be tested on
// Android Lollipop without time consuming dex merging processes.
minSdkVersion 21
}
prod {
// The actual minSdkVersion for the application.
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
}
}
defaultConfig {
applicationId "fr.xs.app.y"
targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
versionCode ANDROID_BUILD_VERSION_CODE
versionName ANDROID_BUILD_APP_VERSION_NAME
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// point sur le build de test
testBuildType = "validation"
buildTypes {
release {
debuggable false
ext.enableCrashlytics = true
renderscriptOptimLevel 3
signingConfig android.signingConfigs.release
zipAlignEnabled true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-release.pro'
}
debug {
debuggable true
renderscriptOptimLevel 3
applicationIdSuffix ".debug"
versionNameSuffix "debug"
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
}
validation.initWith(debug)
validation {
debuggable false
renderscriptOptimLevel 3
applicationIdSuffix ".validation"
versionNameSuffix "validation"
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
testProguardFile('proguard-rules-test.pro')
}
}
...
}
import android.app.Activity;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.IdlingPolicies;
import android.support.test.espresso.IdlingResource;
import android.support.test.espresso.core.deps.guava.collect.Iterables;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;
import android.test.suitebuilder.annotation.LargeTest;
import com.squareup.spoon.Spoon;
import org.apache.commons.lang3.StringUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.concurrent.TimeUnit;
import fr.xs.app.y.Activity.SplashScreenActivity;
import static android.support.test.InstrumentationRegistry.getInstrumentation;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {
@Rule
public ActivityTestRule<SplashScreenActivity> mActivityRule = new ActivityTestRule<>(SplashScreenActivity.class);
@Test
public void seeHomeScreen() throws Throwable {
// SpashScreen
takeScreenShot("Chargement Application");
onView(allOf(withText("Réveille l'amateur qui est en toi"),
withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(isCompletelyDisplayed()));
takeScreenShot("Splash Screen en cours");
waitForDelay(3000);
takeScreenShot("Splash Screen à la fin");
// HomeScree
onView(allOf(withText("Nouvelle Dégustation"),
withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(isCompletelyDisplayed()));
takeScreenShot("Home Screen");
// Preference
onView(withId(R.id.iv_seeParameters)).perform(click());
onView(withId(R.id.content_frame_sign_unsign)).check(matches(isDisplayed()));
takeScreenShot("Preferences Screen");
Activity getCurrentActivity() throws Throwable {
getInstrumentation().waitForIdleSync();
final Activity[] activity = new Activity[1];
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
java.util.Collection activites = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
activity[0] = (Activity) Iterables.getOnlyElement(activites);
}
});
return activity[0];
}
private static void waitForDelay(long waitingTime) {
// Make sure Espresso does not time out
IdlingPolicies.setMasterPolicyTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
// Now we wait
IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime);
Espresso.registerIdlingResources(idlingResource);
// Clean up
Espresso.unregisterIdlingResources(idlingResource);
}
private void takeScreenShot(String title) throws Throwable {
String string = StringUtils.stripAccents(title).replace(" ", "_");
Spoon.screenshot(getCurrentActivity(), string);
}
static class ElapsedTimeIdlingResource implements IdlingResource {
private final long startTime;
private final long waitingTime;
private ResourceCallback resourceCallback;
public ElapsedTimeIdlingResource(long waitingTime) {
this.startTime = System.currentTimeMillis();
this.waitingTime = waitingTime;
}
@Override
public String getName() {
return ElapsedTimeIdlingResource.class.getName() + ":" + waitingTime;
}
@Override
public boolean isIdleNow() {
long elapsed = System.currentTimeMillis() - startTime;
boolean idle = (elapsed >= waitingTime);
if (idle) {
resourceCallback.onTransitionToIdle();
}
return idle;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
}
}
Proguard配置
以下是Proguard文件(调试和测试)
-保持类fr.xs.app.y.*{*;}
-顿托夫斯卡特
我检查了这个类是否在mapping.txt(build/output/mapping/androidTest/dev)中,并且没有转换成另一个字符串
这是测试类:
android {
...
compileSdkVersion ANDROID_BUILD_SDK_VERSION
buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
productFlavors {
// Define separate dev and prod product flavors.
dev {
// dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
// to pre-dex each module and produce an APK that can be tested on
// Android Lollipop without time consuming dex merging processes.
minSdkVersion 21
}
prod {
// The actual minSdkVersion for the application.
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
}
}
defaultConfig {
applicationId "fr.xs.app.y"
targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
versionCode ANDROID_BUILD_VERSION_CODE
versionName ANDROID_BUILD_APP_VERSION_NAME
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// point sur le build de test
testBuildType = "validation"
buildTypes {
release {
debuggable false
ext.enableCrashlytics = true
renderscriptOptimLevel 3
signingConfig android.signingConfigs.release
zipAlignEnabled true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-release.pro'
}
debug {
debuggable true
renderscriptOptimLevel 3
applicationIdSuffix ".debug"
versionNameSuffix "debug"
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
}
validation.initWith(debug)
validation {
debuggable false
renderscriptOptimLevel 3
applicationIdSuffix ".validation"
versionNameSuffix "validation"
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
testProguardFile('proguard-rules-test.pro')
}
}
...
}
import android.app.Activity;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.IdlingPolicies;
import android.support.test.espresso.IdlingResource;
import android.support.test.espresso.core.deps.guava.collect.Iterables;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;
import android.test.suitebuilder.annotation.LargeTest;
import com.squareup.spoon.Spoon;
import org.apache.commons.lang3.StringUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.concurrent.TimeUnit;
import fr.xs.app.y.Activity.SplashScreenActivity;
import static android.support.test.InstrumentationRegistry.getInstrumentation;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {
@Rule
public ActivityTestRule<SplashScreenActivity> mActivityRule = new ActivityTestRule<>(SplashScreenActivity.class);
@Test
public void seeHomeScreen() throws Throwable {
// SpashScreen
takeScreenShot("Chargement Application");
onView(allOf(withText("Réveille l'amateur qui est en toi"),
withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(isCompletelyDisplayed()));
takeScreenShot("Splash Screen en cours");
waitForDelay(3000);
takeScreenShot("Splash Screen à la fin");
// HomeScree
onView(allOf(withText("Nouvelle Dégustation"),
withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(isCompletelyDisplayed()));
takeScreenShot("Home Screen");
// Preference
onView(withId(R.id.iv_seeParameters)).perform(click());
onView(withId(R.id.content_frame_sign_unsign)).check(matches(isDisplayed()));
takeScreenShot("Preferences Screen");
Activity getCurrentActivity() throws Throwable {
getInstrumentation().waitForIdleSync();
final Activity[] activity = new Activity[1];
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
java.util.Collection activites = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
activity[0] = (Activity) Iterables.getOnlyElement(activites);
}
});
return activity[0];
}
private static void waitForDelay(long waitingTime) {
// Make sure Espresso does not time out
IdlingPolicies.setMasterPolicyTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
// Now we wait
IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime);
Espresso.registerIdlingResources(idlingResource);
// Clean up
Espresso.unregisterIdlingResources(idlingResource);
}
private void takeScreenShot(String title) throws Throwable {
String string = StringUtils.stripAccents(title).replace(" ", "_");
Spoon.screenshot(getCurrentActivity(), string);
}
static class ElapsedTimeIdlingResource implements IdlingResource {
private final long startTime;
private final long waitingTime;
private ResourceCallback resourceCallback;
public ElapsedTimeIdlingResource(long waitingTime) {
this.startTime = System.currentTimeMillis();
this.waitingTime = waitingTime;
}
@Override
public String getName() {
return ElapsedTimeIdlingResource.class.getName() + ":" + waitingTime;
}
@Override
public boolean isIdleNow() {
long elapsed = System.currentTimeMillis() - startTime;
boolean idle = (elapsed >= waitingTime);
if (idle) {
resourceCallback.onTransitionToIdle();
}
return idle;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
}
}
导入android.app.Activity;
导入android.support.test.espresso.espresso;
导入android.support.test.espresso.IdlingPolicies;
导入android.support.test.espresso.IdlingResource;
导入android.support.test.espresso.core.deps.guava.collect.Iterables;
导入android.support.test.espresso.matcher.ViewMatchers;
导入android.support.test.rule.ActivityTestRule;
导入android.support.test.runner.AndroidJUnit4;
导入android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
导入android.support.test.runner.lifecycle.Stage;
导入android.test.suitebuilder.annotation.LargeTest;
导入com.squareup.spoon.spoon;
导入org.apache.commons.lang3.StringUtils;
导入org.junit.Rule;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入java.util.concurrent.TimeUnit;
导入fr.xs.app.y.Activity.SplashScreenActivity;
导入静态android.support.test.InstrumentationRegistry.getInstrumentation;
导入静态android.support.test.espresso.espresso.onView;
导入静态android.support.test.espresso.action.ViewActions.click;
导入静态android.support.test.espresso.assertion.ViewAssertions.matches;
导入静态android.support.test.espresso.matcher.ViewMatchers.Is完全显示;
导入静态android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
导入静态android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
导入静态android.support.test.espresso.matcher.ViewMatchers.withId;
导入静态android.support.test.espresso.matcher.ViewMatchers.withText;
导入静态org.hamcrest.CoreMatchers.allOf;
@RunWith(AndroidJUnit4.class)
@最大的
公共级HelloWorld浓缩咖啡酒店{
@统治
public ActivityTestRule mActivityRule=新的ActivityTestRule(SplashScreenActivity.class);
@试验
公共空间请参见主屏幕()可丢弃{
//垃圾筛
截图(“收费申请”);
onView(所有文字(“Réveille l'业余风格”),
withEffectiveVisibility(ViewMatchers.Visibility.Visibility)))
.检查(匹配项(已完全显示());
截图(当然是闪屏);
韦特福德(3000);
截图(“闪屏拉芬”);
//家信
onView(allOf(带文本(“新味觉”),
withEffectiveVisibility(ViewMatchers.Visibility.Visibility)))
.检查(匹配项(已完全显示());
截图(“主屏幕”);
//偏好
onView(使用id(R.id.iv_seeParameters))。执行(单击());
onView(带id(R.id.content\u frame\u sign\u unsign)).check(匹配项(isDisplayed());
截图(“首选项屏幕”);
Activity getCurrentActivity()抛出可丢弃的{
getInstrumentation().waitForIdleSync();
最终活动[]活动=新活动[1];
getInstrumentation().runOnMainSync(新的Runnable()命令){
@凌驾
公开募捐{
java.util.Collection activites=ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.resume);
活动[0]=(活动)Iterables.getOnlyElement(活动);
}
});
返回活动[0];
}
私有静态void waitForDelay(长等待时间){
//确保浓缩咖啡不会超时
IDlingPolicys.setMasterPolicyTimeout(waitingTime*2,时间单位为毫秒);
IDlingPolicys.setIdlingResourceTimeout(waitingTime*2,时间单位为毫秒);
//现在我们等待
IdlingResource IdlingResource=新的ElapsedTimeIdlingResource(waitingTime);
意式浓缩咖啡注册资源(idlingResource);
//清理
浓缩咖啡。未注册的IdlingResources(idlingResource);
}
私有void截图(字符串标题)抛出可丢弃{
String String=StringUtils.stripeAccents(标题)。替换(“,”);
屏幕截图(getCurrentActivity(),字符串);
}
静态类ElapsedTimeIdlingResource实现IdlingResource{
私人最终长启动时间;
私人最终长时间等待;
私有资源回调;
公共ElapsedTimeIdlingResource(长等待时间){
this.startTime=System.currentTimeMillis();
this.waitingTime=waitingTime;
}
@凌驾
公共字符串getName(){
返回ElapsedTimeIdlingResource.class.getName()+“:”+waitingTime;
}
@凌驾
公共布尔值isIdleNow(){
长时间运行=System.currentTimeMillis()-startTime;
布尔空闲=(已用>=等待时间);
如果(空闲){
resourceCallback.onTransitionToIdle();
}
返回空闲状态;
}
@凌驾
公共无效RegisterIDletionCallback(ResourceCallback ResourceCallback){
this.resourceCallback=resourceCallback;
}
}
}
这是日志:
android {
...
compileSdkVersion ANDROID_BUILD_SDK_VERSION
buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
productFlavors {
// Define separate dev and prod product flavors.
dev {
// dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
// to pre-dex each module and produce an APK that can be tested on
// Android Lollipop without time consuming dex merging processes.
minSdkVersion 21
}
prod {
// The actual minSdkVersion for the application.
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
}
}
defaultConfig {
applicationId "fr.xs.app.y"
targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
versionCode ANDROID_BUILD_VERSION_CODE
versionName ANDROID_BUILD_APP_VERSION_NAME
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// point sur le build de test
testBuildType = "validation"
buildTypes {
release {
debuggable false
ext.enableCrashlytics = true
renderscriptOptimLevel 3
signingConfig android.signingConfigs.release
zipAlignEnabled true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-release.pro'
}
debug {
debuggable true
renderscriptOptimLevel 3
applicationIdSuffix ".debug"
versionNameSuffix "debug"
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
}
validation.initWith(debug)
validation {
debuggable false
renderscriptOptimLevel 3
applicationIdSuffix ".validation"
versionNameSuffix "validation"
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', 'proguard-rules-dontobfuscate.pro'
testProguardFile('proguard-rules-test.pro')
}
}
...
}
import android.app.Activity;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.IdlingPolicies;
import android.support.test.espresso.IdlingResource;
import android.support.test.espresso.core.deps.guava.collect.Iterables;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;
import android.test.suitebuilder.annotation.LargeTest;
import com.squareup.spoon.Spoon;
import org.apache.commons.lang3.StringUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.concurrent.TimeUnit;
import fr.xs.app.y.Activity.SplashScreenActivity;
import static android.support.test.InstrumentationRegistry.getInstrumentation;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {
@Rule
public ActivityTestRule<SplashScreenActivity> mActivityRule = new ActivityTestRule<>(SplashScreenActivity.class);
@Test
public void seeHomeScreen() throws Throwable {
// SpashScreen
takeScreenShot("Chargement Application");
onView(allOf(withText("Réveille l'amateur qui est en toi"),
withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(isCompletelyDisplayed()));
takeScreenShot("Splash Screen en cours");
waitForDelay(3000);
takeScreenShot("Splash Screen à la fin");
// HomeScree
onView(allOf(withText("Nouvelle Dégustation"),
withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(isCompletelyDisplayed()));
takeScreenShot("Home Screen");
// Preference
onView(withId(R.id.iv_seeParameters)).perform(click());
onView(withId(R.id.content_frame_sign_unsign)).check(matches(isDisplayed()));
takeScreenShot("Preferences Screen");
Activity getCurrentActivity() throws Throwable {
getInstrumentation().waitForIdleSync();
final Activity[] activity = new Activity[1];
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
java.util.Collection activites = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
activity[0] = (Activity) Iterables.getOnlyElement(activites);
}
});
return activity[0];
}
private static void waitForDelay(long waitingTime) {
// Make sure Espresso does not time out
IdlingPolicies.setMasterPolicyTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
// Now we wait
IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime);
Espresso.registerIdlingResources(idlingResource);
// Clean up
Espresso.unregisterIdlingResources(idlingResource);
}
private void takeScreenShot(String title) throws Throwable {
String string = StringUtils.stripAccents(title).replace(" ", "_");
Spoon.screenshot(getCurrentActivity(), string);
}
static class ElapsedTimeIdlingResource implements IdlingResource {
private final long startTime;
private final long waitingTime;
private ResourceCallback resourceCallback;
public ElapsedTimeIdlingResource(long waitingTime) {
this.startTime = System.currentTimeMillis();
this.waitingTime = waitingTime;
}
@Override
public String getName() {
return ElapsedTimeIdlingResource.class.getName() + ":" + waitingTime;
}
@Override
public boolean isIdleNow() {
long elapsed = System.currentTimeMillis() - startTime;
boolean idle = (elapsed >= waitingTime);
if (idle) {
resourceCallback.onTransitionToIdle();
}
return idle;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
}
}
04-26 10:15:52.322?D/生命周期监视器:生命周期