From 2a79c6d3e0ec0827264867417693e64d7789a430 Mon Sep 17 00:00:00 2001 From: Lanchon Date: Fri, 22 Sep 2017 21:35:55 -0300 Subject: [PATCH] Make WrappingMultiDexFile generic --- .../lanchon/multidexlib2/BasicMultiDexFile.java | 13 +++++++------ .../lanchon/multidexlib2/DirectoryDexContainer.java | 10 +++++----- src/main/java/lanchon/multidexlib2/MultiDexIO.java | 2 +- .../lanchon/multidexlib2/SingletonDexContainer.java | 10 +++++----- .../lanchon/multidexlib2/WrappingMultiDexFile.java | 4 ++-- .../lanchon/multidexlib2/ZipFileDexContainer.java | 11 ++++++----- 6 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/main/java/lanchon/multidexlib2/BasicMultiDexFile.java b/src/main/java/lanchon/multidexlib2/BasicMultiDexFile.java index 01299f0..4676db8 100644 --- a/src/main/java/lanchon/multidexlib2/BasicMultiDexFile.java +++ b/src/main/java/lanchon/multidexlib2/BasicMultiDexFile.java @@ -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> implements WrappingMultiDexFile { +public class BasicMultiDexFile, D extends DexFile> + implements WrappingMultiDexFile { - 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 { +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)) { - DexFile dexFile = RawDexIO.readRawDexFile(file, opcodes); - WrappingMultiDexFile multiDexFile = new BasicMultiDexFile<>(this, entryName, dexFile); + DexBackedDexFile dexFile = RawDexIO.readRawDexFile(file, opcodes); + WrappingMultiDexFile multiDexFile = new BasicMultiDexFile<>(this, entryName, dexFile); if (entryMap.put(entryName, multiDexFile) != null) throwDuplicateEntryName(entryName); } } diff --git a/src/main/java/lanchon/multidexlib2/MultiDexIO.java b/src/main/java/lanchon/multidexlib2/MultiDexIO.java index c63b4e1..0b049fe 100644 --- a/src/main/java/lanchon/multidexlib2/MultiDexIO.java +++ b/src/main/java/lanchon/multidexlib2/MultiDexIO.java @@ -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 diff --git a/src/main/java/lanchon/multidexlib2/SingletonDexContainer.java b/src/main/java/lanchon/multidexlib2/SingletonDexContainer.java index 6834c4d..60ee2ed 100644 --- a/src/main/java/lanchon/multidexlib2/SingletonDexContainer.java +++ b/src/main/java/lanchon/multidexlib2/SingletonDexContainer.java @@ -16,7 +16,7 @@ import java.util.Map; import org.jf.dexlib2.Opcodes; 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. @@ -26,14 +26,14 @@ public class SingletonDexContainer extends AbstractMultiDexContainer(this, entryName, dexFile); - Map entryMap = Collections.singletonMap(entryName, multiDexFile); + WrappingMultiDexFile multiDexFile = new BasicMultiDexFile<>(this, entryName, dexFile); + Map> entryMap = Collections.singletonMap(entryName, multiDexFile); initialize(entryMap, opcodes); } diff --git a/src/main/java/lanchon/multidexlib2/WrappingMultiDexFile.java b/src/main/java/lanchon/multidexlib2/WrappingMultiDexFile.java index 53d0acb..3024090 100644 --- a/src/main/java/lanchon/multidexlib2/WrappingMultiDexFile.java +++ b/src/main/java/lanchon/multidexlib2/WrappingMultiDexFile.java @@ -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 extends MultiDexFile { - DexFile getWrappedDexFile(); + D getWrappedDexFile(); } diff --git a/src/main/java/lanchon/multidexlib2/ZipFileDexContainer.java b/src/main/java/lanchon/multidexlib2/ZipFileDexContainer.java index 1618c87..18c5eca 100644 --- a/src/main/java/lanchon/multidexlib2/ZipFileDexContainer.java +++ b/src/main/java/lanchon/multidexlib2/ZipFileDexContainer.java @@ -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 { +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)); ZipFile zipFile = new ZipFile(zip); try { Enumeration zipEntries = zipFile.entries(); @@ -44,14 +44,15 @@ public class ZipFileDexContainer extends AbstractMultiDexContainer(this, entryName, dexFile); + WrappingMultiDexFile multiDexFile = + new BasicMultiDexFile<>(this, entryName, dexFile); if (entryMap.put(entryName, multiDexFile) != null) throwDuplicateEntryName(entryName); } }