Search in sources :

Example 1 with ARSCData

use of brut.androlib.res.decoder.ARSCDecoder.ARSCData in project Apktool by iBotPeaches.

the class AndrolibResources method installFramework.

public void installFramework(File frameFile, String tag) throws AndrolibException {
    InputStream in = null;
    ZipOutputStream out = null;
    try {
        ZipFile zip = new ZipFile(frameFile);
        ZipEntry entry = zip.getEntry("resources.arsc");
        if (entry == null) {
            throw new AndrolibException("Can't find resources.arsc file");
        }
        in = zip.getInputStream(entry);
        byte[] data = IOUtils.toByteArray(in);
        ARSCData arsc = ARSCDecoder.decode(new ByteArrayInputStream(data), true, true);
        publicizeResources(data, arsc.getFlagsOffsets());
        File outFile = new File(getFrameworkDir(), String.valueOf(arsc.getOnePackage().getId()) + (tag == null ? "" : '-' + tag) + ".apk");
        out = new ZipOutputStream(new FileOutputStream(outFile));
        out.setMethod(ZipOutputStream.STORED);
        CRC32 crc = new CRC32();
        crc.update(data);
        entry = new ZipEntry("resources.arsc");
        entry.setSize(data.length);
        entry.setCrc(crc.getValue());
        out.putNextEntry(entry);
        out.write(data);
        out.closeEntry();
        //Write fake AndroidManifest.xml file to support original aapt
        entry = zip.getEntry("AndroidManifest.xml");
        if (entry != null) {
            in = zip.getInputStream(entry);
            byte[] manifest = IOUtils.toByteArray(in);
            CRC32 manifestCrc = new CRC32();
            manifestCrc.update(manifest);
            entry.setSize(manifest.length);
            entry.setCompressedSize(-1);
            entry.setCrc(manifestCrc.getValue());
            out.putNextEntry(entry);
            out.write(manifest);
            out.closeEntry();
        }
        zip.close();
        LOGGER.info("Framework installed to: " + outFile);
    } catch (IOException ex) {
        throw new AndrolibException(ex);
    } finally {
        IOUtils.closeQuietly(in);
        IOUtils.closeQuietly(out);
    }
}
Also used : ZipFile(java.util.zip.ZipFile) ARSCData(brut.androlib.res.decoder.ARSCDecoder.ARSCData) CRC32(java.util.zip.CRC32) ZipOutputStream(java.util.zip.ZipOutputStream) ZipEntry(java.util.zip.ZipEntry) AndrolibException(brut.androlib.AndrolibException) ZipFile(java.util.zip.ZipFile) ExtFile(brut.directory.ExtFile)

Aggregations

AndrolibException (brut.androlib.AndrolibException)1 ARSCData (brut.androlib.res.decoder.ARSCDecoder.ARSCData)1 ExtFile (brut.directory.ExtFile)1 CRC32 (java.util.zip.CRC32)1 ZipEntry (java.util.zip.ZipEntry)1 ZipFile (java.util.zip.ZipFile)1 ZipOutputStream (java.util.zip.ZipOutputStream)1