Skip to content
This repository has been archived by the owner on Nov 8, 2023. It is now read-only.

Commit

Permalink
Merge "Pass dexopt flags as integer"
Browse files Browse the repository at this point in the history
  • Loading branch information
Todd Kennedy authored and Gerrit Code Review committed Sep 25, 2015
2 parents cafacef + fa54ab7 commit 7de7e0b
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 41 deletions.
20 changes: 9 additions & 11 deletions core/java/com/android/internal/os/InstallerConnection.java
Expand Up @@ -19,6 +19,7 @@
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
import android.util.Slog;

import libcore.io.IoUtils;
import libcore.io.Streams;

Expand Down Expand Up @@ -90,32 +91,29 @@ public int execute(String cmd) {
}
}

public int dexopt(String apkPath, int uid, boolean isPublic,
String instructionSet, int dexoptNeeded, boolean bootComplete) {
return dexopt(apkPath, uid, isPublic, "*", instructionSet, dexoptNeeded,
false, false, null, bootComplete);
public int dexopt(String apkPath, int uid, String instructionSet,
int dexoptNeeded, int dexFlags) {
return dexopt(apkPath, uid, "*", instructionSet, dexoptNeeded,
null /*outputPath*/, dexFlags);
}

public int dexopt(String apkPath, int uid, boolean isPublic, String pkgName,
String instructionSet, int dexoptNeeded, boolean vmSafeMode,
boolean debuggable, String outputPath, boolean bootComplete) {
public int dexopt(String apkPath, int uid, String pkgName, String instructionSet,
int dexoptNeeded, String outputPath, int dexFlags) {
StringBuilder builder = new StringBuilder("dexopt");
builder.append(' ');
builder.append(apkPath);
builder.append(' ');
builder.append(uid);
builder.append(isPublic ? " 1" : " 0");
builder.append(' ');
builder.append(pkgName);
builder.append(' ');
builder.append(instructionSet);
builder.append(' ');
builder.append(dexoptNeeded);
builder.append(vmSafeMode ? " 1" : " 0");
builder.append(debuggable ? " 1" : " 0");
builder.append(' ');
builder.append(outputPath != null ? outputPath : "!");
builder.append(bootComplete ? " 1" : " 0");
builder.append(' ');
builder.append(dexFlags);
return execute(builder.toString());
}

Expand Down
4 changes: 2 additions & 2 deletions core/java/com/android/internal/os/ZygoteInit.java
Expand Up @@ -483,8 +483,8 @@ private static void performSystemServerDexOpt(String classPath) {
final int dexoptNeeded = DexFile.getDexOptNeeded(
classPathElement, "*", instructionSet, false /* defer */);
if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
installer.dexopt(classPathElement, Process.SYSTEM_UID, false,
instructionSet, dexoptNeeded, false /* boot complete */);
installer.dexopt(classPathElement, Process.SYSTEM_UID, instructionSet,
dexoptNeeded, 0 /*dexFlags*/);
}
}
} catch (IOException ioe) {
Expand Down
42 changes: 20 additions & 22 deletions services/core/java/com/android/server/pm/Installer.java
Expand Up @@ -31,6 +31,19 @@
public final class Installer extends SystemService {
private static final String TAG = "Installer";

/* ***************************************************************************
* IMPORTANT: These values are passed to native code. Keep them in sync with
* frameworks/native/cmds/installd/installd.h
* **************************************************************************/
/** Application should be visible to everyone */
public static final int DEXOPT_PUBLIC = 1 << 1;
/** Application wants to run in VM safe mode */
public static final int DEXOPT_SAFEMODE = 1 << 2;
/** Application wants to allow debugging of its code */
public static final int DEXOPT_DEBUGGABLE = 1 << 3;
/** The system boot has finished */
public static final int DEXOPT_BOOTCOMPLETE = 1 << 4;

private final InstallerConnection mInstaller;

public Installer(Context context) {
Expand Down Expand Up @@ -72,39 +85,24 @@ public int install(String uuid, String name, int uid, int gid, String seinfo) {
return mInstaller.execute(builder.toString());
}

public int dexopt(String apkPath, int uid, boolean isPublic,
String instructionSet, int dexoptNeeded) {
return dexopt(apkPath, uid, isPublic, instructionSet, dexoptNeeded, true);
}

public int dexopt(String apkPath, int uid, boolean isPublic,
String instructionSet, int dexoptNeeded, boolean bootComplete) {
public int dexopt(String apkPath, int uid, String instructionSet,
int dexoptNeeded, int dexFlags) {
if (!isValidInstructionSet(instructionSet)) {
Slog.e(TAG, "Invalid instruction set: " + instructionSet);
return -1;
}

return mInstaller.dexopt(apkPath, uid, isPublic, instructionSet, dexoptNeeded,
bootComplete);
}

public int dexopt(String apkPath, int uid, boolean isPublic, String pkgName,
String instructionSet, int dexoptNeeded, boolean vmSafeMode,
boolean debuggable, @Nullable String outputPath) {
return dexopt(apkPath, uid, isPublic, pkgName, instructionSet, dexoptNeeded, vmSafeMode,
debuggable, outputPath, true);
return mInstaller.dexopt(apkPath, uid, instructionSet, dexoptNeeded, dexFlags);
}

public int dexopt(String apkPath, int uid, boolean isPublic, String pkgName,
String instructionSet, int dexoptNeeded, boolean vmSafeMode,
boolean debuggable, @Nullable String outputPath, boolean bootComplete) {
public int dexopt(String apkPath, int uid, String pkgName, String instructionSet,
int dexoptNeeded, @Nullable String outputPath, int dexFlags) {
if (!isValidInstructionSet(instructionSet)) {
Slog.e(TAG, "Invalid instruction set: " + instructionSet);
return -1;
}
return mInstaller.dexopt(apkPath, uid, isPublic, pkgName,
instructionSet, dexoptNeeded, vmSafeMode,
debuggable, outputPath, bootComplete);
return mInstaller.dexopt(apkPath, uid, pkgName, instructionSet, dexoptNeeded,
outputPath, dexFlags);
}

public int idmap(String targetApkPath, String overlayApkPath, int uid) {
Expand Down
12 changes: 10 additions & 2 deletions services/core/java/com/android/server/pm/PackageDexOptimizer.java
Expand Up @@ -33,6 +33,10 @@
import dalvik.system.DexFile;
import dalvik.system.StaleDexCacheError;

import static com.android.server.pm.Installer.DEXOPT_BOOTCOMPLETE;
import static com.android.server.pm.Installer.DEXOPT_DEBUGGABLE;
import static com.android.server.pm.Installer.DEXOPT_PUBLIC;
import static com.android.server.pm.Installer.DEXOPT_SAFEMODE;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;

Expand Down Expand Up @@ -148,9 +152,13 @@ private int performDexOptLI(PackageParser.Package pkg, String[] targetInstructio
+ " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable
+ " oatDir = " + oatDir + " bootComplete=" + bootComplete);
final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
final int dexFlags =
(!pkg.isForwardLocked() ? DEXOPT_PUBLIC : 0)
| (vmSafeMode ? DEXOPT_SAFEMODE : 0)
| (debuggable ? DEXOPT_DEBUGGABLE : 0)
| (bootComplete ? DEXOPT_BOOTCOMPLETE : 0);
final int ret = mPackageManagerService.mInstaller.dexopt(path, sharedGid,
!pkg.isForwardLocked(), pkg.packageName, dexCodeInstructionSet,
dexoptNeeded, vmSafeMode, debuggable, oatDir, bootComplete);
pkg.packageName, dexCodeInstructionSet, dexoptNeeded, oatDir, dexFlags);
if (ret < 0) {
return DEX_OPT_FAILED;
}
Expand Down
Expand Up @@ -55,6 +55,7 @@
import static com.android.internal.content.NativeLibraryHelper.LIB_DIR_NAME;
import static com.android.internal.util.ArrayUtils.appendInt;
import static com.android.internal.util.ArrayUtils.removeInt;
import static com.android.server.pm.Installer.DEXOPT_PUBLIC;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSet;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
Expand Down Expand Up @@ -1460,7 +1461,8 @@ public PackageManagerService(Context context, Installer installer,
int dexoptNeeded = DexFile.getDexOptNeeded(lib, null, dexCodeInstructionSet, false);
if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
alreadyDexOpted.add(lib);
mInstaller.dexopt(lib, Process.SYSTEM_UID, true, dexCodeInstructionSet, dexoptNeeded, false);
mInstaller.dexopt(lib, Process.SYSTEM_UID, dexCodeInstructionSet,
dexoptNeeded, DEXOPT_PUBLIC /*dexFlags*/);
}
} catch (FileNotFoundException e) {
Slog.w(TAG, "Library not found: " + lib);
Expand Down Expand Up @@ -1508,7 +1510,8 @@ public PackageManagerService(Context context, Installer installer,
try {
int dexoptNeeded = DexFile.getDexOptNeeded(path, null, dexCodeInstructionSet, false);
if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
mInstaller.dexopt(path, Process.SYSTEM_UID, true, dexCodeInstructionSet, dexoptNeeded, false);
mInstaller.dexopt(path, Process.SYSTEM_UID, dexCodeInstructionSet,
dexoptNeeded, DEXOPT_PUBLIC /*dexFlags*/);
}
} catch (FileNotFoundException e) {
Slog.w(TAG, "Jar not found: " + path);
Expand Down Expand Up @@ -10451,9 +10454,9 @@ private void installPackageLI(InstallArgs args, PackageInstalledInfo res) {

// Run dexopt before old package gets removed, to minimize time when app is unavailable
int result = mPackageDexOptimizer
.performDexOpt(pkg, null /* instruction sets */, true /* forceDex */,
.performDexOpt(pkg, null /* instruction sets */, false /* forceDex */,
false /* defer */, false /* inclDependencies */,
true /* boot complete */);
true /*bootComplete*/);
if (result == PackageDexOptimizer.DEX_OPT_FAILED) {
res.setError(INSTALL_FAILED_DEXOPT, "Dexopt failed for " + pkg.codePath);
return;
Expand Down

0 comments on commit 7de7e0b

Please sign in to comment.