public void decodeManifestRaw(ExtFile apkFile, File outDir) throws AndrolibException {
   try {
     Directory apk = apkFile.getDirectory();
     LOGGER.info("Copying raw manifest...");
     apkFile.getDirectory().copyToDir(outDir, APK_MANIFEST_FILENAMES);
   } catch (DirectoryException ex) {
     throw new AndrolibException(ex);
   }
 }
  public void decodeManifest(ResTable resTable, ExtFile apkFile, File outDir)
      throws AndrolibException {

    Duo<ResFileDecoder, AXmlResourceParser> duo = getManifestFileDecoder();
    ResFileDecoder fileDecoder = duo.m1;

    // Set ResAttrDecoder
    duo.m2.setAttrDecoder(new ResAttrDecoder());
    ResAttrDecoder attrDecoder = duo.m2.getAttrDecoder();

    // Fake ResPackage
    attrDecoder.setCurrentPackage(new ResPackage(resTable, 0, null));

    Directory inApk, out;
    try {
      inApk = apkFile.getDirectory();
      out = new FileDirectory(outDir);

      LOGGER.info("Decoding AndroidManifest.xml with only framework resources...");
      fileDecoder.decodeManifest(inApk, "AndroidManifest.xml", out, "AndroidManifest.xml");

    } catch (DirectoryException ex) {
      throw new AndrolibException(ex);
    }
  }
 public Map<String, Object> readMetaFile(ExtFile appDir) throws AndrolibException {
   try (InputStream in = appDir.getDirectory().getFileInput("apktool.yml"); ) {
     Yaml yaml = new Yaml();
     return (Map<String, Object>) yaml.load(in);
   } catch (DirectoryException | IOException ex) {
     throw new AndrolibException(ex);
   }
 }
 public void decodeResourcesRaw(ExtFile apkFile, File outDir) throws AndrolibException {
   try {
     LOGGER.info("Copying raw resources...");
     apkFile.getDirectory().copyToDir(outDir, APK_RESOURCES_FILENAMES);
   } catch (DirectoryException ex) {
     throw new AndrolibException(ex);
   }
 }
 public void decodeSourcesRaw(ExtFile apkFile, File outDir, String filename)
     throws AndrolibException {
   try {
     LOGGER.info("Copying raw classes.dex file...");
     apkFile.getDirectory().copyToDir(outDir, filename);
   } catch (DirectoryException ex) {
     throw new AndrolibException(ex);
   }
 }
 private ResPackage[] getResPackagesFromApk(ExtFile apkFile, ResTable resTable, boolean keepBroken)
     throws AndrolibException {
   try {
     return ARSCDecoder.decode(
             apkFile.getDirectory().getFileInput("resources.arsc"), false, keepBroken, resTable)
         .getPackages();
   } catch (DirectoryException ex) {
     throw new AndrolibException("Could not load resources.arsc from file: " + apkFile, ex);
   }
 }
 public boolean buildManifestRaw(ExtFile appDir) throws AndrolibException {
   try {
     File apkDir = new File(appDir, APK_DIRNAME);
     LOGGER.info("Copying raw AndroidManifest.xml...");
     appDir.getDirectory().copyToDir(apkDir, APK_MANIFEST_FILENAMES);
     return true;
   } catch (DirectoryException ex) {
     throw new AndrolibException(ex);
   }
 }
  public void decode(ResTable resTable, ExtFile apkFile, File outDir) throws AndrolibException {
    Duo<ResFileDecoder, AXmlResourceParser> duo = getResFileDecoder();
    ResFileDecoder fileDecoder = duo.m1;
    ResAttrDecoder attrDecoder = duo.m2.getAttrDecoder();

    attrDecoder.setCurrentPackage(resTable.listMainPackages().iterator().next());

    Directory inApk, in = null, out;
    try {
      inApk = apkFile.getDirectory();
      out = new FileDirectory(outDir);

      LOGGER.info("Decoding AndroidManifest.xml with resources...");

      fileDecoder.decodeManifest(inApk, "AndroidManifest.xml", out, "AndroidManifest.xml");

      if (inApk.containsDir("res")) {
        in = inApk.getDir("res");
      }
      out = out.createDir("res");
    } catch (DirectoryException ex) {
      throw new AndrolibException(ex);
    }

    ExtMXSerializer xmlSerializer = getResXmlSerializer();
    for (ResPackage pkg : resTable.listMainPackages()) {
      attrDecoder.setCurrentPackage(pkg);

      LOGGER.info("Decoding file-resources...");
      for (ResResource res : pkg.listFiles()) {
        fileDecoder.decode(res, in, out);
      }

      LOGGER.info("Decoding values */* XMLs...");
      for (ResValuesFile valuesFile : pkg.listValuesFiles()) {
        generateValuesFile(valuesFile, out, xmlSerializer);
      }
      generatePublicXml(pkg, out, xmlSerializer);
      LOGGER.info("Done.");
    }

    AndrolibException decodeError = duo.m2.getFirstError();
    if (decodeError != null) {
      throw decodeError;
    }
  }
 public void decodeRawFiles(ExtFile apkFile, File outDir) throws AndrolibException {
   LOGGER.info("Copying assets and libs...");
   try {
     Directory in = apkFile.getDirectory();
     if (in.containsDir("assets")) {
       in.copyToDir(outDir, "assets");
     }
     if (in.containsDir("lib")) {
       in.copyToDir(outDir, "lib");
     }
     if (in.containsDir("libs")) {
       in.copyToDir(outDir, "libs");
     }
   } catch (DirectoryException ex) {
     throw new AndrolibException(ex);
   }
 }
  public void buildNonDefaultSources(ExtFile appDir) throws AndrolibException {
    try {
      Map<String, Directory> dirs = appDir.getDirectory().getDirs();
      for (Map.Entry<String, Directory> directory : dirs.entrySet()) {
        String name = directory.getKey();
        if (name.startsWith("smali_")) {
          String filename = name.substring(name.indexOf("_") + 1) + ".dex";

          if (!buildSourcesRaw(appDir, filename)
              && !buildSourcesSmali(appDir, name, filename)
              && !buildSourcesJava(appDir)) {
            LOGGER.warning("Could not find sources");
          }
        }
      }
    } catch (DirectoryException ex) {
      throw new AndrolibException(ex);
    }
  }
  public void writeOriginalFiles(ExtFile apkFile, File outDir) throws AndrolibException {
    LOGGER.info("Copying original files...");
    File originalDir = new File(outDir, "original");
    if (!originalDir.exists()) {
      originalDir.mkdirs();
    }

    try {
      Directory in = apkFile.getDirectory();
      if (in.containsFile("AndroidManifest.xml")) {
        in.copyToDir(originalDir, "AndroidManifest.xml");
      }
      if (in.containsDir("META-INF")) {
        in.copyToDir(originalDir, "META-INF");
      }
    } catch (DirectoryException ex) {
      throw new AndrolibException(ex);
    }
  }
 public boolean buildResourcesRaw(ExtFile appDir) throws AndrolibException {
   try {
     if (!new File(appDir, "resources.arsc").exists()) {
       return false;
     }
     File apkDir = new File(appDir, APK_DIRNAME);
     if (!apkOptions.forceBuildAll) {
       LOGGER.info("Checking whether resources has changed...");
     }
     if (apkOptions.forceBuildAll
         || isModified(
             newFiles(APK_RESOURCES_FILENAMES, appDir),
             newFiles(APK_RESOURCES_FILENAMES, apkDir))) {
       LOGGER.info("Copying raw resources...");
       appDir.getDirectory().copyToDir(apkDir, APK_RESOURCES_FILENAMES);
     }
     return true;
   } catch (DirectoryException ex) {
     throw new AndrolibException(ex);
   }
 }
  public void decodeUnknownFiles(ExtFile apkFile, File outDir, ResTable resTable)
      throws AndrolibException {
    LOGGER.info("Copying unknown files...");
    File unknownOut = new File(outDir, UNK_DIRNAME);
    ZipEntry invZipFile;

    // have to use container of ZipFile to help identify compression type
    // with regular looping of apkFile for easy copy
    try {
      Directory unk = apkFile.getDirectory();
      ZipFile apkZipFile = new ZipFile(apkFile.getAbsolutePath());

      // loop all items in container recursively, ignoring any that are pre-defined by aapt
      Set<String> files = unk.getFiles(true);
      for (String file : files) {
        if (!isAPKFileNames(file) && !file.endsWith(".dex")) {

          // copy file out of archive into special "unknown" folder
          unk.copyToDir(unknownOut, file);
          try {
            invZipFile = apkZipFile.getEntry(file);

            // lets record the name of the file, and its compression type
            // so that we may re-include it the same way
            if (invZipFile != null) {
              mResUnknownFiles.addUnknownFileInfo(
                  invZipFile.getName(), String.valueOf(invZipFile.getMethod()));
            }
          } catch (NullPointerException ignored) {
          }
        }
      }
      apkZipFile.close();
    } catch (DirectoryException | IOException ex) {
      throw new AndrolibException(ex);
    }
  }