assert end != -1; String styleable = s.substring(start, end).trim(); mModel.addResource(ResourceType.DECLARE_STYLEABLE, styleable, null); mModel.addResource(ResourceType.STYLEABLE, styleable, null); assert end != -1; String value = s.substring(start, end).trim(); mModel.addResource(type, name, value);
private void dumpReferences() { if (mDebugPrinter != null) { mDebugPrinter.print(mModel.dumpReferences()); } }
if (!mModel.isSafeMode()) { for (Resource resource : mModel.getResources()) { String name = resource.name; names.add(name); Resource resource = mModel.getResourceFromFilePath(string); if (resource != null) { ResourceUsageModel.markReachable(resource); String name = string.substring(start, dot != -1 ? dot : string.length()); if (names.contains(name)) { for (Map<String, Resource> map : mModel.getResourceMaps()) { resource = map.get(name); if (mDebug && resource != null) { for (Resource resource : mModel.getResources()) { if (resource.name.startsWith(name)) { if (mDebugPrinter != null) { for (Resource resource : mModel.getResources()) { if (pattern.matcher(resource.name).matches()) { if (mDebugPrinter != null) { Resource resource = mModel.getResource(type, name); if (mDebug && resource != null) { mDebugPrinter.println("Marking " + resource + " used because it " for (Map<String, Resource> map : mModel.getResourceMaps()) {
for (ResourceType type : types) { if (type != ResourceType.ID) { Resource resource = mModel.getResource(type, name); if (resource != null) { return resource;
/** Invoked when an ASM visitor encounters a constant: record corresponding reference */ private void handleCodeConstant(@Nullable Object cst, @NonNull String context) { if (cst instanceof Integer) { Integer value = (Integer) cst; Resource resource = mModel.getResource(value); if (ResourceUsageModel.markReachable(resource) && mDebug) { mDebugPrinter.println("Marking " + resource + " reachable: referenced from " + context + " in " + mJarFile + ":" + mCurrentClass); } } else if (cst instanceof int[]) { int[] values = (int[]) cst; for (int value : values) { Resource resource = mModel.getResource(value); if (ResourceUsageModel.markReachable(resource) && mDebug) { mDebugPrinter.println("Marking " + resource + " reachable: referenced from " + context + " in " + mJarFile + ":" + mCurrentClass); } } } else if (cst instanceof String) { String string = (String) cst; referencedString(string); } } }
private void recordResources(@NonNull ResourceFolderType folderType, File folder) throws ParserConfigurationException, SAXException, IOException { File[] files = folder.listFiles(); if (files != null) { for (File file : files) { String path = file.getPath(); mModel.file = file; try { boolean isXml = endsWithIgnoreCase(path, DOT_XML); if (isXml) { String xml = Files.toString(file, UTF_8); Document document = XmlUtils.parseDocument(xml, true); mModel.visitXmlDocument(file, folderType, document); } else { mModel.visitBinaryResource(folderType, file); } } finally { mModel.file = null; } } } }
@VisibleForTesting @Nullable Resource getResourceFromCode(@NonNull String owner, @NonNull String name) { Pair<ResourceType, Map<String, String>> pair = mResourceObfuscation.get(owner); if (pair != null) { ResourceType type = pair.getFirst(); Map<String, String> nameMap = pair.getSecond(); String renamedField = nameMap.get(name); if (renamedField != null) { name = renamedField; } return mModel.getResource(type, name); } return null; }
public void analyze() throws IOException, ParserConfigurationException, SAXException { gatherResourceValues(mResourceClassDir); recordMapping(mProguardMapping); recordClassUsages(mClasses); recordManifestUsages(mMergedManifest); recordResources(mMergedResourceDir); keepPossiblyReferencedResources(); dumpReferences(); mModel.processToolsAttributes(); mUnused = mModel.findUnused(); }