`
ouyangfeng521
  • 浏览: 248741 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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;
	}
分享到:
评论

相关推荐

    python aapt分析apk文件,获取应用包名,版本号,版本名

    python aapt 分析APK文件,获取应用包名,版本号,版本名 代码直接复制即可,亲测多次可用,

    aapt 解析apk版本信息

    标题 "aapt解析apk版本信息" 涉及到的是Android开发中的一个重要工具——Android Asset Packaging Tool(aapt)。aapt是Android SDK的一部分,用于处理应用程序的资源,并生成相应的二进制XML文件、R类文件以及APK包...

    aapt解析apk工具

    aapt.exe 解析apk工具

    windows cmd修改编码注册文件,解决使用aapt获取apk信息的乱码问题

    3. 然后,你可以尝试再次运行`aapt dump badging *.apk`命令,看看是否还存在乱码问题。现在,CMD应该能够正确地解析和显示中文信息了。 但是,请注意,修改CMD编码可能会影响到其他依赖GBK编码的程序或脚本,因此...

    java环境下通过aapt解析apk文件

    `aapt`(Android Asset Packaging Tool)是Android SDK中用于处理应用资源的命令行工具,它可以解析APK文件,提取出其中的各种信息。在Java环境下,我们可以通过调用aapt的Java API来实现对APK文件的解析,尤其是在...

    java实现解析APK

    本篇将详细介绍如何使用Java和AAPT(Android Asset Packaging Tool)来解析APK,尤其适用于处理加密或加壳的APK。 首先,APK实际上是一个ZIP格式的压缩包,包含了AndroidManifest.xml、资源文件、dex字节码等。传统...

    Windows下c# 基于 aapt 解析安卓apk

    在Windows环境下,使用C#基于aapt解析Android APK文件是一个技术性强且实用的过程。aapt(Android Asset Packaging Tool)是Android SDK的一部分,主要用于处理APK的资源文件,如图片、XML布局等。C#作为.NET框架的...

    Java解析apk包

    Java解析APK包是一项常见的技术,主要用于逆向工程、安全分析或者自动化工具的实现。当我们遇到Java解析APK时桌面图标问题提示的问题,这通常涉及到APK的资源解析和AndroidManifest.xml的处理。 首先,我们要理解...

    解析APK包名的aapt.exe

    aapt工具,可以解析APK包名。

    aapt(JAVA解析apk工具包-linux版)

    JAVA解析apk包的工具包,但该版本是用在linux服务器中的,若linux服务器是64位还需要另外加载32linux位所需的内容来使用该工具

    java解析apk文件

    首先,Java解析APK主要依赖于对ZIP文件格式的理解,因为APK本质上就是一个ZIP文件,其结构遵循特定的Android规范。你可以使用Java内置的`java.util.zip`包来读取和解压APK,然后提取所需的元数据。以下是一些关键...

    解析apk获取icon图标兼容linux和window

    有时,我们可能需要独立于Android SDK来解析APK文件,获取其中的图标(icon)信息,以便进行自动化测试、分析或设计工作。本文将详细介绍如何使用纯Java来实现这一目标,并解释如何在Linux和Windows操作系统上实现...

    apk解析工具aapt

    `apk`解析工具`AAPT`(Android Asset Packaging Tool)是Android开发中的一个重要组件,主要用于处理Android应用的资源文件、编译资源以及生成应用的`R`类。它是Android SDK的一部分,提供了命令行接口,使开发者可以...

    Java解析apk所需jar包

    本主题将深入探讨如何使用Java解析APK文件,并列举出所需的JAR包。 首先,Java解析APK的基本步骤包括: 1. **读取APK文件**: APK文件本质上是一个ZIP格式的压缩文件,因此可以使用Java内置的`java.util.zip`包中的...

    Android快速分析apk工具aapt的使用教程

    aapt位于Android SDK的`platform-tools`目录下,它支持多种操作,如列出资源包内容、打包、更新和删除ZIP格式的文件(包括apk、jar等)。 ### aapt 主要功能 1. **列出资源内容 (list)**: 使用`aapt l[ist]`命令...

    利用aapt.exe 解析APK AndroidManifest.xml,信息更加全面

    本篇将详细讲解如何利用`aapt.exe`来解析APK中的`AndroidManifest.xml`文件,以及如何通过Java调用`aapt.exe`获取更全面的信息,包括图标名称等。 `AndroidManifest.xml`是每个APK的核心组件,它定义了应用的基本元...

    纯java解析安卓apk包名与版本号

    APK包名是每个应用的唯一标识符,而版本号则是用来跟踪应用的不同发布版本。这个Java项目,"ApkTest",专门设计用于解析Android APK文件的包名和版本信息,这对于理解和管理Android应用的版本控制至关重要。 首先,...

    aapt获取架包信息

    例如,`ApkUtil`可能包含解析APK信息、提取资源、甚至修改APK内容等功能。 总的来说,理解和掌握AAPT对于Android开发者来说至关重要,因为它允许直接与APK文件交互,获取必要的元数据,这对于调试、分析和逆向工程...

Global site tag (gtag.js) - Google Analytics