diff options
| author | 2014-08-26 19:10:22 +0000 | |
|---|---|---|
| committer | 2014-08-26 19:10:25 +0000 | |
| commit | d68f83cc478a8ec501d0a5a08a2a737355bee89a (patch) | |
| tree | c1cd8b09d53dfaab98aa51da8d2686ef2aa53509 | |
| parent | 790f6f449d3ac7f7081f08b81674a444f004a244 (diff) | |
| parent | feb193085adbdc379ee70dbb7dc6ae4c9f2971dd (diff) | |
Merge "Pass vmSafeMode (manifest attribute) to installd." into lmp-dev
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 |