fixes issue #67 - only compresses resources.arsc if original apk had compressoin

This commit is contained in:
Connor Tumbleson 2013-01-13 08:19:42 -06:00
parent 7fc70058dc
commit f82b2e1855
5 changed files with 54 additions and 4 deletions

View File

@ -155,7 +155,12 @@ public class Main {
String.valueOf(ex.getPkgId()) + ". You must install proper " +
"framework files, see project website for more info.");
System.exit(1);
} catch (IOException ex) {
System.out.println(
"Could not modify file. Please ensure you have permission.");
System.exit(1);
}
}
private static void cmdBuild(String[] args) throws BrutException {

View File

@ -183,6 +183,7 @@ public class Androlib {
Map<String, Object> meta = readMetaFile(appDir);
Object t1 = meta.get("isFrameworkApk");
flags.put("framework", t1 == null ? false : (Boolean) t1);
flags.put("compression", meta.get("compressionType") == null ? false : (Boolean) meta.get("compressionType"));
mAndRes.setSdkInfo((Map<String, String>) meta.get("sdkInfo"));
// check the orig apk

View File

@ -26,7 +26,11 @@ import brut.common.BrutException;
import brut.directory.DirectoryException;
import brut.util.OS;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
/**
* @author Ryszard Wiśniewski <brut.alll@gmail.com>
@ -58,7 +62,7 @@ public class ApkDecoder {
mOutDir = outDir;
}
public void decode() throws AndrolibException {
public void decode() throws AndrolibException, IOException {
File outDir = getOutDir();
if (!mForceDelete && outDir.exists()) {
@ -91,6 +95,20 @@ public class ApkDecoder {
}
if (hasResources()) {
// read the resources.arsc checking for STORED vs DEFLATE compression
// this will determine whether we compress on rebuild or not.
JarFile jf = new JarFile(mApkFile.getAbsoluteFile());
Enumeration<?> e = jf.entries();
while(e.hasMoreElements()) {
JarEntry je = (JarEntry) e.nextElement();
if (je.getName().equalsIgnoreCase("resources.arsc")) {
setCompressionType(je.getMethod());
continue;
}
}
jf.close();
switch (mDecodeResources) {
case DECODE_RESOURCES_NONE:
mAndrolib.decodeResourcesRaw(mApkFile, outDir);
@ -227,6 +245,7 @@ public class ApkDecoder {
putUsesFramework(meta);
putSdkInfo(meta);
putPackageInfo(meta);
putCompressionInfo(meta);
}
mAndrolib.writeMetaFile(mOutDir, meta);
@ -270,6 +289,27 @@ public class ApkDecoder {
meta.put("packageInfo", info);
}
}
private void putCompressionInfo(Map<String, Object> meta)
throws AndrolibException {
meta.put("compressionType", getCompressionType());
}
private boolean getCompressionType() {
return mCompressResources;
}
private void setCompressionType(int compression) {
// check for deflate vs stored
if (compression == ZipEntry.STORED) {
mCompressResources = false;
} else if (compression == ZipEntry.DEFLATED) {
mCompressResources = true;
} else {
mCompressResources = false;
}
}
private final Androlib mAndrolib;
@ -284,4 +324,5 @@ public class ApkDecoder {
private boolean mKeepBrokenResources = false;
private String mFrameworkDir = null;
private boolean mBakDeb = true;
private boolean mCompressResources = false;
}

View File

@ -320,8 +320,11 @@ final public class AndrolibResources {
if (flags.get("framework")) {
cmd.add("-x");
// cmd.add("-0");
// cmd.add("arsc");
}
if (!(flags.get("compression"))) {
cmd.add("-0");
cmd.add("arsc");
}
if (include != null) {

View File

@ -33,7 +33,7 @@ import org.xml.sax.SAXException;
public class BuildAndDecodeTest {
@BeforeClass
public static void beforeClass() throws BrutException {
public static void beforeClass() throws BrutException, IOException {
sTmpDir = new ExtFile(OS.createTempDirectory());
sTestOrigDir = new ExtFile(sTmpDir, "testapp-orig");
sTestNewDir = new ExtFile(sTmpDir, "testapp-new");