summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Calin Juravle <calin@google.com> 2014-08-26 19:10:22 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2014-08-26 19:10:25 +0000
commitd68f83cc478a8ec501d0a5a08a2a737355bee89a (patch)
treec1cd8b09d53dfaab98aa51da8d2686ef2aa53509
parent790f6f449d3ac7f7081f08b81674a444f004a244 (diff)
parentfeb193085adbdc379ee70dbb7dc6ae4c9f2971dd (diff)
Merge "Pass vmSafeMode (manifest attribute) to installd." into lmp-dev
-rw-r--r--core/java/com/android/internal/os/InstallerConnection.java18
-rw-r--r--services/core/java/com/android/server/pm/Installer.java26
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java7
3 files changed, 24 insertions, 27 deletions
diff --git a/core/java/com/android/internal/os/InstallerConnection.java b/core/java/com/android/internal/os/InstallerConnection.java
index e3f229fc659f..2f30ebc5cf4b 100644
--- a/core/java/com/android/internal/os/InstallerConnection.java
+++ b/core/java/com/android/internal/os/InstallerConnection.java
@@ -91,26 +91,40 @@ public class InstallerConnection {
}
public int dexopt(String apkPath, int uid, boolean isPublic, String instructionSet) {
+ return dexopt(apkPath, uid, isPublic, "*", instructionSet, false);
+ }
+
+ public int dexopt(String apkPath, int uid, boolean isPublic, String pkgName,
+ String instructionSet, boolean vmSafeMode) {
StringBuilder builder = new StringBuilder("dexopt");
builder.append(' ');
builder.append(apkPath);
builder.append(' ');
builder.append(uid);
builder.append(isPublic ? " 1" : " 0");
- builder.append(" *"); // No pkgName arg present
+ builder.append(' ');
+ builder.append(pkgName);
builder.append(' ');
builder.append(instructionSet);
+ builder.append(' ');
+ builder.append(vmSafeMode ? " 1" : " 0");
return execute(builder.toString());
}
public int patchoat(String apkPath, int uid, boolean isPublic, String instructionSet) {
+ return patchoat(apkPath, uid, isPublic, "*", instructionSet);
+ }
+
+ public int patchoat(String apkPath, int uid, boolean isPublic, String pkgName,
+ String instructionSet) {
StringBuilder builder = new StringBuilder("patchoat");
builder.append(' ');
builder.append(apkPath);
builder.append(' ');
builder.append(uid);
builder.append(isPublic ? " 1" : " 0");
- builder.append(" *"); // No pkgName arg present
+ builder.append(' ');
+ builder.append(pkgName);
builder.append(' ');
builder.append(instructionSet);
return execute(builder.toString());
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index d1e03ec7510c..694669c09125 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -61,17 +61,7 @@ public final class Installer extends SystemService {
return -1;
}
- StringBuilder builder = new StringBuilder("patchoat");
- 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);
- return mInstaller.execute(builder.toString());
+ return mInstaller.patchoat(apkPath, uid, isPublic, pkgName, instructionSet);
}
public int patchoat(String apkPath, int uid, boolean isPublic, String instructionSet) {
@@ -93,23 +83,13 @@ public final class Installer extends SystemService {
}
public int dexopt(String apkPath, int uid, boolean isPublic, String pkgName,
- String instructionSet) {
+ String instructionSet, boolean vmSafeMode) {
if (!isValidInstructionSet(instructionSet)) {
Slog.e(TAG, "Invalid instruction set: " + instructionSet);
return -1;
}
- 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);
- return mInstaller.execute(builder.toString());
+ return mInstaller.dexopt(apkPath, uid, isPublic, pkgName, instructionSet, vmSafeMode);
}
public int idmap(String targetApkPath, String overlayApkPath, int uid) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f06992a23bbb..ac0f48917d1f 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -4634,6 +4634,8 @@ public class PackageManagerService extends IPackageManager.Stub {
return DEX_OPT_SKIPPED;
}
+ final boolean vmSafeMode = (pkg.applicationInfo.flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0;
+
final List<String> paths = pkg.getAllCodePathsExcludingResourceOnly();
boolean performedDexOpt = false;
// There are three basic cases here:
@@ -4657,10 +4659,11 @@ public class PackageManagerService extends IPackageManager.Stub {
pkg.packageName, dexCodeInstructionSet, defer);
if (forceDex || (!defer && isDexOptNeeded == DexFile.DEXOPT_NEEDED)) {
Log.i(TAG, "Running dexopt on: " + path + " pkg="
- + pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet);
+ + pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet
+ + " vmSafeMode=" + vmSafeMode);
final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
final int ret = mInstaller.dexopt(path, sharedGid, !isForwardLocked(pkg),
- pkg.packageName, dexCodeInstructionSet);
+ pkg.packageName, dexCodeInstructionSet, vmSafeMode);
if (ret < 0) {
// Don't bother running dexopt again if we failed, it will probably