13
13
import org .slf4j .Logger ;
14
14
import org .slf4j .LoggerFactory ;
15
15
16
- import jadx .api .ResourceFile .ZipRef ;
17
16
import jadx .api .impl .SimpleCodeInfo ;
18
17
import jadx .api .plugins .CustomResourcesLoader ;
19
18
import jadx .api .plugins .resources .IResContainerFactory ;
31
30
import jadx .core .xmlgen .ResTableBinaryParserProvider ;
32
31
import jadx .zip .IZipEntry ;
33
32
import jadx .zip .ZipContent ;
34
- import jadx .zip .ZipReader ;
35
33
36
34
import static jadx .core .utils .files .FileUtils .READ_BUFFER_SIZE ;
37
35
import static jadx .core .utils .files .FileUtils .copyStream ;
40
38
public final class ResourcesLoader implements IResourcesLoader {
41
39
private static final Logger LOG = LoggerFactory .getLogger (ResourcesLoader .class );
42
40
43
- private final JadxDecompiler jadxRef ;
41
+ private final JadxDecompiler decompiler ;
44
42
45
43
private final List <IResTableParserProvider > resTableParserProviders = new ArrayList <>();
46
44
private final List <IResContainerFactory > resContainerFactories = new ArrayList <>();
47
45
48
46
private BinaryXMLParser binaryXmlParser ;
49
47
50
- ResourcesLoader (JadxDecompiler jadxRef ) {
51
- this .jadxRef = jadxRef ;
48
+ ResourcesLoader (JadxDecompiler decompiler ) {
49
+ this .decompiler = decompiler ;
52
50
this .resTableParserProviders .add (new ResTableBinaryParserProvider ());
53
51
}
54
52
55
53
List <ResourceFile > load (RootNode root ) {
56
54
init (root );
57
- List <File > inputFiles = jadxRef .getArgs ().getInputFiles ();
55
+ List <File > inputFiles = decompiler .getArgs ().getInputFiles ();
58
56
List <ResourceFile > list = new ArrayList <>(inputFiles .size ());
59
57
for (File file : inputFiles ) {
60
58
loadFile (list , file );
@@ -95,23 +93,16 @@ public void addResTableParserProvider(IResTableParserProvider resTableParserProv
95
93
96
94
public static <T > T decodeStream (ResourceFile rf , ResourceDecoder <T > decoder ) throws JadxException {
97
95
try {
98
- ZipRef zipRef = rf .getZipRef ();
99
- if (zipRef == null ) {
96
+ IZipEntry zipEntry = rf .getZipEntry ();
97
+ if (zipEntry != null ) {
98
+ try (InputStream inputStream = zipEntry .getInputStream ()) {
99
+ return decoder .decode (zipEntry .getUncompressedSize (), inputStream );
100
+ }
101
+ } else {
100
102
File file = new File (rf .getOriginalName ());
101
103
try (InputStream inputStream = new BufferedInputStream (new FileInputStream (file ))) {
102
104
return decoder .decode (file .length (), inputStream );
103
105
}
104
- } else {
105
- ZipReader zipReader = rf .getDecompiler ().getZipReader ();
106
- try (ZipContent content = zipReader .open (zipRef .getZipFile ())) {
107
- IZipEntry entry = content .searchEntry (zipRef .getEntryName ());
108
- if (entry == null ) {
109
- throw new IOException ("Zip entry not found: " + zipRef );
110
- }
111
- try (InputStream inputStream = entry .getInputStream ()) {
112
- return decoder .decode (entry .getUncompressedSize (), inputStream );
113
- }
114
- }
115
106
}
116
107
} catch (Exception e ) {
117
108
throw new JadxException ("Error decode: " + rf .getOriginalName (), e );
@@ -194,7 +185,7 @@ private void loadFile(List<ResourceFile> list, File file) {
194
185
}
195
186
196
187
// Try to load the resources with a custom loader first
197
- for (CustomResourcesLoader loader : jadxRef .getCustomResourcesLoaders ()) {
188
+ for (CustomResourcesLoader loader : decompiler .getCustomResourcesLoaders ()) {
198
189
if (loader .load (this , list , file )) {
199
190
LOG .debug ("Custom loader used for {}" , file .getAbsolutePath ());
200
191
return ;
@@ -207,13 +198,19 @@ private void loadFile(List<ResourceFile> list, File file) {
207
198
208
199
public void defaultLoadFile (List <ResourceFile > list , File file , String subDir ) {
209
200
if (FileUtils .isZipFile (file )) {
210
- jadxRef .getZipReader ().visitEntries (file , entry -> {
211
- addEntry (list , file , entry , subDir );
212
- return null ;
213
- });
201
+ try {
202
+ ZipContent zipContent = decompiler .getZipReader ().open (file );
203
+ // do not close a zip now, entry content will be read later
204
+ decompiler .addCloseable (zipContent );
205
+ for (IZipEntry entry : zipContent .getEntries ()) {
206
+ addEntry (list , file , entry , subDir );
207
+ }
208
+ } catch (Exception e ) {
209
+ throw new RuntimeException ("Failed to open zip file: " + file .getAbsolutePath (), e );
210
+ }
214
211
} else {
215
212
ResourceType type = ResourceType .getFileType (file .getAbsolutePath ());
216
- list .add (ResourceFile .createResourceFile (jadxRef , file , type ));
213
+ list .add (ResourceFile .createResourceFile (decompiler , file , type ));
217
214
}
218
215
}
219
216
@@ -223,9 +220,9 @@ public void addEntry(List<ResourceFile> list, File zipFile, IZipEntry entry, Str
223
220
}
224
221
String name = entry .getName ();
225
222
ResourceType type = ResourceType .getFileType (name );
226
- ResourceFile rf = ResourceFile .createResourceFile (jadxRef , subDir + name , type );
223
+ ResourceFile rf = ResourceFile .createResourceFile (decompiler , subDir + name , type );
227
224
if (rf != null ) {
228
- rf .setZipRef ( new ZipRef ( zipFile , name ) );
225
+ rf .setZipEntry ( entry );
229
226
list .add (rf );
230
227
}
231
228
}
@@ -238,7 +235,7 @@ public static ICodeInfo loadToCodeWriter(InputStream is) throws IOException {
238
235
239
236
private synchronized BinaryXMLParser loadBinaryXmlParser () {
240
237
if (binaryXmlParser == null ) {
241
- binaryXmlParser = new BinaryXMLParser (jadxRef .getRoot ());
238
+ binaryXmlParser = new BinaryXMLParser (decompiler .getRoot ());
242
239
}
243
240
return binaryXmlParser ;
244
241
}
0 commit comments