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

Commit d7b2a2e4 authored by Narayan Kamath's avatar Narayan Kamath Committed by Android (Google) Code Review
Browse files

Merge "Be more accepting of dex2oat errors." into mnc-dev

parents aaefe373 01dcb76f
Loading
Loading
Loading
Loading
+46 −48
Original line number Original line Diff line number Diff line
@@ -31,7 +31,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.List;


import dalvik.system.DexFile;
import dalvik.system.DexFile;
import dalvik.system.StaleDexCacheError;


import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
@@ -112,13 +111,17 @@ final class PackageDexOptimizer {
            }
            }


            for (String path : paths) {
            for (String path : paths) {
                try {
                final int dexoptNeeded;
                final int dexoptNeeded;
                if (forceDex) {
                if (forceDex) {
                    dexoptNeeded = DexFile.DEX2OAT_NEEDED;
                    dexoptNeeded = DexFile.DEX2OAT_NEEDED;
                } else {
                } else {
                        dexoptNeeded = DexFile.getDexOptNeeded(path,
                    try {
                                pkg.packageName, dexCodeInstructionSet, defer);
                        dexoptNeeded = DexFile.getDexOptNeeded(path, pkg.packageName,
                                dexCodeInstructionSet, defer);
                    } catch (IOException ioe) {
                        Slog.w(TAG, "IOException reading apk: " + path, ioe);
                        return DEX_OPT_FAILED;
                    }
                }
                }


                if (!forceDex && defer && dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
                if (!forceDex && defer && dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
@@ -134,7 +137,12 @@ final class PackageDexOptimizer {
                    String oatDir = null;
                    String oatDir = null;
                    if (dexoptNeeded == DexFile.DEX2OAT_NEEDED) {
                    if (dexoptNeeded == DexFile.DEX2OAT_NEEDED) {
                        dexoptType = "dex2oat";
                        dexoptType = "dex2oat";
                        try {
                            oatDir = createOatDirIfSupported(pkg, dexCodeInstructionSet);
                            oatDir = createOatDirIfSupported(pkg, dexCodeInstructionSet);
                        } catch (IOException ioe) {
                            Slog.w(TAG, "Unable to create oatDir for package: " + pkg.packageName);
                            return DEX_OPT_FAILED;
                        }
                    } else if (dexoptNeeded == DexFile.PATCHOAT_NEEDED) {
                    } else if (dexoptNeeded == DexFile.PATCHOAT_NEEDED) {
                        dexoptType = "patchoat";
                        dexoptType = "patchoat";
                    } else if (dexoptNeeded == DexFile.SELF_PATCHOAT_NEEDED) {
                    } else if (dexoptNeeded == DexFile.SELF_PATCHOAT_NEEDED) {
@@ -142,6 +150,7 @@ final class PackageDexOptimizer {
                    } else {
                    } else {
                        throw new IllegalStateException("Invalid dexopt needed: " + dexoptNeeded);
                        throw new IllegalStateException("Invalid dexopt needed: " + dexoptNeeded);
                    }
                    }

                    Log.i(TAG, "Running dexopt (" + dexoptType + ") on: " + path + " pkg="
                    Log.i(TAG, "Running dexopt (" + dexoptType + ") on: " + path + " pkg="
                            + pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet
                            + pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet
                            + " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable
                            + " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable
@@ -150,23 +159,12 @@ final class PackageDexOptimizer {
                    final int ret = mPackageManagerService.mInstaller.dexopt(path, sharedGid,
                    final int ret = mPackageManagerService.mInstaller.dexopt(path, sharedGid,
                            !pkg.isForwardLocked(), pkg.packageName, dexCodeInstructionSet,
                            !pkg.isForwardLocked(), pkg.packageName, dexCodeInstructionSet,
                            dexoptNeeded, vmSafeMode, debuggable, oatDir);
                            dexoptNeeded, vmSafeMode, debuggable, oatDir);
                        if (ret < 0) {

                            return DEX_OPT_FAILED;
                    // Dex2oat might fail due to compiler / verifier errors. We soldier on
                        }
                    // regardless, and attempt to interpret the app as a safety net.
                    if (ret == 0) {
                        performedDexOpt = true;
                        performedDexOpt = true;
                    }
                    }
                } catch (FileNotFoundException e) {
                    Slog.w(TAG, "Apk not found for dexopt: " + path);
                    return DEX_OPT_FAILED;
                } catch (IOException e) {
                    Slog.w(TAG, "IOException reading apk: " + path, e);
                    return DEX_OPT_FAILED;
                } catch (StaleDexCacheError e) {
                    Slog.w(TAG, "StaleDexCacheError when reading apk: " + path, e);
                    return DEX_OPT_FAILED;
                } catch (Exception e) {
                    Slog.w(TAG, "Exception when doing dexopt : ", e);
                    return DEX_OPT_FAILED;
                }
                }
            }
            }