Search in sources :

Example 16 with InstrumentationInfo

use of android.content.pm.InstrumentationInfo in project XobotOS by xamarin.

the class ActivityThread method handleBindApplication.

private void handleBindApplication(AppBindData data) {
    mBoundApplication = data;
    mConfiguration = new Configuration(data.config);
    mCompatConfiguration = new Configuration(data.config);
    mProfiler = new Profiler();
    mProfiler.profileFile = data.initProfileFile;
    mProfiler.profileFd = data.initProfileFd;
    mProfiler.autoStopProfiler = data.initAutoStopProfiler;
    // send up app name; do this *before* waiting for debugger
    Process.setArgV0(data.processName);
    android.ddm.DdmHandleAppName.setAppName(data.processName);
    if (data.persistent) {
        // Persistent processes on low-memory devices do not get to
        // use hardware accelerated drawing, since this can add too much
        // overhead to the process.
        Display display = WindowManagerImpl.getDefault().getDefaultDisplay();
        if (!ActivityManager.isHighEndGfx(display)) {
            HardwareRenderer.disable(false);
        }
    }
    if (mProfiler.profileFd != null) {
        mProfiler.startProfiling();
    }
    // main thread so the main looper is set right.
    if (data.appInfo.targetSdkVersion <= 12) {
        AsyncTask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
    /*
         * Before spawning a new process, reset the time zone to be the system time zone.
         * This needs to be done because the system time zone could have changed after the
         * the spawning of this process. Without doing this this process would have the incorrect
         * system time zone.
         */
    TimeZone.setDefault(null);
    /*
         * Initialize the default locale in this process for the reasons we set the time zone.
         */
    Locale.setDefault(data.config.locale);
    /*
         * Update the system configuration since its preloaded and might not
         * reflect configuration changes. The configuration object passed
         * in AppBindData can be safely assumed to be up to date
         */
    applyConfigurationToResourcesLocked(data.config, data.compatInfo);
    applyCompatConfiguration();
    data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
    /**
         * For system applications on userdebug/eng builds, log stack
         * traces of disk and network access to dropbox for analysis.
         */
    if ((data.appInfo.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0) {
        StrictMode.conditionallyEnableDebugLogging();
    }
    /**
         * For apps targetting SDK Honeycomb or later, we don't allow
         * network usage on the main event loop / UI thread.
         *
         * Note to those grepping:  this is what ultimately throws
         * NetworkOnMainThreadException ...
         */
    if (data.appInfo.targetSdkVersion > 9) {
        StrictMode.enableDeathOnNetwork();
    }
    /**
         * Switch this process to density compatibility mode if needed.
         */
    if ((data.appInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) == 0) {
        Bitmap.setDefaultDensity(DisplayMetrics.DENSITY_DEFAULT);
    }
    if (data.debugMode != IApplicationThread.DEBUG_OFF) {
        // XXX should have option to change the port.
        Debug.changeDebugPort(8100);
        if (data.debugMode == IApplicationThread.DEBUG_WAIT) {
            Slog.w(TAG, "Application " + data.info.getPackageName() + " is waiting for the debugger on port 8100...");
            IActivityManager mgr = ActivityManagerNative.getDefault();
            try {
                mgr.showWaitingForDebugger(mAppThread, true);
            } catch (RemoteException ex) {
            }
            Debug.waitForDebugger();
            try {
                mgr.showWaitingForDebugger(mAppThread, false);
            } catch (RemoteException ex) {
            }
        } else {
            Slog.w(TAG, "Application " + data.info.getPackageName() + " can be debugged on port 8100...");
        }
    }
    /**
         * Initialize the default http proxy in this process for the reasons we set the time zone.
         */
    IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
    IConnectivityManager service = IConnectivityManager.Stub.asInterface(b);
    try {
        ProxyProperties proxyProperties = service.getProxy();
        Proxy.setHttpProxySystemProperty(proxyProperties);
    } catch (RemoteException e) {
    }
    if (data.instrumentationName != null) {
        ContextImpl appContext = new ContextImpl();
        appContext.init(data.info, null, this);
        InstrumentationInfo ii = null;
        try {
            ii = appContext.getPackageManager().getInstrumentationInfo(data.instrumentationName, 0);
        } catch (PackageManager.NameNotFoundException e) {
        }
        if (ii == null) {
            throw new RuntimeException("Unable to find instrumentation info for: " + data.instrumentationName);
        }
        mInstrumentationAppDir = ii.sourceDir;
        mInstrumentationAppPackage = ii.packageName;
        mInstrumentedAppDir = data.info.getAppDir();
        ApplicationInfo instrApp = new ApplicationInfo();
        instrApp.packageName = ii.packageName;
        instrApp.sourceDir = ii.sourceDir;
        instrApp.publicSourceDir = ii.publicSourceDir;
        instrApp.dataDir = ii.dataDir;
        instrApp.nativeLibraryDir = ii.nativeLibraryDir;
        LoadedApk pi = getPackageInfo(instrApp, data.compatInfo, appContext.getClassLoader(), false, true);
        ContextImpl instrContext = new ContextImpl();
        instrContext.init(pi, null, this);
        try {
            java.lang.ClassLoader cl = instrContext.getClassLoader();
            mInstrumentation = (Instrumentation) cl.loadClass(data.instrumentationName.getClassName()).newInstance();
        } catch (Exception e) {
            throw new RuntimeException("Unable to instantiate instrumentation " + data.instrumentationName + ": " + e.toString(), e);
        }
        mInstrumentation.init(this, instrContext, appContext, new ComponentName(ii.packageName, ii.name), data.instrumentationWatcher);
        if (mProfiler.profileFile != null && !ii.handleProfiling && mProfiler.profileFd == null) {
            mProfiler.handlingProfiling = true;
            File file = new File(mProfiler.profileFile);
            file.getParentFile().mkdirs();
            Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
        }
        try {
            mInstrumentation.onCreate(data.instrumentationArgs);
        } catch (Exception e) {
            throw new RuntimeException("Exception thrown in onCreate() of " + data.instrumentationName + ": " + e.toString(), e);
        }
    } else {
        mInstrumentation = new Instrumentation();
    }
    if ((data.appInfo.flags & ApplicationInfo.FLAG_LARGE_HEAP) != 0) {
        dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();
    }
    // If the app is being launched for full backup or restore, bring it up in
    // a restricted environment with the base application class.
    Application app = data.info.makeApplication(data.restrictedBackupMode, null);
    mInitialApplication = app;
    // app's custom Application class
    if (!data.restrictedBackupMode) {
        List<ProviderInfo> providers = data.providers;
        if (providers != null) {
            installContentProviders(app, providers);
            // For process that contains content providers, we want to
            // ensure that the JIT is enabled "at some point".
            mH.sendEmptyMessageDelayed(H.ENABLE_JIT, 10 * 1000);
        }
    }
    try {
        mInstrumentation.callApplicationOnCreate(app);
    } catch (Exception e) {
        if (!mInstrumentation.onException(app, e)) {
            throw new RuntimeException("Unable to create application " + app.getClass().getName() + ": " + e.toString(), e);
        }
    }
}
Also used : ProxyProperties(android.net.ProxyProperties) Configuration(android.content.res.Configuration) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) ApplicationInfo(android.content.pm.ApplicationInfo) AndroidRuntimeException(android.util.AndroidRuntimeException) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) RemoteException(android.os.RemoteException) IOException(java.io.IOException) IBinder(android.os.IBinder) AndroidRuntimeException(android.util.AndroidRuntimeException) PackageManager(android.content.pm.PackageManager) IPackageManager(android.content.pm.IPackageManager) ProviderInfo(android.content.pm.ProviderInfo) InstrumentationInfo(android.content.pm.InstrumentationInfo) IConnectivityManager(android.net.IConnectivityManager) ComponentName(android.content.ComponentName) RemoteException(android.os.RemoteException) File(java.io.File) Display(android.view.Display)

Example 17 with InstrumentationInfo

use of android.content.pm.InstrumentationInfo in project cornerstone by Onskreen.

the class ActivityManagerService method startInstrumentation.

// =========================================================
// INSTRUMENTATION
// =========================================================
public boolean startInstrumentation(ComponentName className, String profileFile, int flags, Bundle arguments, IInstrumentationWatcher watcher) {
    enforceNotIsolatedCaller("startInstrumentation");
    // Refuse possible leaked file descriptors
    if (arguments != null && arguments.hasFileDescriptors()) {
        throw new IllegalArgumentException("File descriptors passed in Bundle");
    }
    synchronized (this) {
        InstrumentationInfo ii = null;
        ApplicationInfo ai = null;
        try {
            ii = mContext.getPackageManager().getInstrumentationInfo(className, STOCK_PM_FLAGS);
            ai = mContext.getPackageManager().getApplicationInfo(ii.targetPackage, STOCK_PM_FLAGS);
        } catch (PackageManager.NameNotFoundException e) {
        }
        if (ii == null) {
            reportStartInstrumentationFailure(watcher, className, "Unable to find instrumentation info for: " + className);
            return false;
        }
        if (ai == null) {
            reportStartInstrumentationFailure(watcher, className, "Unable to find instrumentation target package: " + ii.targetPackage);
            return false;
        }
        int match = mContext.getPackageManager().checkSignatures(ii.targetPackage, ii.packageName);
        if (match < 0 && match != PackageManager.SIGNATURE_FIRST_NOT_SIGNED) {
            String msg = "Permission Denial: starting instrumentation " + className + " from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingPid() + " not allowed because package " + ii.packageName + " does not have a signature matching the target " + ii.targetPackage;
            reportStartInstrumentationFailure(watcher, className, msg);
            throw new SecurityException(msg);
        }
        int userId = UserId.getCallingUserId();
        final long origId = Binder.clearCallingIdentity();
        // Instrumentation can kill and relaunch even persistent processes
        forceStopPackageLocked(ii.targetPackage, -1, true, false, true, true, userId);
        ProcessRecord app = addAppLocked(ai, false);
        app.instrumentationClass = className;
        app.instrumentationInfo = ai;
        app.instrumentationProfileFile = profileFile;
        app.instrumentationArguments = arguments;
        app.instrumentationWatcher = watcher;
        app.instrumentationResultClass = className;
        Binder.restoreCallingIdentity(origId);
    }
    return true;
}
Also used : NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) PackageManager(android.content.pm.PackageManager) IPackageManager(android.content.pm.IPackageManager) InstrumentationInfo(android.content.pm.InstrumentationInfo) ApplicationInfo(android.content.pm.ApplicationInfo)

Example 18 with InstrumentationInfo

use of android.content.pm.InstrumentationInfo in project android_frameworks_base by DirtyUnicorns.

the class Am method runInstrument.

private void runInstrument() throws Exception {
    String profileFile = null;
    boolean wait = false;
    boolean rawMode = false;
    boolean no_window_animation = false;
    int userId = UserHandle.USER_CURRENT;
    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) {
        if (opt.equals("-p")) {
            profileFile = nextArgRequired();
        } else if (opt.equals("-w")) {
            wait = true;
        } else if (opt.equals("-r")) {
            rawMode = true;
        } else if (opt.equals("-e")) {
            argKey = nextArgRequired();
            argValue = nextArgRequired();
            args.putString(argKey, argValue);
        } else if (opt.equals("--no_window_animation") || opt.equals("--no-window-animation")) {
            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;
        }
    }
    if (userId == UserHandle.USER_ALL) {
        System.err.println("Error: Can't start instrumentation with user 'all'");
        return;
    }
    String cnArg = nextArgRequired();
    ComponentName cn;
    if (cnArg.contains("/")) {
        cn = ComponentName.unflattenFromString(cnArg);
        if (cn == null)
            throw new IllegalArgumentException("Bad component name: " + cnArg);
    } else {
        List<InstrumentationInfo> infos = mPm.queryInstrumentation(null, 0).getList();
        final int numInfos = infos == null ? 0 : infos.size();
        List<ComponentName> cns = new ArrayList<>();
        for (int i = 0; i < numInfos; i++) {
            InstrumentationInfo info = infos.get(i);
            ComponentName c = new ComponentName(info.packageName, info.name);
            if (cnArg.equals(info.packageName)) {
                cns.add(c);
            }
        }
        if (cns.size() == 0) {
            throw new IllegalArgumentException("No instrumentation found for: " + cnArg);
        } else if (cns.size() == 1) {
            cn = cns.get(0);
        } else {
            StringBuilder cnsStr = new StringBuilder();
            final int numCns = cns.size();
            for (int i = 0; i < numCns; i++) {
                cnsStr.append(cns.get(i).flattenToString());
                cnsStr.append(", ");
            }
            // Remove last ", "
            cnsStr.setLength(cnsStr.length() - 2);
            throw new IllegalArgumentException("Found multiple instrumentations: " + cnsStr.toString());
        }
    }
    InstrumentationWatcher watcher = null;
    UiAutomationConnection connection = null;
    if (wait) {
        watcher = new InstrumentationWatcher();
        watcher.setRawOutput(rawMode);
        connection = new UiAutomationConnection();
    }
    float[] oldAnims = null;
    if (no_window_animation) {
        oldAnims = wm.getAnimationScales();
        wm.setAnimationScale(0, 0.0f);
        wm.setAnimationScale(1, 0.0f);
    }
    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());
    }
    if (watcher != null) {
        if (!watcher.waitForFinish()) {
            System.out.println("INSTRUMENTATION_ABORTED: System has crashed.");
        }
    }
    if (oldAnims != null) {
        wm.setAnimationScales(oldAnims);
    }
}
Also used : IWindowManager(android.view.IWindowManager) Bundle(android.os.Bundle) ArrayList(java.util.ArrayList) IInstrumentationWatcher(android.app.IInstrumentationWatcher) UiAutomationConnection(android.app.UiAutomationConnection) AndroidException(android.util.AndroidException) InstrumentationInfo(android.content.pm.InstrumentationInfo) ComponentName(android.content.ComponentName)

Example 19 with InstrumentationInfo

use of android.content.pm.InstrumentationInfo in project android_frameworks_base by DirtyUnicorns.

the class ActivityManagerService method startInstrumentation.

// =========================================================
// INSTRUMENTATION
// =========================================================
public boolean startInstrumentation(ComponentName className, String profileFile, int flags, Bundle arguments, IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection, int userId, String abiOverride) {
    enforceNotIsolatedCaller("startInstrumentation");
    userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, ALLOW_FULL_ONLY, "startInstrumentation", null);
    // Refuse possible leaked file descriptors
    if (arguments != null && arguments.hasFileDescriptors()) {
        throw new IllegalArgumentException("File descriptors passed in Bundle");
    }
    synchronized (this) {
        InstrumentationInfo ii = null;
        ApplicationInfo ai = null;
        try {
            ii = mContext.getPackageManager().getInstrumentationInfo(className, STOCK_PM_FLAGS);
            ai = AppGlobals.getPackageManager().getApplicationInfo(ii.targetPackage, STOCK_PM_FLAGS, userId);
        } catch (PackageManager.NameNotFoundException e) {
        } catch (RemoteException e) {
        }
        if (ii == null) {
            reportStartInstrumentationFailureLocked(watcher, className, "Unable to find instrumentation info for: " + className);
            return false;
        }
        if (ai == null) {
            reportStartInstrumentationFailureLocked(watcher, className, "Unable to find instrumentation target package: " + ii.targetPackage);
            return false;
        }
        if (!ai.hasCode()) {
            reportStartInstrumentationFailureLocked(watcher, className, "Instrumentation target has no code: " + ii.targetPackage);
            return false;
        }
        int match = mContext.getPackageManager().checkSignatures(ii.targetPackage, ii.packageName);
        if (match < 0 && match != PackageManager.SIGNATURE_FIRST_NOT_SIGNED) {
            String msg = "Permission Denial: starting instrumentation " + className + " from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingPid() + " not allowed because package " + ii.packageName + " does not have a signature matching the target " + ii.targetPackage;
            reportStartInstrumentationFailureLocked(watcher, className, msg);
            throw new SecurityException(msg);
        }
        final long origId = Binder.clearCallingIdentity();
        // Instrumentation can kill and relaunch even persistent processes
        forceStopPackageLocked(ii.targetPackage, -1, true, false, true, true, false, userId, "start instr");
        ProcessRecord app = addAppLocked(ai, false, abiOverride);
        app.instrumentationClass = className;
        app.instrumentationInfo = ai;
        app.instrumentationProfileFile = profileFile;
        app.instrumentationArguments = arguments;
        app.instrumentationWatcher = watcher;
        app.instrumentationUiAutomationConnection = uiAutomationConnection;
        app.instrumentationResultClass = className;
        Binder.restoreCallingIdentity(origId);
    }
    return true;
}
Also used : NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) PackageManager(android.content.pm.PackageManager) IPackageManager(android.content.pm.IPackageManager) InstrumentationInfo(android.content.pm.InstrumentationInfo) ApplicationInfo(android.content.pm.ApplicationInfo) RemoteException(android.os.RemoteException) Point(android.graphics.Point)

Example 20 with InstrumentationInfo

use of android.content.pm.InstrumentationInfo in project android_frameworks_base by ResurrectionRemix.

the class PackageManagerShellCommand method runListInstrumentation.

private int runListInstrumentation() throws RemoteException {
    final PrintWriter pw = getOutPrintWriter();
    boolean showSourceDir = false;
    String targetPackage = null;
    try {
        String opt;
        while ((opt = getNextArg()) != null) {
            switch(opt) {
                case "-f":
                    showSourceDir = true;
                    break;
                default:
                    if (opt.charAt(0) != '-') {
                        targetPackage = opt;
                    } else {
                        pw.println("Error: Unknown option: " + opt);
                        return -1;
                    }
                    break;
            }
        }
    } catch (RuntimeException ex) {
        pw.println("Error: " + ex.toString());
        return -1;
    }
    final List<InstrumentationInfo> list = mInterface.queryInstrumentation(targetPackage, 0).getList();
    // sort by target package
    Collections.sort(list, new Comparator<InstrumentationInfo>() {

        public int compare(InstrumentationInfo o1, InstrumentationInfo o2) {
            return o1.targetPackage.compareTo(o2.targetPackage);
        }
    });
    final int count = (list != null) ? list.size() : 0;
    for (int p = 0; p < count; p++) {
        final InstrumentationInfo ii = list.get(p);
        pw.print("instrumentation:");
        if (showSourceDir) {
            pw.print(ii.sourceDir);
            pw.print("=");
        }
        final ComponentName cn = new ComponentName(ii.packageName, ii.name);
        pw.print(cn.flattenToShortString());
        pw.print(" (target=");
        pw.print(ii.targetPackage);
        pw.println(")");
    }
    return 0;
}
Also used : InstrumentationInfo(android.content.pm.InstrumentationInfo) ComponentName(android.content.ComponentName) PrintWriter(java.io.PrintWriter)

Aggregations

InstrumentationInfo (android.content.pm.InstrumentationInfo)22 ComponentName (android.content.ComponentName)17 ApplicationInfo (android.content.pm.ApplicationInfo)11 IPackageManager (android.content.pm.IPackageManager)11 PackageManager (android.content.pm.PackageManager)11 NameNotFoundException (android.content.pm.PackageManager.NameNotFoundException)11 RemoteException (android.os.RemoteException)11 Configuration (android.content.res.Configuration)7 IConnectivityManager (android.net.IConnectivityManager)7 IBinder (android.os.IBinder)7 AndroidRuntimeException (android.util.AndroidRuntimeException)7 File (java.io.File)7 IOException (java.io.IOException)7 StrictMode (android.os.StrictMode)6 IInstrumentationWatcher (android.app.IInstrumentationWatcher)5 UiAutomationConnection (android.app.UiAutomationConnection)5 Context (android.content.Context)5 ProxyInfo (android.net.ProxyInfo)5 Bundle (android.os.Bundle)5 TransactionTooLargeException (android.os.TransactionTooLargeException)5