Skip to content

Commit a213b0d

Browse files
committed
[DEX] Adopt smali file name factory from JesusFreke/smali
1 parent 40e3614 commit a213b0d

9 files changed

Lines changed: 729 additions & 195 deletions

File tree

src/main/java/com/reandroid/dex/id/ClassId.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,12 +502,12 @@ public SmaliClass toSmali() {
502502

503503
@Override
504504
public void append(SmaliWriter writer) throws IOException {
505+
ClassData classData = getClassData();
505506
getClassTypeId().append(writer);
506507
getSuperClassId().append(writer);
507508
getSourceFileReference().append(writer);
508509
getInterfacesKey().appendInterfaces(writer);
509510
getAnnotation().appendClass(writer);
510-
ClassData classData = getClassData();
511511
if (classData != null) {
512512
writer.newLine();
513513
classData.append(writer);

src/main/java/com/reandroid/dex/model/DexClass.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545

4646
import java.io.File;
4747
import java.io.FileOutputStream;
48-
import java.io.FileWriter;
4948
import java.io.IOException;
5049
import java.io.OutputStreamWriter;
5150
import java.util.HashSet;
@@ -601,7 +600,6 @@ public int compareTo(DexClass dexClass) {
601600
}
602601
@Override
603602
public void append(SmaliWriter writer) throws IOException {
604-
getClassData();
605603
getId().append(writer);
606604
}
607605

@@ -647,11 +645,8 @@ public DexField parseInterfaces(SmaliReader reader) throws IOException {
647645
dexField.getDefinition().fromSmali(smaliField);
648646
return dexField;
649647
}
650-
public void writeSmali(SmaliWriter writer, File dir) throws IOException {
651-
File file = writer.getFileNameFactory().toFile(dir, getKey());
652-
FileUtil.ensureParentDirectory(file);
653-
FileWriter fileWriter = new FileWriter(file);
654-
writer.setWriter(fileWriter);
648+
public void writeSmali(SmaliWriter writer, File file) throws IOException {
649+
writer.setWriter(file);
655650
append(writer);
656651
writer.close();
657652
}

src/main/java/com/reandroid/dex/model/DexDirectory.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.reandroid.dex.sections.SectionArray;
3434
import com.reandroid.dex.sections.SectionType;
3535
import com.reandroid.dex.smali.SmaliWriter;
36+
import com.reandroid.dex.smali.SmaliWriterSetting;
3637
import com.reandroid.utils.collection.ArrayCollection;
3738
import com.reandroid.utils.collection.CollectionUtil;
3839
import com.reandroid.utils.collection.EmptyList;
@@ -669,6 +670,12 @@ public void writeSmali(SmaliWriter writer, File root) throws IOException {
669670
dexFile.writeSmali(writer, root);
670671
}
671672
}
673+
public void writeSmali(SmaliWriterSetting writerSetting, File root) throws IOException {
674+
for (DexFile dexFile : this) {
675+
File dir = new File(root, dexFile.buildSmaliDirectoryName());
676+
dexFile.writeSmali(writerSetting, dir);
677+
}
678+
}
672679

673680
@Override
674681
public String toString() {

src/main/java/com/reandroid/dex/model/DexFile.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.reandroid.dex.id.ClassId;
2020
import com.reandroid.dex.sections.*;
2121
import com.reandroid.dex.smali.SmaliWriter;
22+
import com.reandroid.dex.smali.SmaliWriterSetting;
2223
import com.reandroid.utils.CompareUtil;
2324
import com.reandroid.utils.ObjectsUtil;
2425
import com.reandroid.utils.collection.ArrayCollection;
@@ -293,14 +294,33 @@ public void writeSmali(SmaliWriter writer, File root) throws IOException {
293294
}
294295
} else {
295296
int size = size();
296-
for(int i = 0; i < size; i++) {
297+
for (int i = 0; i < size; i++) {
297298
DexLayout dexLayout = getLayout(i);
298299
String name = DexLayout.DIRECTORY_PREFIX + i;
299300
File dir = new File(root, name);
300301
dexLayout.writeSmali(writer, dir);
301302
}
302303
}
303304
}
305+
public void writeSmali(SmaliWriterSetting writerSetting, File root) throws IOException {
306+
requireNotClosed();
307+
DexFileInfo fileInfo = DexFileInfo.fromDex(this);
308+
fileInfo.saveToDirectory(root);
309+
if (!isMultiLayout()) {
310+
DexLayout first = getFirst();
311+
if (first != null) {
312+
first.writeSmali(writerSetting, root);
313+
}
314+
} else {
315+
int size = size();
316+
for (int i = 0; i < size; i++) {
317+
DexLayout dexLayout = getLayout(i);
318+
String name = DexLayout.DIRECTORY_PREFIX + i;
319+
File dir = new File(root, name);
320+
dexLayout.writeSmali(writerSetting, dir);
321+
}
322+
}
323+
}
304324

305325
private List<File> listSmaliLayouts(File dir) {
306326
File[] files = dir.listFiles();

src/main/java/com/reandroid/dex/model/DexLayout.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@
2525
import com.reandroid.dex.key.Key;
2626
import com.reandroid.dex.key.TypeKey;
2727
import com.reandroid.dex.sections.*;
28+
import com.reandroid.dex.smali.SmaliFileNameFactory;
2829
import com.reandroid.dex.smali.SmaliReader;
2930
import com.reandroid.dex.smali.SmaliWriter;
31+
import com.reandroid.dex.smali.SmaliWriterSetting;
3032
import com.reandroid.dex.smali.model.SmaliClass;
3133
import com.reandroid.utils.ObjectsUtil;
3234
import com.reandroid.utils.collection.*;
@@ -330,9 +332,25 @@ public DexClass fromSmali(SmaliClass smaliClass) throws IOException {
330332
return create(classId);
331333
}
332334
public void writeSmali(SmaliWriter writer, File root) throws IOException {
333-
Iterator<DexClass> iterator = getDexClasses();
335+
SmaliFileNameFactory fileNameFactory = new SmaliFileNameFactory(root);
336+
Iterator<ClassId> iterator = getItems(SectionType.CLASS_ID);
334337
while (iterator.hasNext()) {
335-
iterator.next().writeSmali(writer, root);
338+
ClassId classId = iterator.next();
339+
File file = fileNameFactory.getUniqueFilenameForClass(classId.getKey());
340+
writer.setWriter(file);
341+
classId.append(writer);
342+
writer.close();
343+
}
344+
}
345+
public void writeSmali(SmaliWriterSetting writerSetting, File root) throws IOException {
346+
SmaliFileNameFactory fileNameFactory = new SmaliFileNameFactory(root);
347+
Iterator<ClassId> iterator = getItems(SectionType.CLASS_ID);
348+
while (iterator.hasNext()) {
349+
ClassId classId = iterator.next();
350+
SmaliWriter writer = new SmaliWriter(writerSetting);
351+
writer.setWriter(fileNameFactory.getUniqueFilenameForClass(classId.getKey()));
352+
classId.append(writer);
353+
writer.close();
336354
}
337355
}
338356

0 commit comments

Comments
 (0)