From 6e065f15a03cae199f5d2497ad7fe375e1f24483 Mon Sep 17 00:00:00 2001 From: Andrei Zhukouski Date: Sun, 17 Apr 2016 14:48:51 +0300 Subject: [PATCH] Support of official aapt Create fake AndroidManifest.xml file inside each installed framework file to support official aapt from Google. --- .../brut/androlib/res/AndrolibResources.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java index 9f69936f..75e73b83 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AndrolibResources.java @@ -621,6 +621,15 @@ final public class AndrolibResources { entry.setCrc(crc.getValue()); out.putNextEntry(entry); out.write(data); + out.closeEntry(); + + //Write fake AndroidManifest.xml file to support original aapt + byte[] manifest = createAndroidManifestFileData(); + entry = createAndroidManifestEntry(manifest); + out.putNextEntry(entry); + out.write(data); + out.closeEntry(); + zip.close(); LOGGER.info("Framework installed to: " + outFile); } catch (IOException ex) { @@ -630,6 +639,26 @@ final public class AndrolibResources { IOUtils.closeQuietly(out); } } + + private ZipEntry createAndroidManifestEntry(byte[] data) throws IOException { + ZipEntry entry = new ZipEntry("AndroidManifest.xml"); + CRC32 crc = new CRC32(); + crc.update(data); + entry.setSize(data.length); + entry.setCrc(crc.getValue()); + return entry; + } + + private byte[] createAndroidManifestFileData() throws IOException { + File temp = File.createTempFile("AndroidManifest", ".tmp"); + BufferedWriter bw = new BufferedWriter(new FileWriter(temp)); + bw.write("AndroidManifest.xml for official aapt"); + bw.close(); + InputStream in = new FileInputStream(temp); + byte[] data = IOUtils.toByteArray(in); + in.close(); + return data; + } public void publicizeResources(File arscFile) throws AndrolibException { byte[] data = new byte[(int) arscFile.length()];