private String stringify(Config config) {
   int emulateSdk = config.emulateSdk();
   String manifest = config.manifest();
   String qualifiers = config.qualifiers();
   String resourceDir = config.resourceDir();
   int reportSdk = config.reportSdk();
   Class<?>[] shadows = config.shadows();
   return stringify(emulateSdk, manifest, qualifiers, resourceDir, reportSdk, shadows);
 }
  @Override
  public AndroidManifest create() {
    if (config.manifest().equals(Config.NONE)) {
      return createDummyManifest();
    }

    FsFile manifestFile =
        getBaseDir()
            .join(
                config.manifest().equals(Config.DEFAULT_MANIFEST)
                    ? DEFAULT_MANIFEST_NAME
                    : config.manifest().replaceAll("^(\\./)+", ""));
    FsFile baseDir = manifestFile.getParent();
    FsFile resDir = baseDir.join(config.resourceDir());
    FsFile assetDir = baseDir.join(config.assetDir());

    List<FsFile> libraryDirs = null;
    if (config.libraries().length > 0) {
      libraryDirs = new ArrayList<>();
      for (String libraryDirName : config.libraries()) {
        libraryDirs.add(baseDir.join(libraryDirName));
      }
    }

    ManifestIdentifier identifier =
        new ManifestIdentifier(manifestFile, resDir, assetDir, config.packageName(), libraryDirs);
    synchronized (appManifestsByFile) {
      AndroidManifest appManifest;
      appManifest = appManifestsByFile.get(identifier);
      if (appManifest == null) {
        appManifest = createAppManifest(manifestFile, resDir, assetDir, config.packageName());
        appManifestsByFile.put(identifier, appManifest);
      }
      // The AppManifest may STILL be null if no file was found.
      if (appManifest != null) {
        appManifest.setLibraryManifests(createLibraryManifests(appManifest, libraryDirs));
      }
      return appManifest;
    }
  }