diff --git a/src/main/java/lanchon/multidexlib2/AbstractMultiDexContainer.java b/src/main/java/lanchon/multidexlib2/AbstractMultiDexContainer.java index 92bc87f..205b4f7 100644 --- a/src/main/java/lanchon/multidexlib2/AbstractMultiDexContainer.java +++ b/src/main/java/lanchon/multidexlib2/AbstractMultiDexContainer.java @@ -20,12 +20,12 @@ import org.jf.dexlib2.iface.MultiDexContainer; public abstract class AbstractMultiDexContainer implements MultiDexContainer { - private Map entryMap; + private Map> entryMap; private List entryNames; protected AbstractMultiDexContainer() {} - protected void initialize(Map entryMap) { + protected void initialize(Map> entryMap) { if (entryMap == null) throw new NullPointerException("entryMap"); if (this.entryMap != null) throw new IllegalStateException("Already initialized"); this.entryMap = entryMap; @@ -39,7 +39,7 @@ public abstract class AbstractMultiDexContainer implements Mu } @Override - public T getEntry(String entryName) { + public DexEntry getEntry(String entryName) { return entryMap.get(entryName); } diff --git a/src/main/java/lanchon/multidexlib2/DirectoryDexContainer.java b/src/main/java/lanchon/multidexlib2/DirectoryDexContainer.java index db551cf..a61539b 100644 --- a/src/main/java/lanchon/multidexlib2/DirectoryDexContainer.java +++ b/src/main/java/lanchon/multidexlib2/DirectoryDexContainer.java @@ -18,18 +18,18 @@ import java.util.TreeMap; import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.dexbacked.DexBackedDexFile; -public class DirectoryDexContainer extends AbstractMultiDexContainer> { +public class DirectoryDexContainer extends AbstractMultiDexContainer { public DirectoryDexContainer(File directory, DexFileNamer namer, Opcodes opcodes) throws IOException { - Map> entryMap = new TreeMap<>(new DexFileNameComparator(namer)); + Map> 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)) { DexBackedDexFile dexFile = RawDexIO.readRawDexFile(file, opcodes); - WrappingMultiDexFile multiDexFile = new BasicMultiDexFile<>(this, entryName, dexFile); - if (entryMap.put(entryName, multiDexFile) != null) throw duplicateEntryName(entryName); + DexEntry entry = new BasicDexEntry<>(this, entryName, dexFile); + if (entryMap.put(entryName, entry) != null) throw duplicateEntryName(entryName); } } initialize(entryMap); diff --git a/src/main/java/lanchon/multidexlib2/MultiDexContainerBackedDexFile.java b/src/main/java/lanchon/multidexlib2/MultiDexContainerBackedDexFile.java index 308836f..951d173 100644 --- a/src/main/java/lanchon/multidexlib2/MultiDexContainerBackedDexFile.java +++ b/src/main/java/lanchon/multidexlib2/MultiDexContainerBackedDexFile.java @@ -30,18 +30,18 @@ public class MultiDexContainerBackedDexFile implements DexFil List entryNames = container.getDexEntryNames(); if (entryNames.size() == 1) { String entryName = entryNames.get(0); - T entry = container.getEntry(entryName); - classes = Collections.unmodifiableSet(entry.getClasses()); - opcodes = entry.getOpcodes(); + T entryDex = container.getEntry(entryName).getDexFile(); + classes = Collections.unmodifiableSet(entryDex.getClasses()); + opcodes = entryDex.getOpcodes(); } else { LinkedHashSet accumulatedClasses = new LinkedHashSet<>(); Opcodes resolvedOpcodes = null; for (String entryName : entryNames) { - T entry = container.getEntry(entryName); - for (ClassDef entryClass : entry.getClasses()) { + T entryDex = container.getEntry(entryName).getDexFile(); + for (ClassDef entryClass : entryDex.getClasses()) { if (!accumulatedClasses.add(entryClass)) throw new DuplicateTypeException(entryClass.getType()); } - resolvedOpcodes = OpcodeUtils.getNewestOpcodes(resolvedOpcodes, entry.getOpcodes(), true); + resolvedOpcodes = OpcodeUtils.getNewestOpcodes(resolvedOpcodes, entryDex.getOpcodes(), true); } classes = Collections.unmodifiableSet(accumulatedClasses); opcodes = resolvedOpcodes; diff --git a/src/main/java/lanchon/multidexlib2/MultiDexIO.java b/src/main/java/lanchon/multidexlib2/MultiDexIO.java index 43ae47a..4f7c472 100644 --- a/src/main/java/lanchon/multidexlib2/MultiDexIO.java +++ b/src/main/java/lanchon/multidexlib2/MultiDexIO.java @@ -30,35 +30,32 @@ public class MultiDexIO { public static DexFile readDexFile(boolean multiDex, File file, DexFileNamer namer, Opcodes opcodes, DexIO.Logger logger) throws IOException { - MultiDexContainer> container = - readMultiDexContainer(multiDex, file, namer, opcodes, logger); + MultiDexContainer container = readMultiDexContainer(multiDex, file, namer, opcodes, logger); return new MultiDexContainerBackedDexFile<>(container); } - public static MultiDexContainer> readMultiDexContainer(boolean multiDex, - File file, DexFileNamer namer, Opcodes opcodes, DexIO.Logger logger) throws IOException { - MultiDexContainer> container = - readMultiDexContainer(file, namer, opcodes, logger); + public static MultiDexContainer readMultiDexContainer(boolean multiDex, File file, + DexFileNamer namer, Opcodes opcodes, DexIO.Logger logger) throws IOException { + MultiDexContainer container = readMultiDexContainer(file, namer, opcodes, logger); int entries = container.getDexEntryNames().size(); if (entries == 0) throw new EmptyMultiDexContainerException(file.toString()); if (!multiDex && entries > 1) throw new MultiDexDetectedException(file.toString()); return container; } - public static MultiDexContainer> readMultiDexContainer(File file, - DexFileNamer namer, Opcodes opcodes, DexIO.Logger logger) throws IOException { - MultiDexContainer> container = - readMultiDexContainer(file, namer, opcodes); + public static MultiDexContainer readMultiDexContainer(File file, DexFileNamer namer, + Opcodes opcodes, DexIO.Logger logger) throws IOException { + MultiDexContainer container = readMultiDexContainer(file, namer, opcodes); if (logger != null) { for (String name : container.getDexEntryNames()) { - logger.log(file, name, container.getEntry(name).getClasses().size()); + logger.log(file, name, container.getEntry(name).getDexFile().getClasses().size()); } } return container; } - public static MultiDexContainer> readMultiDexContainer(File file, - DexFileNamer namer, Opcodes opcodes) throws IOException { + public static MultiDexContainer readMultiDexContainer(File file, DexFileNamer namer, + Opcodes opcodes) throws IOException { 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); diff --git a/src/main/java/lanchon/multidexlib2/SingletonDexContainer.java b/src/main/java/lanchon/multidexlib2/SingletonDexContainer.java index 9f5b601..54e5a8e 100644 --- a/src/main/java/lanchon/multidexlib2/SingletonDexContainer.java +++ b/src/main/java/lanchon/multidexlib2/SingletonDexContainer.java @@ -15,7 +15,7 @@ import java.util.Map; import org.jf.dexlib2.iface.DexFile; -public class SingletonDexContainer extends AbstractMultiDexContainer> { +public class SingletonDexContainer extends AbstractMultiDexContainer { // I insist that some dex container entries do not have names // even though dexlib2 does not allow null entry names. @@ -30,8 +30,8 @@ public class SingletonDexContainer extends AbstractMultiDexCo } public SingletonDexContainer(String entryName, T dexFile) { - WrappingMultiDexFile multiDexFile = new BasicMultiDexFile<>(this, entryName, dexFile); - Map> entryMap = Collections.singletonMap(entryName, multiDexFile); + DexEntry entry = new BasicDexEntry<>(this, entryName, dexFile); + Map> entryMap = Collections.singletonMap(entryName, entry); initialize(entryMap); } diff --git a/src/main/java/lanchon/multidexlib2/ZipFileDexContainer.java b/src/main/java/lanchon/multidexlib2/ZipFileDexContainer.java index 457e22d..c572e37 100644 --- a/src/main/java/lanchon/multidexlib2/ZipFileDexContainer.java +++ b/src/main/java/lanchon/multidexlib2/ZipFileDexContainer.java @@ -22,7 +22,7 @@ import java.util.zip.ZipFile; import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.dexbacked.DexBackedDexFile; -public class ZipFileDexContainer extends AbstractMultiDexContainer> { +public class ZipFileDexContainer extends AbstractMultiDexContainer { public static boolean isZipFile(File zip) { if (!zip.isFile()) return false; @@ -36,7 +36,7 @@ public class ZipFileDexContainer extends AbstractMultiDexContainer> entryMap = new TreeMap<>(new DexFileNameComparator(namer)); + Map> entryMap = new TreeMap<>(new DexFileNameComparator(namer)); try (ZipFile zipFile = new ZipFile(zip)) { Enumeration zipEntries = zipFile.entries(); while (zipEntries.hasMoreElements()) { @@ -47,9 +47,8 @@ public class ZipFileDexContainer extends AbstractMultiDexContainer multiDexFile = - new BasicMultiDexFile<>(this, entryName, dexFile); - if (entryMap.put(entryName, multiDexFile) != null) throw duplicateEntryName(entryName); + DexEntry entry = new BasicDexEntry<>(this, entryName, dexFile); + if (entryMap.put(entryName, entry) != null) throw duplicateEntryName(entryName); } } }