* commit 'b9b31f4b8eda123e7b544d1a0fa886576064adca': Support an ABI flag for instrumentation.
This commit is contained in:
@@ -35,6 +35,7 @@ import android.content.pm.ResolveInfo;
|
||||
import android.graphics.Rect;
|
||||
import android.net.Uri;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
@@ -46,6 +47,8 @@ import android.util.AndroidException;
|
||||
import android.view.IWindowManager;
|
||||
import com.android.internal.os.BaseCommand;
|
||||
|
||||
import dalvik.system.VMRuntime;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
@@ -94,7 +97,11 @@ public class Am extends BaseCommand {
|
||||
" am broadcast [--user <USER_ID> | all | current] <INTENT>\n" +
|
||||
" am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]\n" +
|
||||
" [--user <USER_ID> | current]\n" +
|
||||
" [--no-window-animation] <COMPONENT>\n" +
|
||||
" [--no-window-animation]\n" +
|
||||
" [--abi <ABI>]\n : Launch the instrumented process with the " +
|
||||
" selected ABI. This assumes that the process supports the" +
|
||||
" selected ABI." +
|
||||
" <COMPONENT>\n" +
|
||||
" am profile start [--user <USER_ID> current] <PROCESS> <FILE>\n" +
|
||||
" am profile stop [--user <USER_ID> current] [<PROCESS>]\n" +
|
||||
" am dumpheap [--user <USER_ID> current] [-n] <PROCESS> <FILE>\n" +
|
||||
@@ -808,6 +815,7 @@ public class Am extends BaseCommand {
|
||||
Bundle args = new Bundle();
|
||||
String argKey = null, argValue = null;
|
||||
IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
|
||||
String abi = null;
|
||||
|
||||
String opt;
|
||||
while ((opt=nextOption()) != null) {
|
||||
@@ -826,6 +834,8 @@ public class Am extends BaseCommand {
|
||||
no_window_animation = true;
|
||||
} else if (opt.equals("--user")) {
|
||||
userId = parseUserArg(nextArgRequired());
|
||||
} else if (opt.equals("--abi")) {
|
||||
abi = nextArgRequired();
|
||||
} else {
|
||||
System.err.println("Error: Unknown option: " + opt);
|
||||
return;
|
||||
@@ -856,7 +866,24 @@ public class Am extends BaseCommand {
|
||||
wm.setAnimationScale(1, 0.0f);
|
||||
}
|
||||
|
||||
if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher, connection, userId)) {
|
||||
if (abi != null) {
|
||||
final String[] supportedAbis = Build.SUPPORTED_ABIS;
|
||||
boolean matched = false;
|
||||
for (String supportedAbi : supportedAbis) {
|
||||
if (supportedAbi.equals(abi)) {
|
||||
matched = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!matched) {
|
||||
throw new AndroidException(
|
||||
"INSTRUMENTATION_FAILED: Unsupported instruction set " + abi);
|
||||
}
|
||||
}
|
||||
|
||||
if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher, connection, userId,
|
||||
abi)) {
|
||||
throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString());
|
||||
}
|
||||
|
||||
|
||||
@@ -904,7 +904,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
|
||||
b = data.readStrongBinder();
|
||||
IUiAutomationConnection c = IUiAutomationConnection.Stub.asInterface(b);
|
||||
int userId = data.readInt();
|
||||
boolean res = startInstrumentation(className, profileFile, fl, arguments, w, c, userId);
|
||||
String abiOverride = data.readString();
|
||||
boolean res = startInstrumentation(className, profileFile, fl, arguments, w, c, userId,
|
||||
abiOverride);
|
||||
reply.writeNoException();
|
||||
reply.writeInt(res ? 1 : 0);
|
||||
return true;
|
||||
@@ -3168,7 +3170,8 @@ class ActivityManagerProxy implements IActivityManager
|
||||
|
||||
public boolean startInstrumentation(ComponentName className, String profileFile,
|
||||
int flags, Bundle arguments, IInstrumentationWatcher watcher,
|
||||
IUiAutomationConnection connection, int userId) throws RemoteException {
|
||||
IUiAutomationConnection connection, int userId, String instructionSet)
|
||||
throws RemoteException {
|
||||
Parcel data = Parcel.obtain();
|
||||
Parcel reply = Parcel.obtain();
|
||||
data.writeInterfaceToken(IActivityManager.descriptor);
|
||||
@@ -3179,6 +3182,7 @@ class ActivityManagerProxy implements IActivityManager
|
||||
data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
|
||||
data.writeStrongBinder(connection != null ? connection.asBinder() : null);
|
||||
data.writeInt(userId);
|
||||
data.writeString(instructionSet);
|
||||
mRemote.transact(START_INSTRUMENTATION_TRANSACTION, data, reply, 0);
|
||||
reply.readException();
|
||||
boolean res = reply.readInt() != 0;
|
||||
|
||||
@@ -1628,7 +1628,8 @@ class ContextImpl extends Context {
|
||||
arguments.setAllowFds(false);
|
||||
}
|
||||
return ActivityManagerNative.getDefault().startInstrumentation(
|
||||
className, profileFile, 0, arguments, null, null, getUserId());
|
||||
className, profileFile, 0, arguments, null, null, getUserId(),
|
||||
null /* ABI override */);
|
||||
} catch (RemoteException e) {
|
||||
// System has crashed, nothing we can do.
|
||||
}
|
||||
|
||||
@@ -171,7 +171,8 @@ public interface IActivityManager extends IInterface {
|
||||
|
||||
public boolean startInstrumentation(ComponentName className, String profileFile,
|
||||
int flags, Bundle arguments, IInstrumentationWatcher watcher,
|
||||
IUiAutomationConnection connection, int userId) throws RemoteException;
|
||||
IUiAutomationConnection connection, int userId,
|
||||
String abiOverride) throws RemoteException;
|
||||
public void finishInstrumentation(IApplicationThread target,
|
||||
int resultCode, Bundle results) throws RemoteException;
|
||||
|
||||
|
||||
@@ -2644,7 +2644,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
return app;
|
||||
}
|
||||
|
||||
startProcessLocked(app, hostingType, hostingNameStr);
|
||||
startProcessLocked(app, hostingType, hostingNameStr, null /* ABI override */);
|
||||
return (app.pid != 0) ? app : null;
|
||||
}
|
||||
|
||||
@@ -2653,7 +2653,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
}
|
||||
|
||||
private final void startProcessLocked(ProcessRecord app,
|
||||
String hostingType, String hostingNameStr) {
|
||||
String hostingType, String hostingNameStr, String abiOverride) {
|
||||
if (app.pid > 0 && app.pid != MY_PID) {
|
||||
synchronized (mPidsSelfLocked) {
|
||||
mPidsSelfLocked.remove(app.pid);
|
||||
@@ -2738,7 +2738,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
debugFlags |= Zygote.DEBUG_ENABLE_ASSERT;
|
||||
}
|
||||
|
||||
String requiredAbi = app.info.cpuAbi;
|
||||
String requiredAbi = (abiOverride != null) ? abiOverride : app.info.cpuAbi;
|
||||
if (requiredAbi == null) {
|
||||
requiredAbi = Build.SUPPORTED_ABIS[0];
|
||||
}
|
||||
@@ -4760,7 +4760,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
|
||||
if (app.persistent && !app.isolated) {
|
||||
if (!callerWillRestart) {
|
||||
addAppLocked(app.info, false);
|
||||
addAppLocked(app.info, false, null /* ABI override */);
|
||||
} else {
|
||||
needRestart = true;
|
||||
}
|
||||
@@ -4868,7 +4868,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
app.deathRecipient = adr;
|
||||
} catch (RemoteException e) {
|
||||
app.resetPackageList(mProcessStats);
|
||||
startProcessLocked(app, "link fail", processName);
|
||||
startProcessLocked(app, "link fail", processName, null /* ABI override */);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -4961,7 +4961,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
|
||||
app.resetPackageList(mProcessStats);
|
||||
app.unlinkDeathRecipient();
|
||||
startProcessLocked(app, "bind fail", processName);
|
||||
startProcessLocked(app, "bind fail", processName, null /* ABI override */);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -5130,7 +5130,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
for (int ip=0; ip<NP; ip++) {
|
||||
if (DEBUG_PROCESSES) Slog.v(TAG, "Starting process on hold: "
|
||||
+ procs.get(ip));
|
||||
startProcessLocked(procs.get(ip), "on-hold", null);
|
||||
startProcessLocked(procs.get(ip), "on-hold", null, null /* ABI override */);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8101,7 +8101,8 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
return new ProcessRecord(stats, info, proc, uid);
|
||||
}
|
||||
|
||||
final ProcessRecord addAppLocked(ApplicationInfo info, boolean isolated) {
|
||||
final ProcessRecord addAppLocked(ApplicationInfo info, boolean isolated,
|
||||
String abiOverride) {
|
||||
ProcessRecord app;
|
||||
if (!isolated) {
|
||||
app = getProcessRecordLocked(info.processName, info.uid, true);
|
||||
@@ -8136,7 +8137,8 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
}
|
||||
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
|
||||
mPersistentStartingProcesses.add(app);
|
||||
startProcessLocked(app, "added application", app.processName);
|
||||
startProcessLocked(app, "added application", app.processName,
|
||||
abiOverride);
|
||||
}
|
||||
|
||||
return app;
|
||||
@@ -9295,7 +9297,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
= (ApplicationInfo)apps.get(i);
|
||||
if (info != null &&
|
||||
!info.packageName.equals("android")) {
|
||||
addAppLocked(info, false);
|
||||
addAppLocked(info, false, null /* ABI override */);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12457,7 +12459,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
// We have components that still need to be running in the
|
||||
// process, so re-launch it.
|
||||
mProcessNames.put(app.processName, app.uid, app);
|
||||
startProcessLocked(app, "restart", app.processName);
|
||||
startProcessLocked(app, "restart", app.processName, null /* ABI override */);
|
||||
} else if (app.pid > 0 && app.pid != MY_PID) {
|
||||
// Goodbye!
|
||||
synchronized (mPidsSelfLocked) {
|
||||
@@ -13745,7 +13747,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
public boolean startInstrumentation(ComponentName className,
|
||||
String profileFile, int flags, Bundle arguments,
|
||||
IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection,
|
||||
int userId) {
|
||||
int userId, String abiOverride) {
|
||||
enforceNotIsolatedCaller("startInstrumentation");
|
||||
userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
|
||||
userId, false, true, "startInstrumentation", null);
|
||||
@@ -13794,7 +13796,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
// Instrumentation can kill and relaunch even persistent processes
|
||||
forceStopPackageLocked(ii.targetPackage, -1, true, false, true, true, userId,
|
||||
"start instr");
|
||||
ProcessRecord app = addAppLocked(ai, false);
|
||||
ProcessRecord app = addAppLocked(ai, false, abiOverride);
|
||||
app.instrumentationClass = className;
|
||||
app.instrumentationInfo = ai;
|
||||
app.instrumentationProfileFile = profileFile;
|
||||
@@ -15721,7 +15723,7 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
|
||||
if (app.persistent) {
|
||||
if (app.persistent) {
|
||||
addAppLocked(app.info, false);
|
||||
addAppLocked(app.info, false, null /* ABI override */);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user