From d275b6237e6ba7e6001697166b2ff3ca0d11989b Mon Sep 17 00:00:00 2001 From: Brian Carlstrom Date: Tue, 24 Aug 2010 18:02:43 -0700 Subject: [PATCH 1/4] Added a couple of new properties. The Android framework crashes with an int parsing failure and then spins wildly if it can't find an expected property. (git cherry-pick -e d88ee455) Change-Id: Ie33e0261185301e6ce41b0896f9916816db9f928 --- simulator/app/PropertyServer.cpp | 4 ++++ 1 file changed, 4 insertions(+) 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" }, From 6035a57a977cba9e32cda75e93bdac409f758607 Mon Sep 17 00:00:00 2001 From: Yu Shan Emily Lau Date: Tue, 24 Aug 2010 18:03:32 -0700 Subject: [PATCH 2/4] Add the new option for the scripted monkey profile testing. Change-Id: I1013a1a0daed948f509d9a29077f0e282baf1a10 --- .../src/com/android/commands/monkey/Monkey.java | 15 +++++++++++---- .../commands/monkey/MonkeySourceRandomScript.java | 10 +++++----- .../commands/monkey/MonkeySourceScript.java | 15 ++++++++++++++- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/cmds/monkey/src/com/android/commands/monkey/Monkey.java b/cmds/monkey/src/com/android/commands/monkey/Monkey.java index 4de86cfcd..511b27c40 100644 --- a/cmds/monkey/src/com/android/commands/monkey/Monkey.java +++ b/cmds/monkey/src/com/android/commands/monkey/Monkey.java @@ -172,6 +172,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; @@ -444,18 +447,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 +641,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 +1114,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]; From b668245cf174e654923bdd4862cced7e4d90e39e Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Tue, 24 Aug 2010 13:24:48 -0700 Subject: [PATCH 3/4] Explicitly enable backup by default in SDK builds This change parallels a frameworks/base change that makes the default backup state at boot "enabled, with LocalTransport as the currently active transport." Device vendors who wish to ship the Google backup transport need to explicitly disable backup by default (it is enabled when the user agrees to the opt-in disclosure). Change-Id: I6b0c5c059ef58effd5c121107ea3a5edd9e936cc --- .../base/packages/SettingsProvider/res/values/defaults.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk_overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/sdk_overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml index 0d211a847..c4a990e22 100644 --- a/sdk_overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml +++ b/sdk_overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml @@ -17,5 +17,8 @@ */ --> + + true android/com.android.internal.backup.LocalTransport From 06bcd705606070aa71425fc557e72592a2405a0a Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 24 Aug 2010 18:58:14 -0700 Subject: [PATCH 4/4] Quiet harmless StrictMode violations caused by the Monkey. The monkey writes to System.out which is effectively a file and is caught by StrictMode. BUG=2947447 Change-Id: Iab38917f18baa319dad34d0c788bc9a10a041796 --- .../src/com/android/commands/monkey/Monkey.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/cmds/monkey/src/com/android/commands/monkey/Monkey.java b/cmds/monkey/src/com/android/commands/monkey/Monkey.java index 511b27c40..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; @@ -225,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; @@ -234,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) { @@ -243,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); @@ -256,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) { @@ -268,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;