/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.commands.monkey; import android.app.IActivityManager; import android.util.Log; import android.view.IWindowManager; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.text.DecimalFormat; import java.util.regex.Pattern; import java.util.regex.Matcher; /** * Events for running a special shell command to capture the frame rate. * To run this test, the system property viewancestor.profile_rendering * must be set to true to force the currently focused window to render at * 60 Hz. */ public class MonkeyGetFrameRateEvent extends MonkeyEvent { private String GET_FRAMERATE_CMD = "service call SurfaceFlinger 1013"; private String mStatus; private static long mStartTime; // in millisecond private static long mEndTime; // in millisecond private static float mDuration; // in seconds private static String mTestCaseName = null; private static int mStartFrameNo; private static int mEndFrameNo; private static final String TAG = "MonkeyGetFrameRateEvent"; private static final String LOG_FILE = "/sdcard/avgFrameRateOut.txt"; private static final Pattern NO_OF_FRAMES_PATTERN = Pattern.compile(".*\\(([a-f[A-F][0-9]].*?)\\s.*\\)"); public MonkeyGetFrameRateEvent(String status, String testCaseName) { super(EVENT_TYPE_ACTIVITY); mStatus = status; mTestCaseName = testCaseName; } public MonkeyGetFrameRateEvent(String status) { super(EVENT_TYPE_ACTIVITY); mStatus = status; } //Calculate the average frame rate private float getAverageFrameRate(int totalNumberOfFrame, float duration) { float avgFrameRate = 0; if (duration > 0) { avgFrameRate = (totalNumberOfFrame / duration); } return avgFrameRate; } /** * Calculate the frame rate and write the output to a file on the SD card. */ private void writeAverageFrameRate() { FileWriter writer = null; float avgFrameRate; int totalNumberOfFrame = 0; try { writer = new FileWriter(LOG_FILE, true); // true = append totalNumberOfFrame = mEndFrameNo - mStartFrameNo; avgFrameRate = getAverageFrameRate(totalNumberOfFrame, mDuration); writer.write(String.format("%s:%.2f\n",mTestCaseName,avgFrameRate)); writer.close(); } catch (IOException e) { Log.w(TAG, "Can't write sdcard log file", e); } finally { try { if (writer != null) writer.close(); } catch (IOException e) { Log.e(TAG, "IOException " + e.toString()); } } } // Parse the output of the surfaceFlinge shell command call private String getNumberOfFrames(String input){ String noOfFrames = null; Matcher m = NO_OF_FRAMES_PATTERN.matcher(input); if (m.matches()){ noOfFrames = m.group(1); } return noOfFrames; } @Override public int injectEvent(IWindowManager iwm, IActivityManager iam, int verbose) { java.lang.Process p = null; BufferedReader result = null; try { p = Runtime.getRuntime().exec(GET_FRAMERATE_CMD); int status = p.waitFor(); if (status != 0) { System.err.println(String.format("// Shell command %s status was %s", GET_FRAMERATE_CMD, status)); } result = new BufferedReader(new InputStreamReader(p.getInputStream())); //Only need the first line of the output String output = result.readLine(); if (output != null) { if (mStatus == "start") { mStartFrameNo = Integer.parseInt(getNumberOfFrames(output), 16); mStartTime = System.currentTimeMillis(); } else if (mStatus == "end") { mEndFrameNo = Integer.parseInt(getNumberOfFrames(output), 16); mEndTime = System.currentTimeMillis(); long diff = mEndTime - mStartTime; mDuration = (float)(diff/1000.0); writeAverageFrameRate(); } } } catch (Exception e) { System.err.println("// Exception from " + GET_FRAMERATE_CMD + ":"); System.err.println(e.toString()); } finally { try { if (result != null) { result.close(); } if (p != null) { p.destroy(); } } catch (IOException e) { System.err.println(e.toString()); } } return MonkeyEvent.INJECT_SUCCESS; } }