@Nonnull @Override public String getDefiningClass() { return classDef.getType(); } @Override public int getAccessFlags() { return accessFlags; }
String type = def.getType(); System.out.println(type); DexClassNode dexClassNode = map.get(type);
public static DexBackedClassDef getModifiedClasses(String clazz) { for (DexBackedClassDef classDef : modifiedClasses) { if (classDef.getType().equals(clazz)) { return classDef; } } return null; }
@Nonnull @Override public String getDefiningClass() { return classDef.getType(); } @Override public int getAccessFlags() { return accessFlags; }
@Nonnull @Override public String getDefiningClass() { return classDef.getType(); } @Override public int getAccessFlags() { return accessFlags; }
public void addModifiedMethods(DexBackedMethod method) throws PatchException { System.out.println("add modified Method:" + method.getReturnType() + " " + method.getName() + "(" + Formater.formatStringList(method.getParameterTypes()) + ") in Class:" + method.getDefiningClass()); this.modifiedMethods.add(method); if (!modifiedClasses.contains(method.classDef)) { modifiedClasses.add(method.classDef); String className = method.classDef.getType(); addManifestModifiedClass(className); } }
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; }
/** * scan base Dex,get base Dex info */ private void scanBaseDexFile() throws IOException { for (File baseDexFile : baseDexFiles) { DexBackedDexFile baseBackedDexFile = DexFileFactory.loadDexFile(baseDexFile, apiLevel, true); final Set<? extends DexBackedClassDef> baseClassDefs = baseBackedDexFile.getClasses(); dexDiffInfo.setOldClasses(baseClassDefs); for (DexBackedClassDef baseClassDef : baseClassDefs) { String className = getDalvikClassName(baseClassDef.getType()); baseClassDefMap.put(className, baseClassDef); } } }
public static Set<String> buildCode(File smaliDir, File dexFile, DexDiffInfo info) throws IOException, RecognitionException { Set<String> classes = new HashSet<String>(); Set<DexBackedClassDef> classDefs = new HashSet<DexBackedClassDef>(); classDefs.addAll(info.getModifiedClasses()); classDefs.addAll(info.getAddedClasses()); final ClassFileNameHandler outFileNameHandler = new ClassFileNameHandler(smaliDir, ".smali"); final ClassFileNameHandler inFileNameHandler = new ClassFileNameHandler(smaliDir, ".smali"); DexBuilder dexBuilder = DexBuilder.makeDexBuilder(); File smaliFile; String className; for (DexBackedClassDef classDef : classDefs) { ApkPatch.currentClassType = classDef.getType(); className = TypeGenUtil.newType(classDef.getType()); AfBakSmali.disassembleClass(classDef, outFileNameHandler, getBuildOption(classDefs, 19), false, false); smaliFile = inFileNameHandler.getUniqueFilenameForClass(className); classes.add(className.substring(1, className.length() - 1).replace('/', '.')); SmaliMod.assembleSmaliFile(smaliFile, dexBuilder, true, true); } dexBuilder.writeTo(new FileDataStore(dexFile)); return classes; }
if (filter.isFiltered(newClassDef.getType())) { System.out.println("filter class:"+newClassDef.getType()); continue; String className = getDalvikClassName(newClassDef.getType()); if (!tpatch&&exludeClasses.contains(newClassDef.getType())){ continue; if (lastBundleClassMap.containsKey(newClassDef.getType())&&tpatch){ System.out.println("overide class:"+className); ClassDiffInfo classDiffInfo = new ClassDiffInfo();
public static void getClassAnnotaionPrepareClasses(DexBackedClassDef classDef, Set<String> prepareclasses,DexDiffInfo dexDiffInfo){ if (classDef.getType().equals(modifyClasses.getType())){ if (classDef.getAnnotations()!= null){ Set<? extends DexBackedAnnotation>annotations = classDef.getAnnotations();
for (DexBackedClassDef classDef : classes) { currentClassType = null; String className = TypeGenUtil.newType(classDef.getType());
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; }
public void update() throws PatchException { if (classDiffInfoMap.size() > 0) { for (ClassDiffInfo classDiffInfo : classDiffInfoMap.values()) { for (MethodDiffInfo methodDiffInfo : classDiffInfo.getModifyMethods()) { if (methodDiffInfo.getType().equals(DiffType.MODIFY)) { addModifiedMethods(methodDiffInfo.getBackedMethod()); } } if (classDiffInfo.getType().equals(DiffType.ADD)) { setAddedClasses(classDiffInfo.getClassDef()); addManifestAddClass(classDiffInfo.getClassDef().getType()); } } } } }
public static void addField(String inFile, String outFile, DexBackedClassDef dexBackedClassDef, ImmutableField immutableField) throws IOException { DexFile dexFile = readDexFile(inFile); for (ClassDef classDef : dexFile.getClasses()) { if (dexBackedClassDef != null && dexBackedClassDef.getType().equals(classDef.getType())) { dexFile = addField(dexFile, classDef.getType(), immutableField); } else if (dexBackedClassDef == null) { dexFile = addField(dexFile, classDef.getType(), immutableField); } } reDexFile(dexFile); DexFileFactory.writeDexFile(outFile, new DexFile() { @Nonnull @Override public Set<? extends ClassDef> getClasses() { return new AbstractSet<ClassDef>() { @Nonnull @Override public Iterator<ClassDef> iterator() { return classes.iterator(); } @Override public int size() { return classes.size(); } }; } }); }
String className = null; if (null == baseClassDef && null != newClassDef) { className = getDalvikClassName(newClassDef.getType()); classDiffInfo.setName(className); classDiffInfo.setClassDef(newClassDef); classDiffInfo.setType(DiffType.ADD); } else if (null != baseClassDef && null == newClassDef) { className = getDalvikClassName(baseClassDef.getType()); classDiffInfo.setName(className); classDiffInfo.setClassDef(baseClassDef); classDiffInfo.setType(DiffType.REMOVE); } else {// 比较是否有变更 className = getDalvikClassName(baseClassDef.getType()); classDiffInfo.setName(className); classDiffInfo.setClassDef(newClassDef);