標籤:processbuilder process apk資訊擷取 bufferedreader
這次是想擷取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();}}}
最後的結果:
Java——ProcessBuilder類的使用及擷取APK資訊