Java——ProcessBuilder类的使用及获取APK信息

这次是想获取APK包的版本号,包名,大小等信息。其实有两种方法:

一种是:

纯JAVA环境获取APK信息(包名,版本,版本号,大小,权限...),纯JAVA语言编写PC端获取APK信息 。

这篇文章是通过解析APK中的xml获取信息的。

其实还有另外一种方法是使用android开发工具里面的aapt.exe文件,

C:/getapkinfo/aapt.exe d badging D:/new/test.apk

指定好aapt文件的路径  后面两个为参数  后面为apk包的位置。

这是在Dos窗口直接显示结果,如果想将结果导入到txt文件,可使用:

C:/getapkinfo/aapt.exe d badging D:/new/test.apk>c:/test.txt

回到ProssBuilder类,我们需要通过ProssBuilder获取Process实例,API是这样描述的:

The ProcessBuilder.start() and Runtime.exec methods create a native process and return an instance of a subclass of Process that can be used to control the process and obtain information about it. The class Process provides methods
for performing input from the process, performing output to the process, waiting for the process to complete, checking the exit status of the process, and destroying (killing) the process.

ProcessBuilder.start() 和Runtime.exec方法创建一个本地进程并且返回Process子类的实例,它能够用于控制进程和获取进程信息。Process类能够执行从进程输入,执行输出到进程,等待进程完成,检查进程退出状态和终结进程。

在之前写定时器的时候,其实就是用Runtime.exec这个方法直接进行命令操作。但是如果操作命令之后我们还要读取这个进程执行的信息怎么办呢,就需要用Process这个类获取了。

ProcessBuilder类的创建:

ProcessBuilder pb = new ProcessBuilder();

Process实例的获取:

Process p = pb.command("C:/getapkinfo/aapt.exe","d","badging","D:/new/test.apk").start();

为什么要这样写:可以查看这篇:ProcessBuilder异常CreateProcess error=2, ?????μ???

然后使用getInputStream连接子进程的输出:

但最终我们是需要读取整个输出信息,可以使用BufferedReader进行封装读取,但是BufferedReader的构造方法的参数为Reader,现在拿到的InputStream,思路在这里可能会断掉,因为流封装的关系经常忘,然后现在通过API又有了新思路,既然传递的参数类型为Reader类,那么根据多态性,Reader的子类也是可以进行传递的。

所以查找Reader并观察它下面有哪些子类,看着看着你会看到一个很眼熟的类——InputStreamReader,查看你构造方法,发现它刚好就是InputStreamReader(InputStream in)。

所以,一口气写出来:

BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s = "";
            while((s=br.readLine())!= null){
                System.out.println(s);
            }

中文乱码怎么办?

还有另外传入编码的构造方法:InputStreamReader(InputStream in, Charset cs)。

BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(),"UTF-8"));

整个源码实现:

public class TestProcess {
	public static void main(String[] args) {
		ProcessBuilder pb = new ProcessBuilder();
		try {
			Process p = pb.command("C:/getapkinfo/aapt.exe","d","badging","D:/new/test.apk").start();
			BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(),"UTF-8"));
			String s = "";
			while((s=br.readLine())!= null){
				System.out.println(s);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

最后的结果:

时间: 2024-10-12 03:12:40

Java——ProcessBuilder类的使用及获取APK信息的相关文章

纯JAVA环境获取APK信息(包名,版本,版本号,大小,权限...),纯JAVA语言编写PC端获取APK信息

纯JAVA环境获取APK信息:包名,版本,版本号,大小,权限... 纯Java环境获取APK信息需要两个包:AXMLPrinter2.jar 跟jdom.jar,用于反编译XML和解析XML的 项目目录 这个类是获取APK信息的 public class ApkUtil { private static final Namespace NS = Namespace.getNamespace("http://schemas.android.com/apk/res/android"); @

java有没有开源框架可以获取svn信息的

原文:java有没有开源框架可以获取svn信息的 代码下载地址:http://www.zuidaima.com/share/1550463238638592.htm 想通过java程序来自动监控svn的版本更新情况,不知道能否实现,有的话给提供个代码,多谢了. java有没有开源框架可以获取svn信息的

获取apk信息工具(android SDK的aapt工具)

aapt命令是android SDK 中的一个工具,功能强大,比如在windows平台获取apk包的信息. 使用该工具准备条件,也即获取aapt.exe文件的方式(2选1即可): 安装android SDK 包(java虚拟机也是需要的),可执行文件aapt.exe一般默认路径C:\Users\你的用户名\AppData\Local\Android\android-sdk\platform-tools . 或者在http://code.google.com/p/android-apktool/d

Java工具类:给程序增加版权信息

我们九天鸟的p2p网贷系统,基本算是开发完成了.   现在,想给后端的Java代码,增加版权信息.   手动去copy-paste,太没有技术含量. 于是,写了个Java工具类,给Java源文件增加版权信息.   源代码,开头的注释,就是版权描述.详细实现,就看代码吧.  /*  *Copyright ? 2015 JiuTianNiao  *武汉九天鸟科技有限公司  *http://JiuTianNiao.com  *All rights reserved.  */ package com.j

【JAVA】关于java中 类.class.getResource("/").getPath()获取路径有空格的问题

写了一个web工程,在本地测试正确,但是部署到服务器上就出现错误.原因是读取不到配置文件. 后来从打印出来的文件路径中发现是用Java的class.getResource("/").getPath()获取路径的时候,路径中的空格转换成了%20. 在网上查询相关信息,果然将空格转成%20是一个古老的bug,我特意借此记录一下,希望能帮到遇到同样问题的朋友. Bug ID: 4466485 getClass( ).getResource( ).getFile( ) returns file

java 反射和泛型-反射来获取泛型信息

通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class<?> type = f.getType();//获得字段的类型 但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>; 为了获得指定Field的泛型类型,我们采用: Type gType = f.getG

php获取apk包信息

这段时间太忙了,一个月没有写博客了,稍微闲下来就感觉把在开发中遇到的问题记录下来 php上传安卓apk包的时候,需要获取安卓apk包内的信息 <?php /*解析安卓apk包中的压缩XML文件,还原和读取XML内容 依赖功能:需要PHP的ZIP包函数支持.*/ include('./Apkparser.php'); $appObj = new Apkparser(); $targetFile = a.apk;//apk所在的路径地址 $res = $appObj->open($targetFi

浅析Java.lang.ProcessBuilder类

最近由于工作需要把用户配置的Hive命令在Linux环境下执行,专门做了一个用户管理界面特地研究了这个不经常用得ProcessBuilder类.所以把自己的学习的资料总结一下. 一.概述      ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法.在J2SE 1.5之前,都是由Process类处来实现进程的控制管理.      每个 ProcessBuilder 实例管理一个进程属性

深入研究java.lang.ProcessBuilder类

 深入研究java.lang.ProcessBuilder类 一.概述       ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法.在J2SE 1.5之前,都是由Process类处来实现进程的控制管理.      每个 ProcessBuilder 实例管理一个进程属性集.它的start() 方法利用这些属性创建一个新的 Process 实例.start() 方法可以从同一实例重复