public ClassFileNameHandler(File path, String fileExtension) { this.top = new PackageNameEntry(path); this.fileExtension = fileExtension; this.modifyWindowsReservedFilenames = testForWindowsReservedFileNames(path); }
public static File disassemble(File smaliDir, DexBackedClassDef dexBackedClassDef) throws PatchException { Set<DexBackedClassDef> classes = Sets.newHashSet(); classes.add(dexBackedClassDef); final ClassFileNameHandler outFileNameHandler = new ClassFileNameHandler(smaliDir, ".smali"); final ClassFileNameHandler inFileNameHandler = new ClassFileNameHandler(smaliDir, ".smali"); String className = dexBackedClassDef.getType(); AfBakSmali.disassembleClass(dexBackedClassDef, outFileNameHandler, getBuildOption(classes, 19), true, false); File smaliFile = inFileNameHandler.getUniqueFilenameForClass(className); return smaliFile; }
final ClassFileNameHandler fileNameHandler = new ClassFileNameHandler(outputDir, ".smali");
File smaliFile = fileNameHandler.getUniqueFilenameForClass(classDescriptor);
if (modifyWindowsReservedFilenames && isReservedFileName(packageElement)) { packageElement += "#"; int utf8Length = utf8Length(packageElement); if (utf8Length > MAX_FILENAME_LENGTH) { packageElement = shortenPathComponent(packageElement, utf8Length - MAX_FILENAME_LENGTH); if (modifyWindowsReservedFilenames && isReservedFileName(packageElement)) { packageElement += "#"; int utf8Length = utf8Length(packageElement) + utf8Length(fileExtension); if (utf8Length > MAX_FILENAME_LENGTH) { packageElement = shortenPathComponent(packageElement, utf8Length - MAX_FILENAME_LENGTH);
@Nonnull public String getNormalizedName(boolean preserveCase) { String elementName = logicalName; if (!preserveCase && parent != null && !parent.isCaseSensitive()) { elementName = elementName.toLowerCase(); } if (modifyWindowsReservedFilenames && isReservedFileName(elementName)) { elementName = addSuffixBeforeExtension(elementName, "#"); } int utf8Length = utf8Length(elementName); if (utf8Length > getMaxFilenameLength()) { elementName = shortenPathComponent(elementName, utf8Length - getMaxFilenameLength()); } return elementName; }
private static int utf8Length(String str) { int utf8Length = 0; int i=0; while (i<str.length()) { int c = str.codePointAt(i); utf8Length += utf8Length(c); i += Character.charCount(c); } return utf8Length; }
return addUniqueChild(top, packageElements, 0);
public static Set<DexBackedClassDef> scanClasses(File smaliDir, List<File> newFiles) throws PatchException { Set<DexBackedClassDef> classes = Sets.newHashSet(); try { for (File newFile : newFiles) { DexBackedDexFile newDexFile = DexFileFactory.loadDexFile(newFile, 19, true); Set<? extends DexBackedClassDef> dexClasses = newDexFile.getClasses(); classes.addAll(dexClasses); } final ClassFileNameHandler outFileNameHandler = new ClassFileNameHandler(smaliDir, ".smali"); final ClassFileNameHandler inFileNameHandler = new ClassFileNameHandler(smaliDir, ".smali"); for (DexBackedClassDef classDef : classes) { String className = classDef.getType(); ApkPatch.currentClassType = null; AfBakSmali.disassembleClass(classDef, outFileNameHandler, getBuildOption(classes, 19), true, true); File smaliFile = inFileNameHandler.getUniqueFilenameForClass(className); } } catch (Exception e) { throw new PatchException(e); } return classes; }
final ClassFileNameHandler fileNameHandler = new ClassFileNameHandler(outputDir, ".smali");
File smaliFile = fileNameHandler.getUniqueFilenameForClass(classDescriptor);
@Test public void test1ByteEncodings() { StringBuilder sb = new StringBuilder(); for (int i=0; i<100; i++) { sb.append((char)i); } String result = ClassFileNameHandler.shortenPathComponent(sb.toString(), 5); Assert.assertEquals(95, result.getBytes(UTF8).length); Assert.assertEquals(95, result.length()); }
private static int utf8Length(String str) { int utf8Length = 0; int i=0; while (i<str.length()) { int c = str.codePointAt(i); utf8Length += utf8Length(c); i += Character.charCount(c); } return utf8Length; }
@Nonnull private File addUniqueChild(@Nonnull DirectoryEntry parent, @Nonnull String[] packageElements, int packageElementIndex) { if (packageElementIndex == packageElements.length - 1) { FileEntry fileEntry = new FileEntry(parent, packageElements[packageElementIndex] + fileExtension); parent.addChild(fileEntry); String physicalName = fileEntry.getPhysicalName(); // the physical name should be set when adding it as a child to the parent assert physicalName != null; return new File(parent.file, physicalName); } else { DirectoryEntry directoryEntry = new DirectoryEntry(parent, packageElements[packageElementIndex]); directoryEntry = (DirectoryEntry)parent.addChild(directoryEntry); return addUniqueChild(directoryEntry, packageElements, packageElementIndex+1); } }
@Test public void testCaseSensitiveFilesystem() { File tempDir = Files.createTempDir(); ClassFileNameHandler handler = new ClassFileNameHandler(tempDir, ".smali", true, false); File file = handler.getUniqueFilenameForClass("La/b/c;"); checkFilename(tempDir, file, "a", "b", "c.smali"); file = handler.getUniqueFilenameForClass("La/b/C;"); checkFilename(tempDir, file, "a", "b", "C.smali"); file = handler.getUniqueFilenameForClass("La/B/c;"); checkFilename(tempDir, file, "a", "B", "c.smali"); }
final ClassFileNameHandler fileNameHandler = new ClassFileNameHandler(outputDirectoryFile, ".smali");
File smaliFile = fileNameHandler.getUniqueFilenameForClass(classDescriptor);
@Test public void test2ByteEncodings() { StringBuilder sb = new StringBuilder(); for (int i=0x80; i<0x80+100; i++) { sb.append((char)i); } // remove a total of 3 2-byte characters, and then add back in the 1-byte '#' String result = ClassFileNameHandler.shortenPathComponent(sb.toString(), 4); Assert.assertEquals(200, sb.toString().getBytes(UTF8).length); Assert.assertEquals(195, result.getBytes(UTF8).length); Assert.assertEquals(98, result.length()); // remove a total of 3 2-byte characters, and then add back in the 1-byte '#' result = ClassFileNameHandler.shortenPathComponent(sb.toString(), 5); Assert.assertEquals(200, sb.toString().getBytes(UTF8).length); Assert.assertEquals(195, result.getBytes(UTF8).length); Assert.assertEquals(98, result.length()); }
int bytesRemoved = utf8Length(codePoints[midPoint]); bytesRemoved += utf8Length(codePoints[secondStart]); secondStart++; if (firstEnd > 0) { firstEnd--; bytesRemoved += utf8Length(codePoints[firstEnd]); bytesRemoved += utf8Length(codePoints[secondStart]); secondStart++;
public ClassFileNameHandler(File path, String fileExtension) { this.top = new PackageNameEntry(path); this.fileExtension = fileExtension; this.modifyWindowsReservedFilenames = testForWindowsReservedFileNames(path); }