Skip to content

Commit

Permalink
Merge e53a72c into b2f41e9
Browse files Browse the repository at this point in the history
  • Loading branch information
achellies committed May 12, 2016
2 parents b2f41e9 + e53a72c commit 897b241
Showing 1 changed file with 35 additions and 17 deletions.
52 changes: 35 additions & 17 deletions jadx-core/src/main/java/jadx/core/utils/files/InputFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;
Expand Down Expand Up @@ -81,36 +82,53 @@ private void addDexFile(String fileName, Dex dexBuf) throws IOException {

private boolean loadFromZip(String ext) throws IOException, DecodeException {
ZipFile zf = new ZipFile(file);

// Input file could be .apk or .zip files
// we should consider the input file could contain only one single dex, multi-dex, or instantRun support dex for Android .apk files
String instantRunDexSuffix = "classes" + ext;
int index = 0;
while (true) {
String entryName = "classes" + (index == 0 ? "" : index) + ext;
ZipEntry entry = zf.getEntry(entryName);
if (entry == null) {
break;
}
for (Enumeration<? extends ZipEntry> e = zf.entries(); e.hasMoreElements(); ) {
ZipEntry entry = e.nextElement();
String entryName = entry.getName();

InputStream inputStream = zf.getInputStream(entry);
try {
if (ext.equals(".dex")) {
addDexFile(entryName, new Dex(inputStream));
} else if (ext.equals(".jar")) {
File jarFile = FileUtils.createTempFile(entryName);
if ((entryName.startsWith("classes") && entryName.endsWith(ext)) || entryName.endsWith(instantRunDexSuffix)) {
if (ext.equals(".dex")) {
index++;
addDexFile(entryName, new Dex(inputStream));
} else if (ext.equals(".jar")) {
index++;
File jarFile = FileUtils.createTempFile(entryName);
FileOutputStream fos = new FileOutputStream(jarFile);
try {
IOUtils.copy(inputStream, fos);
} finally {
close(fos);
}
addDexFile(entryName, loadFromJar(jarFile));
} else {
throw new JadxRuntimeException("Unexpected extension in zip: " + ext);
}
} else if (entryName.equals("instant-run.zip") && ext.equals(".dex")) {
File jarFile = FileUtils.createTempFile("instant-run.zip");
FileOutputStream fos = new FileOutputStream(jarFile);
try {
IOUtils.copy(inputStream, fos);
} finally {
close(fos);
}
addDexFile(entryName, loadFromJar(jarFile));
} else {
throw new JadxRuntimeException("Unexpected extension in zip: " + ext);
InputFile tempFile = new InputFile(jarFile);
tempFile.loadFromZip(ext);
List<DexFile> dexFiles = tempFile.getDexFiles();
if (!dexFiles.isEmpty()) {
index += dexFiles.size();
this.dexFiles.addAll(dexFiles);
}
}
} finally {
close(inputStream);
}
index++;
if (index == 1) {
index = 2;
}
}
zf.close();
return index > 0;
Expand Down

0 comments on commit 897b241

Please sign in to comment.