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 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); } }
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); } }
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; } }