private void saveResourceFile(ResourceFile resFile, File outFile) throws JadxException { ResourcesLoader.decodeStream(resFile, (size, is) -> { try (FileOutputStream fileStream = new FileOutputStream(outFile)) { IOUtils.copy(is, fileStream); } catch (Exception e) { throw new JadxRuntimeException("Resource file save error", e); } return null; }); } }
public List<ResourceFile> getResources() { if (resources == null) { if (root == null) { return Collections.emptyList(); } resources = new ResourcesLoader(this).load(inputFiles); } return resources; }
private void loadFile(List<ResourceFile> list, File file) { if (file == null) { return; } try (ZipFile zip = new ZipFile(file)) { Enumeration<? extends ZipEntry> entries = zip.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); if (ZipSecurity.isValidZipEntry(entry)) { addEntry(list, file, entry); } } } catch (Exception e) { LOG.debug("Not a zip file: {}", file.getAbsolutePath()); addResourceFile(list, file); } }
private String loadCurrentSingleRes(ResContainer rc) { switch (rc.getDataType()) { case TEXT: case RES_TABLE: CodeWriter cw = rc.getText(); lineMapping = cw.getLineMapping(); return cw.toString(); case RES_LINK: try { return ResourcesLoader.decodeStream(rc.getResLink(), (size, is) -> { if (size > 10 * 1024 * 1024L) { return "File too large for view"; } return ResourcesLoader.loadToCodeWriter(is).toString(); }); } catch (Exception e) { return "Failed to load resource file: \n" + jadx.core.utils.Utils.getStackTrace(e); } case DECODED_DATA: default: return "Unexpected resource type: " + rc; } }
static ResContainer loadContent(JadxDecompiler jadxRef, ResourceFile rf) { try { return decodeStream(rf, (size, is) -> loadContent(jadxRef, rf, is)); } catch (JadxException e) { LOG.error("Decode error", e); CodeWriter cw = new CodeWriter(); cw.add("Error decode ").add(rf.getType().toString().toLowerCase()); cw.startLine(Utils.getStackTrace(e.getCause())); return ResContainer.textResource(rf.getName(), cw); } }
public synchronized CodeWriter parse(InputStream inputStream) throws IOException { is = new ParserStream(inputStream); if (!isBinaryXml()) { return ResourcesLoader.loadToCodeWriter(inputStream); } nsMapGenerated = new HashSet<>(); writer = new CodeWriter(); writer.add("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); firstElement = true; decode(); writer.finish(); return writer; }
public ResContainer loadContent() { return ResourcesLoader.loadContent(decompiler, this); }
List<ResourceFile> load(List<InputFile> inputFiles) { List<ResourceFile> list = new ArrayList<>(inputFiles.size()); for (InputFile file : inputFiles) { loadFile(list, file.getFile()); } return list; }
private static ResContainer loadContent(JadxDecompiler jadxRef, ResourceFile rf, InputStream inputStream) throws IOException { switch (rf.getType()) { case MANIFEST: case XML: CodeWriter content = jadxRef.getXmlParser().parse(inputStream); return ResContainer.textResource(rf.getName(), content); case ARSC: return new ResTableParser().decodeFiles(inputStream); case IMG: return decodeImage(rf, inputStream); default: return ResContainer.resourceFileLink(rf); } }
public void loadResources(List<ResourceFile> resources) { ResourceFile arsc = null; for (ResourceFile rf : resources) { if (rf.getType() == ResourceType.ARSC) { arsc = rf; break; } } if (arsc == null) { LOG.debug("'.arsc' file not found"); return; } try { ResourceStorage resStorage = ResourcesLoader.decodeStream(arsc, (size, is) -> { ResTableParser parser = new ResTableParser(); parser.decode(is); return parser.getResStorage(); }); processResources(resStorage); } catch (Exception e) { LOG.error("Failed to parse '.arsc' file", e); } }
private BufferedImage loadImage(JResource res) { ResourceFile resFile = res.getResFile(); ResContainer resContainer = resFile.loadContent(); ResContainer.DataType dataType = resContainer.getDataType(); if (dataType == ResContainer.DataType.DECODED_DATA) { try { return ImageIO.read(new ByteArrayInputStream(resContainer.getDecodedData())); } catch (Exception e) { throw new JadxRuntimeException("Failed to load image", e); } } else if (dataType == ResContainer.DataType.RES_LINK) { try { return ResourcesLoader.decodeStream(resFile, (size, is) -> ImageIO.read(is)); } catch (Exception e) { throw new JadxRuntimeException("Failed to load image", e); } } else { throw new JadxRuntimeException("Unsupported resource image data type: " + resFile); } }