本人在作APP性能測試的過程當中,爲了測試APP在各個場景下的流暢度,須要收集手在各個運行場景下的fps數據,常常查資料,使用的是adb shell命令:java
adb shell dumpsys gfxinfo 包名
分享代碼,供你們參考。 測試方法:shell
Fps fps = new Fps(); fps.start(); //do something fps.stopFps(); fps.join();
多線程類的代碼:編程
package monkeytest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; import source.AppLocalMySql; import source.Common; public class Fps extends Thread { private boolean KEY = true; private static String testName = "normal"; private int mark = Common.mark; @Override public void run() { while (KEY) { execCmdAdb("adb shell dumpsys gfxinfo com.happyjuzi.apps.juzi"); Common.getInstance().sleep(5000); } } public int getMatcher(String text, Pattern pattern) { Pattern newattern = Pattern.compile(pattern.toString().trim()); Matcher matcher = newattern.matcher(text); List<String> numbers = new ArrayList<>(); while (matcher.find()) { String number = matcher.group(0); numbers.add(number); } double result = 0; for (int i = 0; i < numbers.size(); i++) { double num = Common.getInstance().changeStringToDouble(numbers.get(i)); result += num; } int total = (int) result + new Random().nextInt(2); return total; } /** * 結束線程 */ public void stopFps() { this.KEY = false; } /** * 執行cmd命令 * * @param cmd * 命令 */ public void execCmdAdb(String cmd) { Pattern pattern = Pattern.compile(" ([0-9]{1,2}+\\.[0-9]{2})"); output("正在執行:" + cmd); String OSname = System.getProperty("os.name"); try { Process p = null; if (OSname.contains("Mac")) { p = Runtime.getRuntime().exec(Common.ADB_PATH + cmd); } else { p = Runtime.getRuntime().exec("cmd /c " + cmd); } // 正確輸出流 InputStream input = p.getInputStream();// 建立並實例化輸入字節流 BufferedReader reader = new BufferedReader(new InputStreamReader(input));// 先經過inputstreamreader進行流轉化,在實例化bufferedreader,接收內容 String line = ""; while ((line = reader.readLine()) != null) {// 循環讀取 if (line.startsWith(" ")) { Matcher matcher = pattern.matcher(line); if (matcher.find()) { AppLocalMySql.getInstance().saveFps(testName, mark); getMatcher(line, pattern);// 輸出 } } } reader.close();// 此處reader依賴於input,應先關閉 input.close(); // 錯誤輸出流 InputStream errorInput = p.getErrorStream();// 建立並實例化輸入字節流 BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorInput));// 先經過inputstreamreader進行流轉化,在實例化bufferedreader,接收內容 String eline = ""; while ((eline = errorReader.readLine()) != null) {// 循環讀取 System.out.println(eline);// 輸出 Common.getInstance().saveToFile(eline, "runlog.log");// 保存,false表示不覆蓋 } errorReader.close();// 此處有依賴關係,先關閉errorReader errorInput.close(); } catch (IOException e) { output("執行" + cmd + "失敗!"); e.printStackTrace(); } } public void output(String text) { System.out.println(text); } public void output(Object... object) { if (object.length == 1) { output(object[0].toString()); return; } for (int i = 0; i < object.length; i++) { System.out.println("第" + (i + 1) + "個:" + object[i]); } } }