diff --git a/cmds/monkey/src/com/android/commands/monkey/Monkey.java b/cmds/monkey/src/com/android/commands/monkey/Monkey.java index 4de86cfcd..bfe3f2d52 100644 --- a/cmds/monkey/src/com/android/commands/monkey/Monkey.java +++ b/cmds/monkey/src/com/android/commands/monkey/Monkey.java @@ -17,8 +17,8 @@ package com.android.commands.monkey; import android.app.ActivityManagerNative; -import android.app.IActivityManager; import android.app.IActivityController; +import android.app.IActivityManager; import android.content.ComponentName; import android.content.Intent; import android.content.pm.IPackageManager; @@ -28,6 +28,7 @@ import android.os.Debug; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.StrictMode; import android.os.SystemClock; import android.os.SystemProperties; import android.view.IWindowManager; @@ -172,6 +173,9 @@ public class Monkey { long mDroppedFlipEvents = 0; + /** The delay between user actions. This is for the scripted monkey. **/ + long mProfileWaitTime = 5000; + /** a filename to the setup script (if any) */ private String mSetupFileName = null; @@ -222,8 +226,16 @@ public class Monkey { public boolean activityStarting(Intent intent, String pkg) { boolean allow = checkEnteringPackage(pkg) || (DEBUG_ALLOW_ANY_STARTS != 0); if (mVerbose > 0) { + // StrictMode's disk checks end up catching this on + // userdebug/eng builds due to PrintStream going to a + // FileOutputStream in the end (perhaps only when + // redirected to a file?) So we allow disk writes + // around this region for the monkey to minimize + // harmless dropbox uploads from monkeys. + int savedPolicy = StrictMode.allowThreadDiskWrites(); System.out.println(" // " + (allow ? "Allowing" : "Rejecting") + " start of " + intent + " in package " + pkg); + StrictMode.setThreadPolicy(savedPolicy); } currentPackage = pkg; currentIntent = intent; @@ -231,6 +243,7 @@ public class Monkey { } public boolean activityResuming(String pkg) { + int savedPolicy = StrictMode.allowThreadDiskWrites(); System.out.println(" // activityResuming(" + pkg + ")"); boolean allow = checkEnteringPackage(pkg) || (DEBUG_ALLOW_ANY_RESTARTS != 0); if (!allow) { @@ -240,12 +253,14 @@ public class Monkey { } } currentPackage = pkg; + StrictMode.setThreadPolicy(savedPolicy); return allow; } public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg, long timeMillis, String stackTrace) { + int savedPolicy = StrictMode.allowThreadDiskWrites(); System.err.println("// CRASH: " + processName + " (pid " + pid + ")"); System.err.println("// Short Msg: " + shortMsg); System.err.println("// Long Msg: " + longMsg); @@ -253,6 +268,7 @@ public class Monkey { System.err.println("// Build Changelist: " + Build.VERSION.INCREMENTAL); System.err.println("// Build Time: " + Build.TIME); System.err.println("// " + stackTrace.replace("\n", "\n// ")); + StrictMode.setThreadPolicy(savedPolicy); if (!mIgnoreCrashes) { synchronized (Monkey.this) { @@ -265,8 +281,10 @@ public class Monkey { } public int appNotResponding(String processName, int pid, String processStats) { + int savedPolicy = StrictMode.allowThreadDiskWrites(); System.err.println("// NOT RESPONDING: " + processName + " (pid " + pid + ")"); System.err.println(processStats); + StrictMode.setThreadPolicy(savedPolicy); synchronized (Monkey.this) { mRequestAnrTraces = true; mRequestDumpsysMemInfo = true; @@ -444,18 +462,18 @@ public class Monkey { if (mScriptFileNames != null && mScriptFileNames.size() == 1) { // script mode, ignore other options mEventSource = new MonkeySourceScript(mRandom, mScriptFileNames.get(0), mThrottle, - mRandomizeThrottle); + mRandomizeThrottle, mProfileWaitTime); mEventSource.setVerbose(mVerbose); mCountEvents = false; } else if (mScriptFileNames != null && mScriptFileNames.size() > 1) { if (mSetupFileName != null) { mEventSource = new MonkeySourceRandomScript(mSetupFileName, mScriptFileNames, - mThrottle, mRandomizeThrottle, mRandom); + mThrottle, mRandomizeThrottle, mRandom, mProfileWaitTime); mCount++; } else { mEventSource = new MonkeySourceRandomScript(mScriptFileNames, mThrottle, - mRandomizeThrottle, mRandom); + mRandomizeThrottle, mRandom, mProfileWaitTime); } mEventSource.setVerbose(mVerbose); mCountEvents = false; @@ -638,6 +656,9 @@ public class Monkey { mSetupFileName = nextOptionData(); } else if (opt.equals("-f")) { mScriptFileNames.add(nextOptionData()); + } else if (opt.equals("--profile-wait")) { + mProfileWaitTime = nextOptionLong("Profile delay" + + " (in milliseconds) to wait between user action"); } else if (opt.equals("-h")) { showUsage(); return false; @@ -1108,7 +1129,8 @@ public class Monkey { usage.append(" [--port port]\n"); usage.append(" [-s SEED] [-v [-v] ...]\n"); usage.append(" [--throttle MILLISEC] [--randomize-throttle]\n"); - usage.append(" COUNT"); + usage.append(" [--profile-wait MILLISEC]\n"); + usage.append(" COUNT\n"); System.err.println(usage.toString()); } } diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandomScript.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandomScript.java index fb60c9372..81daf018a 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandomScript.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandomScript.java @@ -48,16 +48,16 @@ public class MonkeySourceRandomScript implements MonkeyEventSource { * @param random The random number generator. */ public MonkeySourceRandomScript(String setupFileName, ArrayList scriptFileNames, - long throttle, boolean randomizeThrottle, Random random) { + long throttle, boolean randomizeThrottle, Random random, long profileWaitTime) { if (setupFileName != null) { mSetupSource = new MonkeySourceScript(random, setupFileName, throttle, - randomizeThrottle); + randomizeThrottle, profileWaitTime); mCurrentSource = mSetupSource; } for (String fileName: scriptFileNames) { mScriptSources.add(new MonkeySourceScript(random, fileName, throttle, - randomizeThrottle)); + randomizeThrottle, profileWaitTime)); } mRandom = random; @@ -72,8 +72,8 @@ public class MonkeySourceRandomScript implements MonkeyEventSource { * @param random The random number generator. */ public MonkeySourceRandomScript(ArrayList scriptFileNames, long throttle, - boolean randomizeThrottle, Random random) { - this(null, scriptFileNames, throttle, randomizeThrottle, random); + boolean randomizeThrottle, Random random, long profileWaitTime) { + this(null, scriptFileNames, throttle, randomizeThrottle, random, profileWaitTime); } /** diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java index 841182c57..8507e7f19 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java @@ -106,6 +106,8 @@ public class MonkeySourceScript implements MonkeyEventSource { private static final String EVENT_KEYWORD_TAP = "Tap"; + private static final String EVENT_KEYWORD_PROFILE_WAIT = "ProfileWait"; + // a line at the end of the header private static final String STARTING_DATA_LINE = "start data >>"; @@ -113,6 +115,8 @@ public class MonkeySourceScript implements MonkeyEventSource { private static int LONGPRESS_WAIT_TIME = 2000; // wait time for the long + private long mProfileWaitTime = 5000; //Wait time for each user profile + FileInputStream mFStream; DataInputStream mInputStream; @@ -126,9 +130,10 @@ public class MonkeySourceScript implements MonkeyEventSource { * @param throttle The amount of time in ms to sleep between events. */ public MonkeySourceScript(Random random, String filename, long throttle, - boolean randomizeThrottle) { + boolean randomizeThrottle, long profileWaitTime) { mScriptFileName = filename; mQ = new MonkeyEventQueue(random, throttle, randomizeThrottle); + mProfileWaitTime = profileWaitTime; } /** @@ -350,6 +355,14 @@ public class MonkeySourceScript implements MonkeyEventSource { return; } + + // Handle the profile wait time + if (s.indexOf(EVENT_KEYWORD_PROFILE_WAIT) >= 0) { + MonkeyWaitEvent e = new MonkeyWaitEvent(mProfileWaitTime); + mQ.addLast(e); + return; + } + // Handle keypress events if (s.indexOf(EVENT_KEYWORD_KEYPRESS) >= 0 && args.length == 1) { String key_name = args[0]; diff --git a/simulator/app/PropertyServer.cpp b/simulator/app/PropertyServer.cpp index eb1bfc39a..4a0a2ac92 100644 --- a/simulator/app/PropertyServer.cpp +++ b/simulator/app/PropertyServer.cpp @@ -112,6 +112,10 @@ void PropertyServer::SetDefaultProperties(void) { "ro.HOME_APP_MEM", "4096" }, { "ro.BACKUP_APP_ADJ", "2" }, { "ro.BACKUP_APP_MEM", "4096" }, + { "ro.PERCEPTIBLE_APP_ADJ", "2" }, + { "ro.PERCEPTIBLE_APP_MEM", "4096" }, + { "ro.HEAVY_WEIGHT_APP_ADJ", "3" }, + { "ro.HEAVY_WEIGHT_APP_MEM", "4096" }, //{ "init.svc.adbd", "running" }, // causes ADB-JDWP { "init.svc.usbd", "running" }, { "init.svc.debuggerd", "running" },