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

这次是想获取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();
		}
	}
}

最后的结果:

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。