public static DexFile addField(DexFile dexFile, final String className, final Field field) { DexRewriter rewriter = new DexRewriter(new RewriterModule() { @Nonnull @Override return rewriter.rewriteDexFile(dexFile);
@Override @Nonnull public Set<? extends ClassDef> getClasses() { return RewriterUtils.rewriteSet(getClassDefRewriter(), dexFile.getClasses()); }
@Nonnull @Override public DexFile rewriteDexFile(@Nonnull DexFile dexFile) { try { return org.jf.dexlib2.immutable.ImmutableDexFile.of(super.rewriteDexFile(dexFile)); } catch (Exception e) { LLog.i("Failed to re-construct dex " + e); if (e instanceof NullPointerException || e instanceof ArrayIndexOutOfBoundsException) { LLog.ex(e); } } return new FailedDexFile(); }
@Override @Nonnull public Set<? extends ClassDef> getClasses() { return RewriterUtils.rewriteSet(getClassDefRewriter(), dexFile.getClasses()); } }
@Nonnull public static DexFile[] unquicken(@Nonnull Vdex vdex, @Nullable Opcodes opcodes) { if (opcodes == null) { opcodes = DexUtil.getOpcodes(Oat.Version.O_80.api); } VdexRewriterModule previousModule = null; final DexFile[] mDeodexedFiles = new DexFile[vdex.dexFiles.length]; for (int i = 0; i < mDeodexedFiles.length; i++) { final VdexRewriterModule rewriterModule; if (vdex.isSingleQuickeningInfo && previousModule != null) { // All dex files share the same iterator. rewriterModule = new VdexRewriterModule(vdex.dexFiles[i], previousModule); } else { rewriterModule = new VdexRewriterModule(vdex.dexFiles[i], opcodes); } final DexRewriter vdexRewriter = new DexRewriter(rewriterModule); mDeodexedFiles[i] = ImmutableDexFile.of( vdexRewriter.rewriteDexFile(rewriterModule.mDex)); previousModule = rewriterModule; if (VdexRewriterModule.DEBUG) { rewriterModule.fillLastInfo(); rewriterModule.printUnquickenInfo(); } } return mDeodexedFiles; }
@Override @Nonnull public Set<? extends ClassDef> getClasses() { return RewriterUtils.rewriteSet(getClassDefRewriter(), dexFile.getClasses()); }