aapt解析apk包

/**
 * @(#) CmdExecute.java Created on 2012-10-30
 *
 * Copyright (c) 2012 Aspire. All Rights Reserved
 */
package com.aspire.mbre.pc.client.common.utils;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.log4j.Logger;

/**
 * The class <code>CmdExecute</code>
 * 
 * @author ouyangfeng
 * @version 1.0
 */
public class CmdExecute {
    
   private static final Logger logger  = Logger.getLogger(CmdExecute.class);

    /**
     * Execute a command
     * 
     * @param cmd
     * @return
     * @throws IOException
     */
    public static CmdResponse exec(String cmd) throws IOException {
        logger.debug("exec cmd:" + cmd);
        ReadInputStream msgReadding = null;
        ReadInputStream errorMsgReadding = null;
        CmdResponse respone = new CmdResponse();
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(cmd);
            // 获取进程的错误流
            errorMsgReadding = new ReadInputStream(process.getErrorStream());
            errorMsgReadding.start();
            // 获取正常流信息
            msgReadding = new ReadInputStream(process.getInputStream());
            msgReadding.start();
            // respone
            respone.setRunSuccess(process.waitFor() == 0);
            respone.setMsg(msgReadding.getMsg());
            respone.setErrorMsg(errorMsgReadding.getMsg());
        } catch (Exception e) {
            respone.setRunSuccess(false);
            respone.setErrorMsg(e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                if (errorMsgReadding != null)
                    errorMsgReadding.toStop();
                if (msgReadding != null)
                    msgReadding.toStop();
                process.destroy();
            } catch (Exception e) {
            }
        }
        return respone;
    }

    /**
     * Execute a command
     * 
     * @param process
     * @param command
     * @return
     */
    public static CmdResponse exec(Process process, String command) {
        ReadInputStream msgReadding = null;
        ReadInputStream errorMsgReadding = null;
        CmdResponse respone = new CmdResponse();
        if (process == null) {
            respone.setRunSuccess(false);
            return respone;
        }
        DataOutputStream dos = null;
        try {
            dos = new DataOutputStream(process.getOutputStream());
            dos.writeBytes(command + "\n");
            dos.writeBytes("exit\n");
            dos.flush();
            // 获取进程的错误流
            errorMsgReadding = new ReadInputStream(process.getErrorStream());
            errorMsgReadding.start();
            // 获取正常流信息
            msgReadding = new ReadInputStream(process.getInputStream());
            msgReadding.start();
            // respone
            respone.setRunSuccess(process.waitFor() == 0);
            respone.setMsg(msgReadding.getMsg());
            respone.setErrorMsg(errorMsgReadding.getMsg());
        } catch (Exception e) {
            respone.setRunSuccess(false);
            respone.setErrorMsg(e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                if (dos != null)
                    dos.close();
                if (errorMsgReadding != null)
                    errorMsgReadding.toStop();
                if (msgReadding != null)
                    msgReadding.toStop();
                process.destroy();
            } catch (Exception e) {
            }
        }
        return respone;
    }

    /**
     * 
     * The class <code>ReadErrorInput</code>
     * 
     * @author wuyanlong
     * @version 1.0
     */
    static class ReadInputStream extends Thread {
        /**
         * Running
         */
        private boolean running = true;
        /**
         * Buffer of reading string
         */
        private StringBuffer readBuffer = new StringBuffer();
        /**
         * BufferedReader
         */
        private BufferedReader readBr;
        private boolean isReading = false;

        /**
         * 
         * Constructor
         * 
         * @param is
         */
        public ReadInputStream(InputStream is) {
            if (is != null)
                readBr = new BufferedReader(new InputStreamReader(is));
        }

        /**
         * (non-Javadoc)
         * 
         * @see java.lang.Thread#run()
         */
        @Override
        public void run() {
            try {
                while (running) {
                    readding();
                    sleep(250);
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                if (readBr != null)
                    try {
                        readBr.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }
            super.run();

        }

        /**
         * Reading
         * 
         * @throws IOException
         */
        private void readding() throws IOException {
            synchronized (this) {
                if (isReading)
                    return;
                isReading = true;
            }
            if (readBr == null)
                return;
            while (readBr.ready()) {
                readBuffer.append(readBr.readLine());
                readBuffer.append("\n");
            }
            synchronized (this) {
                isReading = false;
            }
        }

        /**
         * To stop thread.
         */
        public void toStop() {
            running = false;

        }

        /**
         * 
         * @return
         */
        public String getMsg() {
            try {
                readding();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return readBuffer.toString();
        }
    }

    /**
     * 
     * The class <code>CmdRespone</code>
     * 
     * Return response from execute a command
     * 
     * @author wuyanlong
     * @version 1.0
     */
    public static class CmdResponse {

        /**
         * Succes of Running
         */
        private boolean isRunSuccess;
        /**
         * Message of success or faild
         */
        private String msg;
        /**
         * Error message
         */
        private String errorMsg;

        /**
         * Getter of isRunSuccess cmdexecute进程运行成功
         * 
         * @return the isRunSuccess
         */
        public boolean isRunSuccess() {
            return isRunSuccess;
        }

        /**
         * Setter of isRunSuccess
         * 
         * @param isRunSuccess
         *            the isRunSuccess to set
         */
        public void setRunSuccess(boolean isRunSuccess) {
            this.isRunSuccess = isRunSuccess;
        }

        /**
         * Getter of msg
         * 
         * @return the msg
         */
        public String getMsg() {
            return msg;
        }

        /**
         * Setter of msg
         * 
         * @param msg
         *            the msg to set
         */
        public void setMsg(String msg) {
            this.msg = msg;
        }

        /**
         * Getter of errorMsg
         * 
         * @return the errorMsg
         */
        public String getErrorMsg() {
            return errorMsg;
        }

        /**
         * Setter of errorMsg
         * 
         * @param errorMsg
         *            the errorMsg to set
         */
        public void setErrorMsg(String errorMsg) {
            this.errorMsg = errorMsg;
        }

    }

}
 

 

/**
	 * 解析一个apk的包名,调用前记得加入aapt工具
	 * @param filename
	 * @return 如果解析成功返回包名,不成功返回null
	 * @throws IOException 
	 */
	public static String getApkPackageName(String filename) throws IOException{
	    final StringBuilder cmd = new StringBuilder();
	    cmd.append(Config.ADB_LOCATION)
	    .append("aapt.exe")
	    .append(" d badging ")
	    .append(filename);
	    final CmdResponse response = CmdExecute.exec(cmd.toString());
	    if(response.isRunSuccess()){
	        return getPackageName(response.getMsg());
	    }
	    return null;
	    
	}
	
	/**
	 * 解析出里面的包名
	 * @param str
	 * @return
	 */
	private static String getPackageName(String str){
	    final Matcher matcher = Pattern.compile("name='\\S+?'").matcher(str);
	    String packageName = null;
	    while(matcher.find()){
	        packageName = matcher.group();
	        if(null != packageName)
	            break;
	    }
	    if(null != packageName){
	        packageName=packageName.replace("name=", "").replace("'", "");
	    }
	    
	    return packageName;
	}

你可能感兴趣的:(apk)