Search in sources :

Example 1 with InstrumentationInfo

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

the class Pm method runListInstrumentation.

/**
     * Lists all of the installed instrumentation, or all for a given package
     *
     * pm list instrumentation [package] [-f]
     */
private void runListInstrumentation() {
    // flags != 0 is only used to request meta-data
    int flags = 0;
    boolean showPackage = false;
    String targetPackage = null;
    try {
        String opt;
        while ((opt = nextArg()) != null) {
            if (opt.equals("-f")) {
                showPackage = true;
            } else if (opt.charAt(0) != '-') {
                targetPackage = opt;
            } else {
                System.err.println("Error: Unknown option: " + opt);
                return;
            }
        }
    } catch (RuntimeException ex) {
        System.err.println("Error: " + ex.toString());
        return;
    }
    try {
        List<InstrumentationInfo> list = mPm.queryInstrumentation(targetPackage, flags);
        // Sort by target package
        Collections.sort(list, new Comparator<InstrumentationInfo>() {

            public int compare(InstrumentationInfo o1, InstrumentationInfo o2) {
                return o1.targetPackage.compareTo(o2.targetPackage);
            }
        });
        int count = (list != null) ? list.size() : 0;
        for (int p = 0; p < count; p++) {
            InstrumentationInfo ii = list.get(p);
            System.out.print("instrumentation:");
            if (showPackage) {
                System.out.print(ii.sourceDir);
                System.out.print("=");
            }
            ComponentName cn = new ComponentName(ii.packageName, ii.name);
            System.out.print(cn.flattenToShortString());
            System.out.print(" (target=");
            System.out.print(ii.targetPackage);
            System.out.println(")");
        }
    } catch (RemoteException e) {
        System.err.println(e.toString());
        System.err.println(PM_NOT_RUNNING_ERR);
    }
}
Also used : InstrumentationInfo(android.content.pm.InstrumentationInfo) ComponentName(android.content.ComponentName) RemoteException(android.os.RemoteException)

Example 2 with InstrumentationInfo

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

the class ActivityManagerService method startInstrumentation.

// =========================================================
// INSTRUMENTATION
// =========================================================
public boolean startInstrumentation(ComponentName className, String profileFile, int flags, Bundle arguments, IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection, int userId) {
    enforceNotIsolatedCaller("startInstrumentation");
    userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "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) {
            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);
        }
        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.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)

Example 3 with InstrumentationInfo

use of android.content.pm.InstrumentationInfo in project platform_frameworks_base by android.

the class ActivityThread method handleBindApplication.

private void handleBindApplication(AppBindData data) {
    // Register the UI Thread as a sensitive thread to the runtime.
    VMRuntime.registerSensitiveThread();
    if (data.trackAllocation) {
        DdmVmInternal.enableRecentAllocations(true);
    }
    // Note when this process has started.
    Process.setStartTimes(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
    mBoundApplication = data;
    mConfiguration = new Configuration(data.config);
    mCompatConfiguration = new Configuration(data.config);
    mProfiler = new Profiler();
    if (data.initProfilerInfo != null) {
        mProfiler.profileFile = data.initProfilerInfo.profileFile;
        mProfiler.profileFd = data.initProfilerInfo.profileFd;
        mProfiler.samplingInterval = data.initProfilerInfo.samplingInterval;
        mProfiler.autoStopProfiler = data.initProfilerInfo.autoStopProfiler;
        mProfiler.streamingOutput = data.initProfilerInfo.streamingOutput;
    }
    // send up app name; do this *before* waiting for debugger
    Process.setArgV0(data.processName);
    android.ddm.DdmHandleAppName.setAppName(data.processName, UserHandle.myUserId());
    if (data.persistent) {
        // overhead to the process.
        if (!ActivityManager.isHighEndGfx()) {
            ThreadedRenderer.disable(false);
        }
    }
    if (mProfiler.profileFd != null) {
        mProfiler.startProfiling();
    }
    // main thread so the main looper is set right.
    if (data.appInfo.targetSdkVersion <= android.os.Build.VERSION_CODES.HONEYCOMB_MR1) {
        AsyncTask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
    Message.updateCheckRecycle(data.appInfo.targetSdkVersion);
    /*
         * 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);
    /*
         * Set the LocaleList. This may change once we create the App Context.
         */
    LocaleList.setDefault(data.config.getLocales());
    synchronized (mResourcesManager) {
        /*
             * 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
             */
        mResourcesManager.applyConfigurationToResourcesLocked(data.config, data.compatInfo);
        mCurDefaultDisplayDpi = data.config.densityDpi;
        // This calls mResourcesManager so keep it within the synchronized block.
        applyCompatConfiguration(mCurDefaultDisplayDpi);
    }
    data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
    /**
         * Switch this process to density compatibility mode if needed.
         */
    if ((data.appInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) == 0) {
        mDensityCompatMode = true;
        Bitmap.setDefaultDensity(DisplayMetrics.DENSITY_DEFAULT);
    }
    updateDefaultDensity();
    final String use24HourSetting = mCoreSettings.getString(Settings.System.TIME_12_24);
    Boolean is24Hr = null;
    if (use24HourSetting != null) {
        is24Hr = "24".equals(use24HourSetting) ? Boolean.TRUE : Boolean.FALSE;
    }
    // null : use locale default for 12/24 hour formatting,
    // false : use 12 hour format,
    // true : use 24 hour format.
    DateFormat.set24HourTimePref(is24Hr);
    View.mDebugViewAttributes = mCoreSettings.getInt(Settings.Global.DEBUG_VIEW_ATTRIBUTES, 0) != 0;
    /**
         * 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 Honeycomb or later, we don't allow network usage
         * on the main event loop / UI thread. This is what ultimately throws
         * {@link NetworkOnMainThreadException}.
         */
    if (data.appInfo.targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB) {
        StrictMode.enableDeathOnNetwork();
    }
    /**
         * For apps targetting N or later, we don't allow file:// Uri exposure.
         * This is what ultimately throws {@link FileUriExposedException}.
         */
    if (data.appInfo.targetSdkVersion >= Build.VERSION_CODES.N) {
        StrictMode.enableDeathOnFileUriExposure();
    }
    NetworkSecurityPolicy.getInstance().setCleartextTrafficPermitted((data.appInfo.flags & ApplicationInfo.FLAG_USES_CLEARTEXT_TRAFFIC) != 0);
    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) {
                throw ex.rethrowFromSystemServer();
            }
            Debug.waitForDebugger();
            try {
                mgr.showWaitingForDebugger(mAppThread, false);
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }
        } else {
            Slog.w(TAG, "Application " + data.info.getPackageName() + " can be debugged on port 8100...");
        }
    }
    // Allow application-generated systrace messages if we're debuggable.
    boolean isAppDebuggable = (data.appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
    Trace.setAppTracingAllowed(isAppDebuggable);
    if (isAppDebuggable && data.enableBinderTracking) {
        Binder.enableTracing();
    }
    /**
         * Initialize the default http proxy in this process for the reasons we set the time zone.
         */
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Setup proxies");
    final IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
    if (b != null) {
        // In pre-boot mode (doing initial launch to collect password), not
        // all system is up.  This includes the connectivity service, so don't
        // crash if we can't get it.
        final IConnectivityManager service = IConnectivityManager.Stub.asInterface(b);
        try {
            final ProxyInfo proxyInfo = service.getProxyForNetwork(null);
            Proxy.setHttpProxySystemProperty(proxyInfo);
        } catch (RemoteException e) {
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            throw e.rethrowFromSystemServer();
        }
    }
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
    // Instrumentation info affects the class loader, so load it before
    // setting up the app context.
    final InstrumentationInfo ii;
    if (data.instrumentationName != null) {
        try {
            ii = new ApplicationPackageManager(null, getPackageManager()).getInstrumentationInfo(data.instrumentationName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException("Unable to find instrumentation info for: " + data.instrumentationName);
        }
        mInstrumentationPackageName = ii.packageName;
        mInstrumentationAppDir = ii.sourceDir;
        mInstrumentationSplitAppDirs = ii.splitSourceDirs;
        mInstrumentationLibDir = getInstrumentationLibrary(data.appInfo, ii);
        mInstrumentedAppDir = data.info.getAppDir();
        mInstrumentedSplitAppDirs = data.info.getSplitAppDirs();
        mInstrumentedLibDir = data.info.getLibDir();
    } else {
        ii = null;
    }
    final ContextImpl appContext = ContextImpl.createAppContext(this, data.info);
    updateLocaleListFromAppContext(appContext, mResourcesManager.getConfiguration().getLocales());
    if (!Process.isIsolated() && !"android".equals(appContext.getPackageName())) {
        // This cache location probably points at credential-encrypted
        // storage which may not be accessible yet; assign it anyway instead
        // of pointing at device-encrypted storage.
        final File cacheDir = appContext.getCacheDir();
        if (cacheDir != null) {
            // Provide a usable directory for temporary files
            System.setProperty("java.io.tmpdir", cacheDir.getAbsolutePath());
        } else {
            Log.v(TAG, "Unable to initialize \"java.io.tmpdir\" property " + "due to missing cache directory");
        }
        // Setup a location to store generated/compiled graphics code.
        final Context deviceContext = appContext.createDeviceProtectedStorageContext();
        final File codeCacheDir = deviceContext.getCodeCacheDir();
        if (codeCacheDir != null) {
            setupGraphicsSupport(data.info, codeCacheDir);
        } else {
            Log.e(TAG, "Unable to setupGraphicsSupport due to missing code-cache directory");
        }
    }
    // Install the Network Security Config Provider. This must happen before the application
    // code is loaded to prevent issues with instances of TLS objects being created before
    // the provider is installed.
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "NetworkSecurityConfigProvider.install");
    NetworkSecurityConfigProvider.install(appContext);
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
    // Continue loading instrumentation.
    if (ii != null) {
        final ApplicationInfo instrApp = new ApplicationInfo();
        ii.copyTo(instrApp);
        instrApp.initForUser(UserHandle.myUserId());
        final LoadedApk pi = getPackageInfo(instrApp, data.compatInfo, appContext.getClassLoader(), false, true, false);
        final ContextImpl instrContext = ContextImpl.createAppContext(this, pi);
        try {
            final 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);
        }
        final ComponentName component = new ComponentName(ii.packageName, ii.name);
        mInstrumentation.init(this, instrContext, appContext, component, data.instrumentationWatcher, data.instrumentationUiAutomationConnection);
        if (mProfiler.profileFile != null && !ii.handleProfiling && mProfiler.profileFd == null) {
            mProfiler.handlingProfiling = true;
            final File file = new File(mProfiler.profileFile);
            file.getParentFile().mkdirs();
            Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
        }
    } else {
        mInstrumentation = new Instrumentation();
    }
    if ((data.appInfo.flags & ApplicationInfo.FLAG_LARGE_HEAP) != 0) {
        dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();
    } else {
        // Small heap, clamp to the current growth limit and let the heap release
        // pages after the growth limit to the non growth limit capacity. b/18387825
        dalvik.system.VMRuntime.getRuntime().clampGrowthLimit();
    }
    // Allow disk access during application and provider setup. This could
    // block processing ordered broadcasts, but later processing would
    // probably end up doing the same disk access.
    final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskWrites();
    try {
        // 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) {
            if (!ArrayUtils.isEmpty(data.providers)) {
                installContentProviders(app, data.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);
            }
        }
        // test thread at this point, and we don't want that racing.
        try {
            mInstrumentation.onCreate(data.instrumentationArgs);
        } catch (Exception e) {
            throw new RuntimeException("Exception thrown in onCreate() of " + data.instrumentationName + ": " + e.toString(), e);
        }
        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);
            }
        }
    } finally {
        StrictMode.setThreadPolicy(savedPolicy);
    }
}
Also used : Configuration(android.content.res.Configuration) ApplicationInfo(android.content.pm.ApplicationInfo) ProxyInfo(android.net.ProxyInfo) StrictMode(android.os.StrictMode) IBinder(android.os.IBinder) AndroidRuntimeException(android.util.AndroidRuntimeException) PackageManager(android.content.pm.PackageManager) IPackageManager(android.content.pm.IPackageManager) IConnectivityManager(android.net.IConnectivityManager) ComponentName(android.content.ComponentName) Context(android.content.Context) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) RemoteException(android.os.RemoteException) IOException(java.io.IOException) ErrnoException(android.system.ErrnoException) AndroidRuntimeException(android.util.AndroidRuntimeException) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) SuperNotCalledException(android.util.SuperNotCalledException) TransactionTooLargeException(android.os.TransactionTooLargeException) InstrumentationInfo(android.content.pm.InstrumentationInfo) RemoteException(android.os.RemoteException) File(java.io.File)

Example 4 with InstrumentationInfo

use of android.content.pm.InstrumentationInfo in project VirtualApp by asLody.

the class PackageParserEx method generateInstrumentationInfo.

public static InstrumentationInfo generateInstrumentationInfo(VPackage.InstrumentationComponent i, int flags) {
    if (i == null)
        return null;
    if ((flags & PackageManager.GET_META_DATA) == 0) {
        return i.info;
    }
    InstrumentationInfo ii = new InstrumentationInfo(i.info);
    ii.metaData = i.metaData;
    return ii;
}
Also used : InstrumentationInfo(android.content.pm.InstrumentationInfo)

Example 5 with InstrumentationInfo

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

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