/**
* @(#) 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文件,获取应用包名,版本号,版本名 代码直接复制即可,亲测多次可用,
标题 "aapt解析apk版本信息" 涉及到的是Android开发中的一个重要工具——Android Asset Packaging Tool(aapt)。aapt是Android SDK的一部分,用于处理应用程序的资源,并生成相应的二进制XML文件、R类文件以及APK包...
aapt.exe 解析apk工具
3. 然后,你可以尝试再次运行`aapt dump badging *.apk`命令,看看是否还存在乱码问题。现在,CMD应该能够正确地解析和显示中文信息了。 但是,请注意,修改CMD编码可能会影响到其他依赖GBK编码的程序或脚本,因此...
`aapt`(Android Asset Packaging Tool)是Android SDK中用于处理应用资源的命令行工具,它可以解析APK文件,提取出其中的各种信息。在Java环境下,我们可以通过调用aapt的Java API来实现对APK文件的解析,尤其是在...
本篇将详细介绍如何使用Java和AAPT(Android Asset Packaging Tool)来解析APK,尤其适用于处理加密或加壳的APK。 首先,APK实际上是一个ZIP格式的压缩包,包含了AndroidManifest.xml、资源文件、dex字节码等。传统...
在Windows环境下,使用C#基于aapt解析Android APK文件是一个技术性强且实用的过程。aapt(Android Asset Packaging Tool)是Android SDK的一部分,主要用于处理APK的资源文件,如图片、XML布局等。C#作为.NET框架的...
Java解析APK包是一项常见的技术,主要用于逆向工程、安全分析或者自动化工具的实现。当我们遇到Java解析APK时桌面图标问题提示的问题,这通常涉及到APK的资源解析和AndroidManifest.xml的处理。 首先,我们要理解...
aapt工具,可以解析APK包名。
JAVA解析apk包的工具包,但该版本是用在linux服务器中的,若linux服务器是64位还需要另外加载32linux位所需的内容来使用该工具
首先,Java解析APK主要依赖于对ZIP文件格式的理解,因为APK本质上就是一个ZIP文件,其结构遵循特定的Android规范。你可以使用Java内置的`java.util.zip`包来读取和解压APK,然后提取所需的元数据。以下是一些关键...
有时,我们可能需要独立于Android SDK来解析APK文件,获取其中的图标(icon)信息,以便进行自动化测试、分析或设计工作。本文将详细介绍如何使用纯Java来实现这一目标,并解释如何在Linux和Windows操作系统上实现...
`apk`解析工具`AAPT`(Android Asset Packaging Tool)是Android开发中的一个重要组件,主要用于处理Android应用的资源文件、编译资源以及生成应用的`R`类。它是Android SDK的一部分,提供了命令行接口,使开发者可以...
本主题将深入探讨如何使用Java解析APK文件,并列举出所需的JAR包。 首先,Java解析APK的基本步骤包括: 1. **读取APK文件**: APK文件本质上是一个ZIP格式的压缩文件,因此可以使用Java内置的`java.util.zip`包中的...
aapt位于Android SDK的`platform-tools`目录下,它支持多种操作,如列出资源包内容、打包、更新和删除ZIP格式的文件(包括apk、jar等)。 ### aapt 主要功能 1. **列出资源内容 (list)**: 使用`aapt l[ist]`命令...
本篇将详细讲解如何利用`aapt.exe`来解析APK中的`AndroidManifest.xml`文件,以及如何通过Java调用`aapt.exe`获取更全面的信息,包括图标名称等。 `AndroidManifest.xml`是每个APK的核心组件,它定义了应用的基本元...
APK包名是每个应用的唯一标识符,而版本号则是用来跟踪应用的不同发布版本。这个Java项目,"ApkTest",专门设计用于解析Android APK文件的包名和版本信息,这对于理解和管理Android应用的版本控制至关重要。 首先,...
例如,`ApkUtil`可能包含解析APK信息、提取资源、甚至修改APK内容等功能。 总的来说,理解和掌握AAPT对于Android开发者来说至关重要,因为它允许直接与APK文件交互,获取必要的元数据,这对于调试、分析和逆向工程...