/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package util.build; import dasm.DAsm; import dasm.DasmError; import dasm.Utils; import java.io.BufferedReader; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; class DasmBuildStep extends BuildStep { boolean generate_linenum = false; DasmBuildStep(BuildFile inputFile, BuildFile outputFile) { super(inputFile, outputFile); } @Override boolean build() { if (super.build()) { return assemble(inputFile.fileName); } return false; } private static Reader createReader(String fname) throws IOException { FileInputStream fs = new FileInputStream(fname); InputStreamReader ir; ir = new InputStreamReader(fs); return new BufferedReader(ir); } private boolean assemble(File file) { DAsm dAsm = new DAsm(); String fname = file.getAbsolutePath(); // read and parse .d file Reader inp = null; try { inp = createReader(fname); dAsm.readD(inp, new File(fname).getName(), generate_linenum); close(inp); } catch(DasmError e) { if(BuildDalvikSuite.DEBUG) e.printStackTrace(); System.err.println("DASM Error: " + e.getMessage()); } catch(Exception e) { if(BuildDalvikSuite.DEBUG) e.printStackTrace(); System.err.println("Exception <" + e.getClass().getName() + ">" + e.getMessage() + " while reading and parsing " + fname); return false; } finally { close(inp); } if(dAsm.errorCount() > 0) { System.err.println("Found " + dAsm.errorCount() + " errors " + " while reading and parsing " + fname); return false; } String class_path[] = Utils.getClassFieldFromString(dAsm.getClassName()); String class_name = class_path[1]; // determine where to place .dex file String dest_dir = outputFile.folder.getAbsolutePath(); if (class_path[0] != null) { String class_dir = class_path[0].replaceAll("/|\\.", Character.toString(File.separatorChar)); if (dest_dir != null) { dest_dir = dest_dir + File.separator + class_dir; } else { dest_dir = class_dir; } } File out_file = null; if (dest_dir == null) { out_file = new File(class_name + ".dex"); } else { out_file = new File(dest_dir, class_name + ".dex"); // check that dest_dir exists File dest = new File(dest_dir); if (!dest.exists()) { dest.mkdirs(); } if (!dest.isDirectory()) { System.err.println("Cannot create directory " + dest_dir); return false; } } // write output FileOutputStream outp = null; try { outp = new FileOutputStream(out_file); dAsm.write(outp, null); } catch(Exception e) { if(BuildDalvikSuite.DEBUG) e.printStackTrace(); System.err.println("Exception <" + e.getClass().getName() + ">" + e.getMessage() + " while writing " + out_file.getPath()); close(outp); out_file.delete(); return false; } finally { close(outp); } return true; } private static void close(Closeable c) { if(c == null) return; try { c.close(); } catch(IOException e) { } } @Override public boolean equals(Object obj) { if (super.equals(obj)) { DasmBuildStep other = (DasmBuildStep) obj; return inputFile.equals(other.inputFile) && generate_linenum == other.generate_linenum && outputFile.equals(other.outputFile); } return false; } @Override public int hashCode() { return inputFile.hashCode() ^ outputFile.hashCode() ^ (generate_linenum ? 31 : 37); } }