Search in sources :

Example 1 with InstallerException

use of com.android.server.pm.Installer.InstallerException in project platform_frameworks_base by android.

the class ActivityManagerService method finishBooting.

final void finishBooting() {
    synchronized (this) {
        if (!mBootAnimationComplete) {
            mCallFinishBooting = true;
            return;
        }
        mCallFinishBooting = false;
    }
    ArraySet<String> completedIsas = new ArraySet<String>();
    for (String abi : Build.SUPPORTED_ABIS) {
        Process.zygoteProcess.establishZygoteConnectionForAbi(abi);
        final String instructionSet = VMRuntime.getInstructionSet(abi);
        if (!completedIsas.contains(instructionSet)) {
            try {
                mInstaller.markBootComplete(VMRuntime.getInstructionSet(abi));
            } catch (InstallerException e) {
                Slog.w(TAG, "Unable to mark boot complete for abi: " + abi + " (" + e.getMessage() + ")");
            }
            completedIsas.add(instructionSet);
        }
    }
    IntentFilter pkgFilter = new IntentFilter();
    pkgFilter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
    pkgFilter.addDataScheme("package");
    mContext.registerReceiver(new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String[] pkgs = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);
            if (pkgs != null) {
                for (String pkg : pkgs) {
                    synchronized (ActivityManagerService.this) {
                        if (forceStopPackageLocked(pkg, -1, false, false, false, false, false, 0, "query restart")) {
                            setResultCode(Activity.RESULT_OK);
                            return;
                        }
                    }
                }
            }
        }
    }, pkgFilter);
    IntentFilter dumpheapFilter = new IntentFilter();
    dumpheapFilter.addAction(DumpHeapActivity.ACTION_DELETE_DUMPHEAP);
    mContext.registerReceiver(new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getBooleanExtra(DumpHeapActivity.EXTRA_DELAY_DELETE, false)) {
                mHandler.sendEmptyMessageDelayed(POST_DUMP_HEAP_NOTIFICATION_MSG, 5 * 60 * 1000);
            } else {
                mHandler.sendEmptyMessage(POST_DUMP_HEAP_NOTIFICATION_MSG);
            }
        }
    }, dumpheapFilter);
    // Let system services know.
    mSystemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETED);
    synchronized (this) {
        // Ensure that any processes we had put on hold are now started
        // up.
        final int NP = mProcessesOnHold.size();
        if (NP > 0) {
            ArrayList<ProcessRecord> procs = new ArrayList<ProcessRecord>(mProcessesOnHold);
            for (int ip = 0; ip < NP; ip++) {
                if (DEBUG_PROCESSES)
                    Slog.v(TAG_PROCESSES, "Starting process on hold: " + procs.get(ip));
                startProcessLocked(procs.get(ip), "on-hold", null);
            }
        }
        if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
            // Start looking for apps that are abusing wake locks.
            Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
            mHandler.sendMessageDelayed(nmsg, POWER_CHECK_DELAY);
            // Tell anyone interested that we are done booting!
            SystemProperties.set("sys.boot_completed", "1");
            // And trigger dev.bootcomplete if we are not showing encryption progress
            if (!"trigger_restart_min_framework".equals(SystemProperties.get("vold.decrypt")) || "".equals(SystemProperties.get("vold.encrypt_progress"))) {
                SystemProperties.set("dev.bootcomplete", "1");
            }
            mUserController.sendBootCompletedLocked(new IIntentReceiver.Stub() {

                @Override
                public void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, int sendingUser) {
                    synchronized (ActivityManagerService.this) {
                        requestPssAllProcsLocked(SystemClock.uptimeMillis(), true, false);
                    }
                }
            });
            scheduleStartProfilesLocked();
        }
    }
}
Also used : Context(android.content.Context) IntentFilter(android.content.IntentFilter) ArraySet(android.util.ArraySet) Message(android.os.Message) Bundle(android.os.Bundle) PersistableBundle(android.os.PersistableBundle) ArrayList(java.util.ArrayList) PendingIntent(android.app.PendingIntent) Intent(android.content.Intent) BroadcastReceiver(android.content.BroadcastReceiver) Point(android.graphics.Point) IIntentReceiver(android.content.IIntentReceiver) InstallerException(com.android.server.pm.Installer.InstallerException)

Example 2 with InstallerException

use of com.android.server.pm.Installer.InstallerException in project platform_frameworks_base by android.

the class DexManager method reconcileSecondaryDexFiles.

/**
     * Reconcile the information we have about the secondary dex files belonging to
     * {@code packagName} and the actual dex files. For all dex files that were
     * deleted, update the internal records and delete any generated oat files.
     */
public void reconcileSecondaryDexFiles(String packageName) {
    PackageUseInfo useInfo = getPackageUseInfo(packageName);
    if (useInfo == null || useInfo.getDexUseInfoMap().isEmpty()) {
        if (DEBUG) {
            Slog.d(TAG, "No secondary dex use for package:" + packageName);
        }
        // Nothing to reconcile.
        return;
    }
    Set<String> dexFilesToRemove = new HashSet<>();
    boolean updated = false;
    for (Map.Entry<String, DexUseInfo> entry : useInfo.getDexUseInfoMap().entrySet()) {
        String dexPath = entry.getKey();
        DexUseInfo dexUseInfo = entry.getValue();
        PackageInfo pkg = null;
        try {
            // Note that we look for the package in the PackageManager just to be able
            // to get back the real app uid and its storage kind. These are only used
            // to perform extra validation in installd.
            // TODO(calin): maybe a bit overkill.
            pkg = mPackageManager.getPackageInfo(packageName, /*flags*/
            0, dexUseInfo.getOwnerUserId());
        } catch (RemoteException ignore) {
        // Can't happen, DexManager is local.
        }
        if (pkg == null) {
            // It may be that the package was uninstalled while we process the secondary
            // dex files.
            Slog.d(TAG, "Could not find package when compiling secondary dex " + packageName + " for user " + dexUseInfo.getOwnerUserId());
            // Update the usage and continue, another user might still have the package.
            updated = mPackageDexUsage.removeUserPackage(packageName, dexUseInfo.getOwnerUserId()) || updated;
            continue;
        }
        ApplicationInfo info = pkg.applicationInfo;
        int flags = 0;
        if (info.dataDir.equals(info.deviceProtectedDataDir)) {
            flags |= StorageManager.FLAG_STORAGE_DE;
        } else if (info.dataDir.equals(info.credentialProtectedDataDir)) {
            flags |= StorageManager.FLAG_STORAGE_CE;
        } else {
            Slog.e(TAG, "Could not infer CE/DE storage for package " + info.packageName);
            updated = mPackageDexUsage.removeUserPackage(packageName, dexUseInfo.getOwnerUserId()) || updated;
            continue;
        }
        boolean dexStillExists = true;
        synchronized (mInstallLock) {
            try {
                String[] isas = dexUseInfo.getLoaderIsas().toArray(new String[0]);
                dexStillExists = mInstaller.reconcileSecondaryDexFile(dexPath, packageName, pkg.applicationInfo.uid, isas, pkg.applicationInfo.volumeUuid, flags);
            } catch (InstallerException e) {
                Slog.e(TAG, "Got InstallerException when reconciling dex " + dexPath + " : " + e.getMessage());
            }
        }
        if (!dexStillExists) {
            updated = mPackageDexUsage.removeDexFile(packageName, dexPath, dexUseInfo.getOwnerUserId()) || updated;
        }
    }
    if (updated) {
        mPackageDexUsage.maybeWriteAsync();
    }
}
Also used : PackageInfo(android.content.pm.PackageInfo) ApplicationInfo(android.content.pm.ApplicationInfo) DexUseInfo(com.android.server.pm.dex.PackageDexUsage.DexUseInfo) InstallerException(com.android.server.pm.Installer.InstallerException) RemoteException(android.os.RemoteException) PackageUseInfo(com.android.server.pm.dex.PackageDexUsage.PackageUseInfo) HashMap(java.util.HashMap) Map(java.util.Map) HashSet(java.util.HashSet)

Example 3 with InstallerException

use of com.android.server.pm.Installer.InstallerException in project platform_frameworks_base by android.

the class PackageInstallerSession method destroyInternal.

private void destroyInternal() {
    synchronized (mLock) {
        mSealed = true;
        mDestroyed = true;
        // Force shut down all bridges
        for (FileBridge bridge : mBridges) {
            bridge.forceClose();
        }
    }
    if (stageDir != null) {
        try {
            mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath());
        } catch (InstallerException ignored) {
        }
    }
    if (stageCid != null) {
        PackageHelper.destroySdDir(stageCid);
    }
}
Also used : FileBridge(android.os.FileBridge) InstallerException(com.android.server.pm.Installer.InstallerException)

Example 4 with InstallerException

use of com.android.server.pm.Installer.InstallerException in project platform_frameworks_base by android.

the class PackageManagerService method reconcileAppsDataLI.

/**
     * Reconcile all app data on given mounted volume.
     * <p>
     * Destroys app data that isn't expected, either due to uninstallation or
     * reinstallation on another volume.
     * <p>
     * Verifies that directories exist and that ownership and labeling is
     * correct for all installed apps.
     */
private void reconcileAppsDataLI(String volumeUuid, int userId, int flags) {
    Slog.v(TAG, "reconcileAppsData for " + volumeUuid + " u" + userId + " 0x" + Integer.toHexString(flags));
    final File ceDir = Environment.getDataUserCeDirectory(volumeUuid, userId);
    final File deDir = Environment.getDataUserDeDirectory(volumeUuid, userId);
    // have changed since we did our last restorecon
    if ((flags & StorageManager.FLAG_STORAGE_CE) != 0) {
        if (StorageManager.isFileEncryptedNativeOrEmulated() && !StorageManager.isUserKeyUnlocked(userId)) {
            throw new RuntimeException("Yikes, someone asked us to reconcile CE storage while " + userId + " was still locked; this would have caused massive data loss!");
        }
        final File[] files = FileUtils.listFilesOrEmpty(ceDir);
        for (File file : files) {
            final String packageName = file.getName();
            try {
                assertPackageKnownAndInstalled(volumeUuid, packageName, userId);
            } catch (PackageManagerException e) {
                logCriticalInfo(Log.WARN, "Destroying " + file + " due to: " + e);
                try {
                    mInstaller.destroyAppData(volumeUuid, packageName, userId, StorageManager.FLAG_STORAGE_CE, 0);
                } catch (InstallerException e2) {
                    logCriticalInfo(Log.WARN, "Failed to destroy: " + e2);
                }
            }
        }
    }
    if ((flags & StorageManager.FLAG_STORAGE_DE) != 0) {
        final File[] files = FileUtils.listFilesOrEmpty(deDir);
        for (File file : files) {
            final String packageName = file.getName();
            try {
                assertPackageKnownAndInstalled(volumeUuid, packageName, userId);
            } catch (PackageManagerException e) {
                logCriticalInfo(Log.WARN, "Destroying " + file + " due to: " + e);
                try {
                    mInstaller.destroyAppData(volumeUuid, packageName, userId, StorageManager.FLAG_STORAGE_DE, 0);
                } catch (InstallerException e2) {
                    logCriticalInfo(Log.WARN, "Failed to destroy: " + e2);
                }
            }
        }
    }
    // Ensure that data directories are ready to roll for all packages
    // installed for this volume and user
    final List<PackageSetting> packages;
    synchronized (mPackages) {
        packages = mSettings.getVolumePackagesLPr(volumeUuid);
    }
    int preparedCount = 0;
    for (PackageSetting ps : packages) {
        final String packageName = ps.name;
        if (ps.pkg == null) {
            Slog.w(TAG, "Odd, missing scanned package " + packageName);
            // and reconcile again once they're scanned
            continue;
        }
        if (ps.getInstalled(userId)) {
            prepareAppDataLIF(ps.pkg, userId, flags);
            if (maybeMigrateAppDataLIF(ps.pkg, userId)) {
                // We may have just shuffled around app data directories, so
                // prepare them one more time
                prepareAppDataLIF(ps.pkg, userId, flags);
            }
            preparedCount++;
        }
    }
    Slog.v(TAG, "reconcileAppsData finished " + preparedCount + " packages");
}
Also used : InstallerException(com.android.server.pm.Installer.InstallerException) PackageParser.isApkFile(android.content.pm.PackageParser.isApkFile) File(java.io.File) DexFile(dalvik.system.DexFile) StrictJarFile(android.util.jar.StrictJarFile)

Example 5 with InstallerException

use of com.android.server.pm.Installer.InstallerException in project platform_frameworks_base by android.

the class PackageManagerService method prepareAppDataLeafLIF.

private void prepareAppDataLeafLIF(PackageParser.Package pkg, int userId, int flags) {
    if (DEBUG_APP_DATA) {
        Slog.v(TAG, "prepareAppData for " + pkg.packageName + " u" + userId + " 0x" + Integer.toHexString(flags));
    }
    final String volumeUuid = pkg.volumeUuid;
    final String packageName = pkg.packageName;
    final ApplicationInfo app = pkg.applicationInfo;
    final int appId = UserHandle.getAppId(app.uid);
    Preconditions.checkNotNull(app.seinfo);
    long ceDataInode = -1;
    try {
        ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags, appId, app.seinfo, app.targetSdkVersion);
    } catch (InstallerException e) {
        if (app.isSystemApp()) {
            logCriticalInfo(Log.ERROR, "Failed to create app data for " + packageName + ", but trying to recover: " + e);
            destroyAppDataLeafLIF(pkg, userId, flags);
            try {
                ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags, appId, app.seinfo, app.targetSdkVersion);
                logCriticalInfo(Log.DEBUG, "Recovery succeeded!");
            } catch (InstallerException e2) {
                logCriticalInfo(Log.DEBUG, "Recovery failed!");
            }
        } else {
            Slog.e(TAG, "Failed to create app data for " + packageName + ": " + e);
        }
    }
    if ((flags & StorageManager.FLAG_STORAGE_CE) != 0 && ceDataInode != -1) {
        // TODO: mark this structure as dirty so we persist it!
        synchronized (mPackages) {
            final PackageSetting ps = mSettings.mPackages.get(packageName);
            if (ps != null) {
                ps.setCeDataInode(ceDataInode, userId);
            }
        }
    }
    prepareAppDataContentsLeafLIF(pkg, userId, flags);
}
Also used : EphemeralApplicationInfo(android.content.pm.EphemeralApplicationInfo) ApplicationInfo(android.content.pm.ApplicationInfo) InstallerException(com.android.server.pm.Installer.InstallerException)

Aggregations

InstallerException (com.android.server.pm.Installer.InstallerException)6 ApplicationInfo (android.content.pm.ApplicationInfo)3 EphemeralApplicationInfo (android.content.pm.EphemeralApplicationInfo)2 PendingIntent (android.app.PendingIntent)1 BroadcastReceiver (android.content.BroadcastReceiver)1 Context (android.content.Context)1 IIntentReceiver (android.content.IIntentReceiver)1 Intent (android.content.Intent)1 IntentFilter (android.content.IntentFilter)1 PackageInfo (android.content.pm.PackageInfo)1 PackageParser.isApkFile (android.content.pm.PackageParser.isApkFile)1 Point (android.graphics.Point)1 Bundle (android.os.Bundle)1 FileBridge (android.os.FileBridge)1 Message (android.os.Message)1 PersistableBundle (android.os.PersistableBundle)1 RemoteException (android.os.RemoteException)1 ArraySet (android.util.ArraySet)1 StrictJarFile (android.util.jar.StrictJarFile)1 DexUseInfo (com.android.server.pm.dex.PackageDexUsage.DexUseInfo)1