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

Commit 1655be46 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix issue #1837610 and #1753079

Issue 1837610 Adding a Widget before Running the Associated App Causes a Force Close

We were not retrieving the shared libraries of an application when deliving a
broadcast to an explicit component.

Issue 1753079 loading class path of instrumented app into instrumentation may load wrong path when instrumented app shares process with other apps:

We were using the ApplicationInfo that was used to originally create the process, not the one that the
instrumentation is against.
parent 5e1d8aed
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -171,6 +171,14 @@ public abstract class PackageManager {
     */
    public static final int GET_SUPPORTS_DENSITIES    = 0x00008000;

    /**
     * Resolution and querying flag: if set, only filters that support the
     * {@link android.content.Intent#CATEGORY_DEFAULT} will be considered for
     * matching.  This is a synonym for including the CATEGORY_DEFAULT in your
     * supplied Intent.
     */
    public static final int MATCH_DEFAULT_ONLY   = 0x00010000;

    /**
     * Permission check result: this is returned by {@link #checkPermission}
     * if the permission has been granted to the given package.
@@ -219,14 +227,6 @@ public abstract class PackageManager {
     */
    public static final int SIGNATURE_UNKNOWN_PACKAGE = -4;

    /**
     * Resolution and querying flag: if set, only filters that support the
     * {@link android.content.Intent#CATEGORY_DEFAULT} will be considered for
     * matching.  This is a synonym for including the CATEGORY_DEFAULT in your
     * supplied Intent.
     */
    public static final int MATCH_DEFAULT_ONLY   = 0x00010000;

    public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0;
    public static final int COMPONENT_ENABLED_STATE_ENABLED = 1;
    public static final int COMPONENT_ENABLED_STATE_DISABLED = 2;
+24 −19
Original line number Diff line number Diff line
@@ -169,6 +169,10 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
    static final int LOG_BOOT_PROGRESS_AMS_READY = 3040;
    static final int LOG_BOOT_PROGRESS_ENABLE_SCREEN = 3050;

    // The flags that are set for all calls we make to the package manager.
    static final int STOCK_PM_FLAGS = PackageManager.GET_SHARED_LIBRARY_FILES
            | PackageManager.GET_SUPPORTS_DENSITIES;
    
    private static final String SYSTEM_SECURE = "ro.secure";

    // This is the maximum number of application processes we would like
@@ -1058,7 +1062,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen

            ApplicationInfo info =
                mSelf.mContext.getPackageManager().getApplicationInfo(
                        "android", PackageManager.GET_SHARED_LIBRARY_FILES);
                        "android", STOCK_PM_FLAGS);
            synchronized (mSelf) {
                ProcessRecord app = mSelf.newProcessRecordLocked(
                        mSystemThread.getApplicationThread(), info,
@@ -2224,7 +2228,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            }
            ActivityInfo aInfo =
                intent.resolveActivityInfo(mContext.getPackageManager(),
                        PackageManager.GET_SHARED_LIBRARY_FILES);
                        STOCK_PM_FLAGS);
            if (aInfo != null) {
                intent.setComponent(new ComponentName(
                        aInfo.applicationInfo.packageName, aInfo.name));
@@ -3181,7 +3185,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                ActivityThread.getPackageManager().resolveIntent(
                        intent, resolvedType,
                        PackageManager.MATCH_DEFAULT_ONLY
                        | PackageManager.GET_SHARED_LIBRARY_FILES);
                        | STOCK_PM_FLAGS);
            aInfo = rInfo != null ? rInfo.activityInfo : null;
        } catch (RemoteException e) {
            aInfo = null;
@@ -3242,8 +3246,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                List<ResolveInfo> resolves =
                    ActivityThread.getPackageManager().queryIntentActivities(
                            intent, r.resolvedType,
                            PackageManager.MATCH_DEFAULT_ONLY
                            | PackageManager.GET_SHARED_LIBRARY_FILES);
                            PackageManager.MATCH_DEFAULT_ONLY | STOCK_PM_FLAGS);

                // Look for the original activity in the list...
                final int N = resolves != null ? resolves.size() : 0;
@@ -3325,8 +3328,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            ResolveInfo rInfo =
                ActivityThread.getPackageManager().resolveIntent(
                        intent, resolvedType,
                        PackageManager.MATCH_DEFAULT_ONLY
                        | PackageManager.GET_SHARED_LIBRARY_FILES);
                        PackageManager.MATCH_DEFAULT_ONLY | STOCK_PM_FLAGS);
            aInfo = rInfo != null ? rInfo.activityInfo : null;
        } catch (RemoteException e) {
            aInfo = null;
@@ -4608,7 +4610,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                    mWaitForDebugger = mOrigWaitForDebugger;
                }
            }
            thread.bindApplication(processName, app.info, providers,
            thread.bindApplication(processName, app.instrumentationInfo != null
                    ? app.instrumentationInfo : app.info, providers,
                    app.instrumentationClass, app.instrumentationProfileFile,
                    app.instrumentationArguments, app.instrumentationWatcher, testMode, 
                    mConfiguration, getCommonServicesLocked());
@@ -6651,8 +6654,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
        try {
            providers = ActivityThread.getPackageManager().
                queryContentProviders(app.processName, app.info.uid,
                        PackageManager.GET_SHARED_LIBRARY_FILES
                        | PackageManager.GET_URI_PERMISSION_PATTERNS);
                        STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS);
        } catch (RemoteException ex) {
        }
        if (providers != null) {
@@ -6756,7 +6758,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            } else {
                try {
                    cpi = ActivityThread.getPackageManager().
                        resolveContentProvider(name, PackageManager.GET_URI_PERMISSION_PATTERNS);
                        resolveContentProvider(name,
                                STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS);
                } catch (RemoteException ex) {
                }
                if (cpi == null) {
@@ -6777,7 +6780,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                            ActivityThread.getPackageManager().
                                getApplicationInfo(
                                        cpi.applicationInfo.packageName,
                                        PackageManager.GET_SHARED_LIBRARY_FILES);
                                        STOCK_PM_FLAGS);
                        if (ai == null) {
                            Log.w(TAG, "No package info for content provider "
                                    + cpi.name);
@@ -7513,7 +7516,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {
                ResolveInfo ri = mContext.getPackageManager()
                        .resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST),
                                0);
                                STOCK_PM_FLAGS);
                CharSequence errorMsg = null;
                if (ri != null) {
                    ActivityInfo ai = ri.activityInfo;
@@ -7549,7 +7552,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
                try {
                    List apps = ActivityThread.getPackageManager().
                        getPersistentApplications(PackageManager.GET_SHARED_LIBRARY_FILES);
                        getPersistentApplications(STOCK_PM_FLAGS);
                    if (apps != null) {
                        int N = apps.size();
                        int i;
@@ -8964,7 +8967,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            try {
                ResolveInfo rInfo =
                    ActivityThread.getPackageManager().resolveService(
                            service, resolvedType, PackageManager.GET_SHARED_LIBRARY_FILES);
                            service, resolvedType, STOCK_PM_FLAGS);
                ServiceInfo sInfo =
                    rInfo != null ? rInfo.serviceInfo : null;
                if (sInfo == null) {
@@ -10182,7 +10185,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            if (intent.getComponent() != null) {
                // Broadcast is going to one specific receiver class...
                ActivityInfo ai = ActivityThread.getPackageManager().
                    getReceiverInfo(intent.getComponent(), 0);
                    getReceiverInfo(intent.getComponent(), STOCK_PM_FLAGS);
                if (ai != null) {
                    receivers = new ArrayList();
                    ResolveInfo ri = new ResolveInfo();
@@ -10195,7 +10198,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                         == 0) {
                    receivers =
                        ActivityThread.getPackageManager().queryIntentReceivers(
                                intent, resolvedType, PackageManager.GET_SHARED_LIBRARY_FILES);
                                intent, resolvedType, STOCK_PM_FLAGS);
                }
                registeredReceivers = mReceiverResolver.queryIntent(resolver,
                        intent, resolvedType, false);
@@ -10932,9 +10935,9 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            ApplicationInfo ai = null;
            try {
                ii = mContext.getPackageManager().getInstrumentationInfo(
                    className, 0);
                    className, STOCK_PM_FLAGS);
                ai = mContext.getPackageManager().getApplicationInfo(
                    ii.targetPackage, PackageManager.GET_SHARED_LIBRARY_FILES);
                    ii.targetPackage, STOCK_PM_FLAGS);
            } catch (PackageManager.NameNotFoundException e) {
            }
            if (ii == null) {
@@ -10966,6 +10969,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            uninstallPackageLocked(ii.targetPackage, -1, true);
            ProcessRecord app = addAppLocked(ai);
            app.instrumentationClass = className;
            app.instrumentationInfo = ai;
            app.instrumentationProfileFile = profileFile;
            app.instrumentationArguments = arguments;
            app.instrumentationWatcher = watcher;
@@ -11013,6 +11017,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
        }
        app.instrumentationWatcher = null;
        app.instrumentationClass = null;
        app.instrumentationInfo = null;
        app.instrumentationProfileFile = null;
        app.instrumentationArguments = null;

+7 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.PrintWriterPrinter;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -62,6 +63,7 @@ class ProcessRecord implements Watchdog.PssRequestor {
    IBinder forcingToForeground;// Token that is forcing this process to be foreground
    int adjSeq;                 // Sequence id for identifying repeated trav
    ComponentName instrumentationClass;// class installed to instrument app
    ApplicationInfo instrumentationInfo; // the application being instrumented
    String instrumentationProfileFile; // where to save profiling
    IInstrumentationWatcher instrumentationWatcher; // who is waiting
    Bundle instrumentationArguments;// as given to us
@@ -125,6 +127,11 @@ class ProcessRecord implements Watchdog.PssRequestor {
                    pw.println(instrumentationProfileFile);
            pw.print(prefix); pw.print("instrumentationArguments=");
                    pw.println(instrumentationArguments);
            pw.print(prefix); pw.print("instrumentationInfo=");
                    pw.println(instrumentationInfo);
            if (instrumentationInfo != null) {
                instrumentationInfo.dump(new PrintWriterPrinter(pw), prefix + "  ");
            }
        }
        pw.print(prefix); pw.print("thread="); pw.print(thread);
                pw.print(" curReceiver="); pw.println(curReceiver);