stone.sample.DecodeTool.java Source code

Java tutorial

Introduction

Here is the source code for stone.sample.DecodeTool.java

Source

package stone.sample;

import java.io.Console;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DecodeTool {
    public static void main(String[] args) throws IOException, InterruptedException {
        //System.out.println("decode tool main");
        CommandLineParser parser = new PosixParser();
        CommandLine commandLine = null;

        // load options
        _Options();

        try {
            commandLine = parser.parse(allOptions, args, false);
        } catch (ParseException ex) {
            System.err.println(ex.getMessage());
            //usage(commandLine);
            return;
        }

        boolean cmdFound = false;

        for (int i = 0; i < commandLine.getArgs().length; i++) {
            String opt = commandLine.getArgs()[i];
            if (opt.equalsIgnoreCase("b") || opt.equalsIgnoreCase("build")) {
                cmdBuild(commandLine);
                cmdFound = true;
            } else if (opt.equalsIgnoreCase("r") || opt.equalsIgnoreCase("read")) {
                cmdRead(commandLine);
                cmdFound = true;
            }
        }
        if (cmdFound == false) {
            if (commandLine.hasOption("version") || commandLine.hasOption("version")) {
                _version();
            } else {
                usage(commandLine);
            }
        }
    }

    private static void cmdRead(CommandLine cli) {
        String[] args = cli.getArgs();
        String appDirName = args.length < 2 ? "." : args[1];
        File file = new File(appDirName);
        if (!file.exists() && !file.isDirectory()) {
            System.out.println(":" + file + ",?");
            return;
        }
        String xmlPath = appDirName + "/AndroidManifest.xml";
        DOMParser parser = new DOMParser();
        Document document = parser.parse(xmlPath);
        parser.parseRootNode(document);
        System.out.println(parser.pack);

        //get root element 
        Element rootElement = document.getDocumentElement();
        NodeList application = rootElement.getElementsByTagName("application");

        System.out.println("cmdRead....................");
        NodeList nodes = application.item(0).getChildNodes();
        // print activites
        // NodeList nodes = rootElement.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {

            Node node = nodes.item(i);
            //System.out.println(node.getNodeName());
            if (node.getNodeName().equals("activity")) {
                //activiy?android:name?
                EntryActivity activity = new EntryActivity();
                activity.setName(node.getAttributes().getNamedItem("android:name").getNodeValue());
                activity.setData(node);
                parser.parseActivity(node, activity);
                //              HashMap children = parser.parseChildNodes(node);

                //              if(parser.containsKey(children, "intent-filter")){
                //                 activity.setMain(true);
                //              }
                //              Iterator iterator = children.entrySet().iterator();
                //              while (iterator.hasNext()) {
                //                 Map.Entry entry = (Entry) iterator.next();
                //               Node xmlnode = (Node) entry.getValue();
                //               System.out.println("---"+xmlnode.getNodeName());
                //            }

                //System.out.println("--ismain"+activity.isMain());
                if (activity.getFilters().size() > 0) {
                    //System.out.println("--filtername"+activity.getFilters().get(0).getName());
                }

                parser.names.put(activity.getName(), activity);

            }

            NamedNodeMap attrs = node.getAttributes();
            if (attrs != null) {
                for (int j = 0; j < attrs.getLength(); j++) {
                    Attr attribute = (Attr) attrs.item(j);
                    //System.out.println("+" + attribute.getName()+" = "+attribute.getValue());
                }
            } else {
                //System.out.println("-" + node.getNodeName());
            }

            //           if (node.getNodeType() == Node.ELEMENT_NODE) {   
            //              Element child = (Element) node; 
            //              System.out.println(child.getNodeValue());
            //              //process child element 
            //           } 
        }
        //----------??
        if (cli.hasOption("p")) {
            String newName = cli.getOptionValue("p");
            parser.changePackage(document, newName);
            //return;
        }
        //----------SplashActivity
        LogUtil.info("==SplashActivity==");
        LogUtil.info("..");
        parser.addActivity(document, "net.stone.SplashActivity");
        parser.switchMain(document, "net.stone.SplashActivity");

        //act.setAsMainActivity();

        //----------

    }

    private static void cmdBuild(CommandLine cli) {
        String[] args = cli.getArgs();
        String appDirName = args.length < 2 ? "." : args[1];
        //        File outFile = null;
        //        if (cli.hasOption("o") || cli.hasOption("output")) {
        //            outFile = new File(cli.getOptionValue("o"));
        //        }
        //ApkOptions apkOptions = new ApkOptions();
        String cmdString = "java -jar apktool_2.0.3.jar b " + appDirName;
        Command.exeCmd(cmdString);
        //new Androlib(apkOptions).build(new File(appDirName), outFile);

    }

    private static void usage(CommandLine commandLine) {

        // load basicOptions
        _Options();
        HelpFormatter formatter = new HelpFormatter();
        formatter.setWidth(120);

        // print out license info prior to formatter.
        System.out.println("Apktool v" + _getVersion() + " - a tool for reengineering Android apk files\n" +
        // "with smali v" + ApktoolProperties.get("smaliVersion") +
        //  " and baksmali v" + ApktoolProperties.get("baksmaliVersion") + "\n" +
                "Copyright 2016 Sidney <sidney9111@gmail.com>\n" + "");
        formatter.printHelp("apktool ", allOptions);
        formatter.printHelp("apktool g", allOptions);

    }

    private static String _getVersion() {
        return "0.0.1";
    }

    private static void _version() {
        System.out.println(_getVersion());
    }

    private static void _Options() {

        // create options
        Option versionOption = OptionBuilder.withLongOpt("version").withDescription("prints the version then exits")
                .create("version");
        allOptions.addOption(versionOption);

        Option packChangeOption = Option.builder("p").required(false).longOpt("packchange")
                .desc("change AndroidManifest.xml package name").hasArg(true).build();
        allOptions.addOption(packChangeOption);
    }

    private final static Options allOptions;
    static {
        //normal and advance usage output
        //        normalOptions = new Options();
        //        BuildOptions = new Options();
        //        DecodeOptions = new Options();
        //        frameOptions = new Options();
        allOptions = new Options();
        //        emptyOptions = new Options();
    }
}