/** @return true if the class is RunWithCucumber annotated, false otherwise */
 private boolean readRunWithCucumberAnnotation(Class<?> clazz) {
   RunWithCucumber annotation = clazz.getAnnotation(RunWithCucumber.class);
   if (annotation != null) {
     // isEmpty() only available in Android API 9+
     packageOfTests = annotation.glue().equals("") ? defaultGlue() : annotation.glue();
     features = annotation.features().equals("") ? defaultFeatures() : annotation.features();
     return true;
   }
   return false;
 }
  @Override
  public void onCreate(Bundle arguments) {
    super.onCreate(arguments);

    if (arguments == null) {
      throw new CucumberException("No arguments");
    }
    Context context = getContext();
    classLoader = context.getClassLoader();

    String apkPath = context.getPackageCodePath();
    Reflections reflections = new DexReflections(newDexFile(apkPath));

    // For glue and features either use the provided arguments or try to find a RunWithCucumber
    // annotated class.
    // If nothing works, default values will be used instead.
    if (arguments.containsKey(ARGUMENT_TEST_CLASS)
        || arguments.containsKey(ARGUMENT_TEST_PACKAGE)) {

      String testClass = arguments.getString(ARGUMENT_TEST_CLASS);
      testClass = testClass != null ? testClass : "null";
      packageOfTests = arguments.getString(ARGUMENT_TEST_PACKAGE);

      try {
        Class<?> clazz = classLoader.loadClass(testClass);
        boolean annotationWasPresent = readRunWithCucumberAnnotation(clazz);

        // If the class is not RunWithCucumber annotated, maybe it's Cucumber annotated?
        if (!annotationWasPresent) {
          SEARCH_ANNOTATION:
          for (Method m : clazz.getMethods()) {
            for (Annotation a : m.getAnnotations()) {
              if (a.annotationType().getName().startsWith("cucumber") && packageOfTests == null) {
                packageOfTests = testClass.substring(0, testClass.lastIndexOf("."));
                break SEARCH_ANNOTATION;
              }
            }
          }
        }
      } catch (ClassNotFoundException e) {
        Log.w(TAG, e.toString());
      }
    } else {
      for (Class<?> clazz : reflections.getDescendants(Object.class, context.getPackageName())) {
        if (readRunWithCucumberAnnotation(clazz)) break;
      }
    }

    Properties properties = new Properties();
    packageOfTests = packageOfTests != null ? packageOfTests : defaultGlue();
    features = features != null ? features : defaultFeatures();

    properties.setProperty("cucumber.options", String.format("-g %s %s", packageOfTests, features));
    runtimeOptions = new RuntimeOptions(properties);

    resourceLoader = new AndroidResourceLoader(context);

    List<Backend> backends = new ArrayList<Backend>();
    backends.add(new JavaBackend(new AndroidObjectFactory(this), reflections));
    runtime = new Runtime(resourceLoader, classLoader, backends, runtimeOptions);

    start();
  }