Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7871c31 authored by Narayan Kamath's avatar Narayan Kamath Committed by Android Git Automerger
Browse files

am b9b31f4b: am bd4d3203: Merge "Support an ABI flag for instrumentation."

* commit 'b9b31f4b':
  Support an ABI flag for instrumentation.
parents 92ab0b91 b9b31f4b
Loading
Loading
Loading
Loading
+29 −2
Original line number Diff line number Diff line
@@ -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());
        }

+6 −2
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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.
        }
+2 −1
Original line number Diff line number Diff line
@@ -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;

+16 −14
Original line number Diff line number Diff line
@@ -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 */);
                        }
                    }
                }