1. 程式人生 > >Java——ProcessBuilder類的使用及獲取APK資訊

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();

然後使用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();
		}
	}
}

最後的結果: