Package blacklist/whitelist file support for Monkey.
With this CL, you can specify a package whitelist file or a package blacklist file, but not both. You can not specify both individual packages via -p and blacklist file, either. But you can specify both whitelist file and individual packages via -p and they will be summed up.
This commit is contained in:
@@ -34,6 +34,7 @@ import java.io.BufferedReader;
|
|||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
@@ -117,9 +118,18 @@ public class Monkey {
|
|||||||
/** Generate hprof reports before/after monkey runs */
|
/** Generate hprof reports before/after monkey runs */
|
||||||
private boolean mGenerateHprof;
|
private boolean mGenerateHprof;
|
||||||
|
|
||||||
|
/** Package blacklist file. */
|
||||||
|
private String mPkgBlacklistFile;
|
||||||
|
|
||||||
|
/** Package whitelist file. */
|
||||||
|
private String mPkgWhitelistFile;
|
||||||
|
|
||||||
/** Packages we are allowed to run, or empty if no restriction. */
|
/** Packages we are allowed to run, or empty if no restriction. */
|
||||||
private HashSet<String> mValidPackages = new HashSet<String>();
|
private HashSet<String> mValidPackages = new HashSet<String>();
|
||||||
|
|
||||||
|
/** Packages we are not allowed to run. */
|
||||||
|
private HashSet<String> mInvalidPackages = new HashSet<String>();
|
||||||
|
|
||||||
/** Categories we are allowed to launch **/
|
/** Categories we are allowed to launch **/
|
||||||
private ArrayList<String> mMainCategories = new ArrayList<String>();
|
private ArrayList<String> mMainCategories = new ArrayList<String>();
|
||||||
|
|
||||||
@@ -168,6 +178,25 @@ public class Monkey {
|
|||||||
|
|
||||||
public static String currentPackage;
|
public static String currentPackage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether we should run against the givn package.
|
||||||
|
*
|
||||||
|
* @param pkg The package name.
|
||||||
|
* @return Returns true if we should run against pkg.
|
||||||
|
*/
|
||||||
|
private boolean checkEnteringPackage(String pkg) {
|
||||||
|
if (mInvalidPackages.size() > 0) {
|
||||||
|
if (mInvalidPackages.contains(pkg)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (mValidPackages.size() > 0) {
|
||||||
|
if (!mValidPackages.contains(pkg)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Monitor operations happening in the system.
|
* Monitor operations happening in the system.
|
||||||
*/
|
*/
|
||||||
@@ -196,19 +225,6 @@ public class Monkey {
|
|||||||
return allow;
|
return allow;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkEnteringPackage(String pkg) {
|
|
||||||
if (pkg == null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// preflight the hash lookup to avoid the cost of hash key
|
|
||||||
// generation
|
|
||||||
if (mValidPackages.size() == 0) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return mValidPackages.contains(pkg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg,
|
public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg,
|
||||||
byte[] crashData) {
|
byte[] crashData) {
|
||||||
System.err.println("// CRASH: " + processName + " (pid " + pid + ")");
|
System.err.println("// CRASH: " + processName + " (pid " + pid + ")");
|
||||||
@@ -367,6 +383,10 @@ public class Monkey {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!loadPackageLists()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// now set up additional data in preparation for launch
|
// now set up additional data in preparation for launch
|
||||||
if (mMainCategories.size() == 0) {
|
if (mMainCategories.size() == 0) {
|
||||||
mMainCategories.add(Intent.CATEGORY_LAUNCHER);
|
mMainCategories.add(Intent.CATEGORY_LAUNCHER);
|
||||||
@@ -381,6 +401,12 @@ public class Monkey {
|
|||||||
System.out.println(":AllowPackage: " + it.next());
|
System.out.println(":AllowPackage: " + it.next());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (mInvalidPackages.size() > 0) {
|
||||||
|
Iterator<String> it = mInvalidPackages.iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
System.out.println(":DisallowPackage: " + it.next());
|
||||||
|
}
|
||||||
|
}
|
||||||
if (mMainCategories.size() != 0) {
|
if (mMainCategories.size() != 0) {
|
||||||
Iterator<String> it = mMainCategories.iterator();
|
Iterator<String> it = mMainCategories.iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
@@ -573,6 +599,10 @@ public class Monkey {
|
|||||||
} else if (opt.equals("--pct-anyevent")) {
|
} else if (opt.equals("--pct-anyevent")) {
|
||||||
int i = MonkeySourceRandom.FACTOR_ANYTHING;
|
int i = MonkeySourceRandom.FACTOR_ANYTHING;
|
||||||
mFactors[i] = -nextOptionLong("any events percentage");
|
mFactors[i] = -nextOptionLong("any events percentage");
|
||||||
|
} else if (opt.equals("--pkg-blacklist-file")) {
|
||||||
|
mPkgBlacklistFile = nextOptionData();
|
||||||
|
} else if (opt.equals("--pkg-whitelist-file")) {
|
||||||
|
mPkgWhitelistFile = nextOptionData();
|
||||||
} else if (opt.equals("--throttle")) {
|
} else if (opt.equals("--throttle")) {
|
||||||
mThrottle = nextOptionLong("delay (in milliseconds) to wait between events");
|
mThrottle = nextOptionLong("delay (in milliseconds) to wait between events");
|
||||||
} else if (opt.equals("--wait-dbg")) {
|
} else if (opt.equals("--wait-dbg")) {
|
||||||
@@ -622,6 +652,62 @@ public class Monkey {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a list of package names from a file.
|
||||||
|
*
|
||||||
|
* @param fileName The file name, with package names separated by new line.
|
||||||
|
* @param list The destination list.
|
||||||
|
* @return Returns false if any error occurs.
|
||||||
|
*/
|
||||||
|
private static boolean loadPackageListFromFile(String fileName, HashSet<String> list) {
|
||||||
|
BufferedReader reader = null;
|
||||||
|
try {
|
||||||
|
reader = new BufferedReader(new FileReader(fileName));
|
||||||
|
String s;
|
||||||
|
while ((s = reader.readLine()) != null) {
|
||||||
|
s = s.trim();
|
||||||
|
if ((s.length() > 0) && (!s.startsWith("#"))) {
|
||||||
|
list.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
System.err.println(ioe);
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
if (reader != null) {
|
||||||
|
try {
|
||||||
|
reader.close();
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
System.err.println(ioe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load package blacklist or whitelist (if specified).
|
||||||
|
*
|
||||||
|
* @return Returns false if any error occurs.
|
||||||
|
*/
|
||||||
|
private boolean loadPackageLists() {
|
||||||
|
if (((mPkgWhitelistFile != null) || (mValidPackages.size() > 0))
|
||||||
|
&& (mPkgBlacklistFile != null)) {
|
||||||
|
System.err.println("** Error: you can not specify a package blacklist "
|
||||||
|
+ "together with a whitelist or individual packages (via -p).");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ((mPkgWhitelistFile != null)
|
||||||
|
&& (!loadPackageListFromFile(mPkgWhitelistFile, mValidPackages))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ((mPkgBlacklistFile != null)
|
||||||
|
&& (!loadPackageListFromFile(mPkgBlacklistFile, mInvalidPackages))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check for any internal configuration (primarily build-time) errors.
|
* Check for any internal configuration (primarily build-time) errors.
|
||||||
*
|
*
|
||||||
@@ -708,20 +794,17 @@ public class Monkey {
|
|||||||
final int NA = mainApps.size();
|
final int NA = mainApps.size();
|
||||||
for (int a = 0; a < NA; a++) {
|
for (int a = 0; a < NA; a++) {
|
||||||
ResolveInfo r = mainApps.get(a);
|
ResolveInfo r = mainApps.get(a);
|
||||||
if (mValidPackages.size() == 0
|
String packageName = r.activityInfo.applicationInfo.packageName;
|
||||||
|| mValidPackages.contains(r.activityInfo.applicationInfo.packageName)) {
|
if (checkEnteringPackage(packageName)) {
|
||||||
if (mVerbose >= 2) { // very verbose
|
if (mVerbose >= 2) { // very verbose
|
||||||
System.out.println("// + Using main activity " + r.activityInfo.name
|
System.out.println("// + Using main activity " + r.activityInfo.name
|
||||||
+ " (from package "
|
+ " (from package " + packageName + ")");
|
||||||
+ r.activityInfo.applicationInfo.packageName + ")");
|
|
||||||
}
|
}
|
||||||
mMainApps.add(new ComponentName(r.activityInfo.applicationInfo.packageName,
|
mMainApps.add(new ComponentName(packageName, r.activityInfo.name));
|
||||||
r.activityInfo.name));
|
|
||||||
} else {
|
} else {
|
||||||
if (mVerbose >= 3) { // very very verbose
|
if (mVerbose >= 3) { // very very verbose
|
||||||
System.out.println("// - NOT USING main activity "
|
System.out.println("// - NOT USING main activity "
|
||||||
+ r.activityInfo.name + " (from package "
|
+ r.activityInfo.name + " (from package " + packageName + ")");
|
||||||
+ r.activityInfo.applicationInfo.packageName + ")");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -982,6 +1065,8 @@ public class Monkey {
|
|||||||
usage.append(" [--pct-nav PERCENT] [--pct-majornav PERCENT]\n");
|
usage.append(" [--pct-nav PERCENT] [--pct-majornav PERCENT]\n");
|
||||||
usage.append(" [--pct-appswitch PERCENT] [--pct-flip PERCENT]\n");
|
usage.append(" [--pct-appswitch PERCENT] [--pct-flip PERCENT]\n");
|
||||||
usage.append(" [--pct-anyevent PERCENT]\n");
|
usage.append(" [--pct-anyevent PERCENT]\n");
|
||||||
|
usage.append(" [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]\n");
|
||||||
|
usage.append(" [--pkg-whitelist-file PACKAGE_WHITELIST_FILE]\n");
|
||||||
usage.append(" [--wait-dbg] [--dbg-no-events]\n");
|
usage.append(" [--wait-dbg] [--dbg-no-events]\n");
|
||||||
usage.append(" [--setup scriptfile] [-f scriptfile [-f scriptfile] ...]\n");
|
usage.append(" [--setup scriptfile] [-f scriptfile [-f scriptfile] ...]\n");
|
||||||
usage.append(" [--port port]\n");
|
usage.append(" [--port port]\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user