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

Commit e6c1c031 authored by Ethan Chen's avatar Ethan Chen
Browse files

PackageManager: Add option for single threaded dexopt

* Execute all dexopt invocations on the main thread instead of using the
  ExecutorService when persist.sys.dalvik.multithread is set to false.

Change-Id: I3b8499d5af5091ad7abcddf006f8f2837943903b
parent 77a1dfa2
Loading
Loading
Loading
Loading
+32 −10
Original line number Diff line number Diff line
@@ -319,6 +319,8 @@ public class PackageManagerService extends IPackageManager.Stub {
    final String mSdkCodename = "REL".equals(Build.VERSION.CODENAME)
            ? null : Build.VERSION.CODENAME;
    final boolean mIsMultiThreaded;
    final Context mContext;
    final boolean mFactoryTest;
    final boolean mOnlyCore;
@@ -1164,6 +1166,8 @@ public class PackageManagerService extends IPackageManager.Stub {
            Slog.w(TAG, "**** ro.build.version.sdk not set!");
        }
        mIsMultiThreaded = !"false".equals(SystemProperties.get("persist.sys.dalvik.multithread"));
        mContext = context;
        mFactoryTest = factoryTest;
        mOnlyCore = onlyCore;
@@ -1293,13 +1297,17 @@ public class PackageManagerService extends IPackageManager.Stub {
                            if (dalvik.system.DexFile.isDexOptNeeded(lib)) {
                                alreadyDexOpted.add(lib);
                                didDexOpt = true;
                                executorService.submit(new Runnable() {
                                Runnable task = new Runnable() {
                                    @Override
                                    public void run() {
                                        mInstaller.dexopt(lib, Process.SYSTEM_UID, true);
                                    }
                                });
                                };
                                if (!mIsMultiThreaded) {
                                    task.run();
                                } else {
                                    executorService.submit(task);
                                }
                            }
                        } catch (FileNotFoundException e) {
                            Slog.w(TAG, "Library not found: " + lib);
@@ -1349,13 +1357,17 @@ public class PackageManagerService extends IPackageManager.Stub {
                        try {
                            if (dalvik.system.DexFile.isDexOptNeeded(path)) {
                                didDexOpt = true;
                                executorService.submit(new Runnable() {
                                Runnable task = new Runnable() {
                                    @Override
                                    public void run() {
                                        mInstaller.dexopt(path, Process.SYSTEM_UID, true);
                                    }
                                });
                                };
                                if (!mIsMultiThreaded) {
                                    task.run();
                                } else {
                                    executorService.submit(task);
                                }
                            }
                        } catch (FileNotFoundException e) {
                            Slog.w(TAG, "Jar not found: " + path);
@@ -3695,7 +3707,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                // Ignore entries which are not apk's
                continue;
            }
            executorService.submit(new Runnable() {
            Runnable task = new Runnable () {
                @Override
                public void run() {
                    PackageParser.Package pkg = scanPackageLI(file,
@@ -3708,7 +3720,12 @@ public class PackageManagerService extends IPackageManager.Stub {
                        file.delete();
                    }
                }
            });
            };
            if (!mIsMultiThreaded) {
                task.run();
            } else {
                executorService.submit(task);
            }
        }
        executorService.shutdown();
        try {
@@ -4050,7 +4067,7 @@ public class PackageManagerService extends IPackageManager.Stub {
            for (PackageParser.Package pkg : pkgs) {
                final PackageParser.Package p = pkg;
                synchronized (mInstallLock) {
                    executorService.submit(new Runnable() {
                    Runnable task = new Runnable() {
                        @Override
                        public void run() {
                            if (!isFirstBoot()) {
@@ -4067,7 +4084,12 @@ public class PackageManagerService extends IPackageManager.Stub {
                                performDexOptLI(p, false, false, true);
                            }
                        }
                    });
                    };
                    if (!mIsMultiThreaded) {
                        task.run();
                    } else {
                        executorService.submit(task);
                    }
                }
            }
            executorService.shutdown();