Search in sources :

Example 1 with DexFile

use of org.jf.dexlib.DexFile in project otertool by wuntee.

the class SmaliWorkshop method buildDex.

private static void buildDex(File smaliSourceDirectory, File destination) throws RecognitionException, SmaliSyntaxException, SmaliDexException, IOException {
    DexFile dexFile = new DexFile();
    // Load files into set
    logger.debug("Loading smali files");
    LinkedHashSet<File> filesToProcess = new LinkedHashSet<File>();
    getSmaliFilesInDir(smaliSourceDirectory, filesToProcess);
    // Process each file
    logger.debug("Processing files");
    for (File file : filesToProcess) {
        logger.debug("Processing: " + file.getAbsolutePath());
        FileInputStream fis = new FileInputStream(file.getAbsolutePath());
        InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
        LexerErrorInterface lexer = new smaliFlexLexer(reader);
        ((smaliFlexLexer) lexer).setSourceFile(file);
        CommonTokenStream tokens = new CommonTokenStream((TokenSource) lexer);
        smaliParser parser = new smaliParser(tokens);
        smaliParser.smali_file_return result = parser.smali_file();
        // Errors
        if (parser.getNumberOfSyntaxErrors() > 0) {
            throw new SmaliSyntaxException(file, parser.getNumberOfSyntaxErrors());
        }
        if (lexer.getNumberOfSyntaxErrors() > 0) {
            throw new SmaliSyntaxException(file, lexer.getNumberOfSyntaxErrors());
        }
        CommonTree t = (CommonTree) result.getTree();
        CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t);
        treeStream.setTokenStream(tokens);
        smaliTreeWalker dexGen = new smaliTreeWalker(treeStream);
        dexGen.dexFile = dexFile;
        dexGen.smali_file();
        if (dexGen.getNumberOfSyntaxErrors() > 0) {
            throw new SmaliDexException(file, dexGen.getNumberOfSyntaxErrors());
        }
    }
    // Calculate signatures and write file
    logger.debug("Writing dex file.");
    dexFile.place();
    ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput();
    dexFile.writeTo(out);
    byte[] bytes = out.toByteArray();
    DexFile.calcSignature(bytes);
    DexFile.calcChecksum(bytes);
    FileOutputStream fileOutputStream = new FileOutputStream(destination);
    fileOutputStream.write(bytes);
    fileOutputStream.close();
}
Also used : LinkedHashSet(java.util.LinkedHashSet) CommonTokenStream(org.antlr.runtime.CommonTokenStream) InputStreamReader(java.io.InputStreamReader) CommonTree(org.antlr.runtime.tree.CommonTree) SmaliDexException(com.wuntee.oter.exception.SmaliDexException) ByteArrayAnnotatedOutput(org.jf.dexlib.Util.ByteArrayAnnotatedOutput) SmaliSyntaxException(com.wuntee.oter.exception.SmaliSyntaxException) org.jf.smali.smaliFlexLexer(org.jf.smali.smaliFlexLexer) DexFile(org.jf.dexlib.DexFile) FileInputStream(java.io.FileInputStream) org.jf.smali.smaliParser(org.jf.smali.smaliParser) FileOutputStream(java.io.FileOutputStream) org.jf.smali.smaliTreeWalker(org.jf.smali.smaliTreeWalker) LexerErrorInterface(org.jf.smali.LexerErrorInterface) File(java.io.File) DexFile(org.jf.dexlib.DexFile) CommonTreeNodeStream(org.antlr.runtime.tree.CommonTreeNodeStream)

Example 2 with DexFile

use of org.jf.dexlib.DexFile in project otertool by wuntee.

the class SmaliWorkshop method getSmaliSource.

public static Map<String, File> getSmaliSource(File sourceSmaliOrDexFile, File destinationDirectory) throws IOException {
    Map<String, File> ret = new HashMap<String, File>();
    DexFile dexFile = new DexFile(sourceSmaliOrDexFile);
    IndentingWriter idWriter;
    for (ClassDefItem c : dexFile.ClassDefsSection.getItems()) {
        File classFile = SmaliWorkshop.createSmaliClassFile(destinationDirectory, c);
        String className = SmaliWorkshop.classDefItemToFilename(c);
        logger.debug("Got class: " + className + " [" + classFile + "]");
        BufferedWriter fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(classFile)));
        idWriter = new IndentingWriter(fileWriter);
        ClassDefinition cd = new ClassDefinition(c);
        cd.writeTo(idWriter);
        ret.put(className, classFile);
        idWriter.close();
    }
    return (sortMapByKey(ret));
}
Also used : ClassDefItem(org.jf.dexlib.ClassDefItem) HashMap(java.util.HashMap) FileOutputStream(java.io.FileOutputStream) IndentingWriter(org.jf.util.IndentingWriter) OutputStreamWriter(java.io.OutputStreamWriter) ClassDefinition(org.jf.baksmali.Adaptors.ClassDefinition) File(java.io.File) DexFile(org.jf.dexlib.DexFile) DexFile(org.jf.dexlib.DexFile) BufferedWriter(java.io.BufferedWriter)

Aggregations

File (java.io.File)2 FileOutputStream (java.io.FileOutputStream)2 DexFile (org.jf.dexlib.DexFile)2 SmaliDexException (com.wuntee.oter.exception.SmaliDexException)1 SmaliSyntaxException (com.wuntee.oter.exception.SmaliSyntaxException)1 BufferedWriter (java.io.BufferedWriter)1 FileInputStream (java.io.FileInputStream)1 InputStreamReader (java.io.InputStreamReader)1 OutputStreamWriter (java.io.OutputStreamWriter)1 HashMap (java.util.HashMap)1 LinkedHashSet (java.util.LinkedHashSet)1 CommonTokenStream (org.antlr.runtime.CommonTokenStream)1 CommonTree (org.antlr.runtime.tree.CommonTree)1 CommonTreeNodeStream (org.antlr.runtime.tree.CommonTreeNodeStream)1 ClassDefinition (org.jf.baksmali.Adaptors.ClassDefinition)1 ClassDefItem (org.jf.dexlib.ClassDefItem)1 ByteArrayAnnotatedOutput (org.jf.dexlib.Util.ByteArrayAnnotatedOutput)1 LexerErrorInterface (org.jf.smali.LexerErrorInterface)1 org.jf.smali.smaliFlexLexer (org.jf.smali.smaliFlexLexer)1 org.jf.smali.smaliParser (org.jf.smali.smaliParser)1