/* * Copyright 2016, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.jf.baksmali; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.google.common.collect.Lists; import org.jf.baksmali.HelpCommand.HlepCommand; import org.jf.util.jcommander.Command; import org.jf.util.jcommander.ExtendedCommands; import org.jf.util.jcommander.ExtendedParameters; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Properties; @ExtendedParameters( includeParametersInUsage = true, commandName = "baksmali", postfixDescription = "See baksmali help <command> for more information about a specific command") public class Main extends Command { public static final String VERSION = loadVersion(); @Parameter(names = {"--help", "-h", "-?"}, help = true, description = "Show usage information") private boolean help; @Parameter(names = {"--version", "-v"}, help = true, description = "Print the version of baksmali and then exit") public boolean version; private JCommander jc; public Main() { super(Lists.<JCommander>newArrayList()); } @Override public void run() { } @Override protected JCommander getJCommander() { return jc; } public static void main(String[] args) { Main main = new Main(); JCommander jc = new JCommander(main); main.jc = jc; jc.setProgramName("baksmali"); List<JCommander> commandHierarchy = main.getCommandHierarchy(); ExtendedCommands.addExtendedCommand(jc, new DisassembleCommand(commandHierarchy)); ExtendedCommands.addExtendedCommand(jc, new DeodexCommand(commandHierarchy)); ExtendedCommands.addExtendedCommand(jc, new DumpCommand(commandHierarchy)); ExtendedCommands.addExtendedCommand(jc, new HelpCommand(commandHierarchy)); ExtendedCommands.addExtendedCommand(jc, new HlepCommand(commandHierarchy)); ExtendedCommands.addExtendedCommand(jc, new ListCommand(commandHierarchy)); jc.parse(args); if (main.version) { version(); } if (jc.getParsedCommand() == null || main.help) { main.usage(); return; } Command command = (Command)jc.getCommands().get(jc.getParsedCommand()).getObjects().get(0); command.run(); } protected static void version() { System.out.println("baksmali " + VERSION + " (http://smali.org)"); System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)"); System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)"); System.exit(0); } private static String loadVersion() { InputStream propertiesStream = Baksmali.class.getClassLoader().getResourceAsStream("baksmali.properties"); String version = "[unknown version]"; if (propertiesStream != null) { Properties properties = new Properties(); try { properties.load(propertiesStream); version = properties.getProperty("application.version"); } catch (IOException ex) { // ignore } } return version; } }