Make WrappingMultiDexFile generic

This commit is contained in:
Lanchon 2017-09-22 21:35:55 -03:00
parent 9362e6bd47
commit 2a79c6d3e0
6 changed files with 26 additions and 24 deletions

View File

@ -18,13 +18,14 @@ import org.jf.dexlib2.iface.DexFile;
import org.jf.dexlib2.iface.MultiDexContainer;
import org.jf.dexlib2.iface.MultiDexContainer.MultiDexFile;
public class BasicMultiDexFile<T extends MultiDexContainer<? extends MultiDexFile>> implements WrappingMultiDexFile {
public class BasicMultiDexFile<C extends MultiDexContainer<? extends MultiDexFile>, D extends DexFile>
implements WrappingMultiDexFile<D> {
private final T container;
private final C container;
private final String entryName;
private final DexFile dexFile;
private final D dexFile;
public BasicMultiDexFile(T container, String entryName, DexFile dexFile) {
public BasicMultiDexFile(C container, String entryName, D dexFile) {
this.container = container;
this.entryName = entryName;
this.dexFile = dexFile;
@ -46,12 +47,12 @@ public class BasicMultiDexFile<T extends MultiDexContainer<? extends MultiDexFil
}
@Override
public T getContainer() {
public C getContainer() {
return container;
}
@Override
public DexFile getWrappedDexFile() {
public D getWrappedDexFile() {
return dexFile;
}

View File

@ -16,19 +16,19 @@ import java.util.Map;
import java.util.TreeMap;
import org.jf.dexlib2.Opcodes;
import org.jf.dexlib2.iface.DexFile;
import org.jf.dexlib2.dexbacked.DexBackedDexFile;
public class DirectoryDexContainer extends AbstractMultiDexContainer<WrappingMultiDexFile> {
public class DirectoryDexContainer extends AbstractMultiDexContainer<WrappingMultiDexFile<DexBackedDexFile>> {
public DirectoryDexContainer(File directory, DexFileNamer namer, Opcodes opcodes) throws IOException {
Map<String, WrappingMultiDexFile> entryMap = new TreeMap<>(new DexFileNameComparator(namer));
Map<String, WrappingMultiDexFile<DexBackedDexFile>> entryMap = new TreeMap<>(new DexFileNameComparator(namer));
String[] names = directory.list();
if (names == null) throw new IOException("Cannot access directory: " + directory);
for (String entryName : names) {
File file = new File(directory, entryName);
if (file.isFile() && namer.isValidName(entryName)) {
DexFile dexFile = RawDexIO.readRawDexFile(file, opcodes);
WrappingMultiDexFile multiDexFile = new BasicMultiDexFile<>(this, entryName, dexFile);
DexBackedDexFile dexFile = RawDexIO.readRawDexFile(file, opcodes);
WrappingMultiDexFile<DexBackedDexFile> multiDexFile = new BasicMultiDexFile<>(this, entryName, dexFile);
if (entryMap.put(entryName, multiDexFile) != null) throwDuplicateEntryName(entryName);
}
}

View File

@ -58,7 +58,7 @@ public class MultiDexIO {
if (file.isDirectory()) return new DirectoryDexContainer(file, namer, opcodes);
if (!file.isFile()) throw new FileNotFoundException(file.toString());
if (ZipFileDexContainer.isZipFile(file)) return new ZipFileDexContainer(file, namer, opcodes);
return new SingletonDexContainer(RawDexIO.readRawDexFile(file, opcodes));
return new SingletonDexContainer<>(RawDexIO.readRawDexFile(file, opcodes));
}
// Write

View File

@ -16,7 +16,7 @@ import java.util.Map;
import org.jf.dexlib2.Opcodes;
import org.jf.dexlib2.iface.DexFile;
public class SingletonDexContainer extends AbstractMultiDexContainer<WrappingMultiDexFile> {
public class SingletonDexContainer<D extends DexFile> extends AbstractMultiDexContainer<WrappingMultiDexFile<D>> {
// I insist that some dex container entries do not have names
// even though dexlib2 does not allow null entry names.
@ -26,14 +26,14 @@ public class SingletonDexContainer extends AbstractMultiDexContainer<WrappingMul
// using the '==' operator rather than the 'equals(...)' method.
public static final String UNDEFINED_ENTRY_NAME = null;
public SingletonDexContainer(DexFile dexFile) {
public SingletonDexContainer(D dexFile) {
this(UNDEFINED_ENTRY_NAME, dexFile);
}
public SingletonDexContainer(String entryName, DexFile dexFile) {
public SingletonDexContainer(String entryName, D dexFile) {
Opcodes opcodes = dexFile.getOpcodes();
WrappingMultiDexFile multiDexFile = new BasicMultiDexFile<>(this, entryName, dexFile);
Map<String, WrappingMultiDexFile> entryMap = Collections.singletonMap(entryName, multiDexFile);
WrappingMultiDexFile<D> multiDexFile = new BasicMultiDexFile<>(this, entryName, dexFile);
Map<String, WrappingMultiDexFile<D>> entryMap = Collections.singletonMap(entryName, multiDexFile);
initialize(entryMap, opcodes);
}

View File

@ -13,8 +13,8 @@ package lanchon.multidexlib2;
import org.jf.dexlib2.iface.DexFile;
import org.jf.dexlib2.iface.MultiDexContainer.MultiDexFile;
public interface WrappingMultiDexFile extends MultiDexFile {
public interface WrappingMultiDexFile<D extends DexFile> extends MultiDexFile {
DexFile getWrappedDexFile();
D getWrappedDexFile();
}

View File

@ -20,9 +20,9 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.jf.dexlib2.Opcodes;
import org.jf.dexlib2.iface.DexFile;
import org.jf.dexlib2.dexbacked.DexBackedDexFile;
public class ZipFileDexContainer extends AbstractMultiDexContainer<WrappingMultiDexFile> {
public class ZipFileDexContainer extends AbstractMultiDexContainer<WrappingMultiDexFile<DexBackedDexFile>> {
public static boolean isZipFile(File zip) {
if (!zip.isFile()) return false;
@ -36,7 +36,7 @@ public class ZipFileDexContainer extends AbstractMultiDexContainer<WrappingMulti
}
public ZipFileDexContainer(File zip, DexFileNamer namer, Opcodes opcodes) throws IOException {
Map<String, WrappingMultiDexFile> entryMap = new TreeMap<>(new DexFileNameComparator(namer));
Map<String, WrappingMultiDexFile<DexBackedDexFile>> entryMap = new TreeMap<>(new DexFileNameComparator(namer));
ZipFile zipFile = new ZipFile(zip);
try {
Enumeration<? extends ZipEntry> zipEntries = zipFile.entries();
@ -44,14 +44,15 @@ public class ZipFileDexContainer extends AbstractMultiDexContainer<WrappingMulti
ZipEntry zipEntry = zipEntries.nextElement();
String entryName = zipEntry.getName();
if (namer.isValidName(entryName)) {
DexFile dexFile;
DexBackedDexFile dexFile;
InputStream inputStream = zipFile.getInputStream(zipEntry);
try {
dexFile = RawDexIO.readRawDexFile(inputStream, zipEntry.getSize(), opcodes);
} finally {
inputStream.close();
}
WrappingMultiDexFile multiDexFile = new BasicMultiDexFile<>(this, entryName, dexFile);
WrappingMultiDexFile<DexBackedDexFile> multiDexFile =
new BasicMultiDexFile<>(this, entryName, dexFile);
if (entryMap.put(entryName, multiDexFile) != null) throwDuplicateEntryName(entryName);
}
}