diff options
author | Jeff Sharkey <jsharkey@android.com> | 2014-08-20 16:26:32 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2014-08-22 16:25:04 -0700 |
commit | 941a8ba1a6043cf84a7bf622e44a0b4f7abd0178 (patch) | |
tree | c783987f68caaa4cc827b3c720f269bcc9d34667 /core | |
parent | 7653a30ea0232ab8323ec51ddcba8d8054ca8a2f (diff) | |
download | frameworks_base-941a8ba1a6043cf84a7bf622e44a0b4f7abd0178.zip frameworks_base-941a8ba1a6043cf84a7bf622e44a0b4f7abd0178.tar.gz frameworks_base-941a8ba1a6043cf84a7bf622e44a0b4f7abd0178.tar.bz2 |
Installing splits into ASECs!
Sessions can now zero-copy data directly into pre-allocated ASEC
containers. Then at commit time, we compute the total size of the
final app, including any inherited APKs and unpacked libraries, and
resize the container in one step.
This supports both brand new ASEC installs and inheriting from
existing ASEC installs. To keep things simple, it currently requires
copying any inherited ASEC contents, but this could be optimized in
the future.
Expose new vold resize command, and allow read-write mounting of ASEC
containers. Move native library extraction into the installer flow,
since it needs to happen before ASEC is sealed. Move multiArch flag
into NativeLibraryHelper, instead of making everyone pass it
around. Migrate size calculation to shared location.
Separate "other" package name in public API, provide a path to a
storage device when relevant, and add more docs.
Bug: 16514385
Change-Id: I06c6ce588d312ee7e64cce02733895d640b88456
Diffstat (limited to 'core')
7 files changed, 207 insertions, 48 deletions
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 7419ebc..9afdbf7 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -45,6 +45,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.security.MessageDigest; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -86,6 +87,8 @@ public class PackageInstaller { * <p> * In some cases, a matching Activity may not exist, so ensure you safeguard * against this. + * <p> + * The session to show details for is defined in {@link #EXTRA_SESSION_ID}. */ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS"; @@ -95,21 +98,57 @@ public class PackageInstaller { ACTION_CONFIRM_PERMISSIONS = "android.content.pm.action.CONFIRM_PERMISSIONS"; /** - * An integer session ID. + * An integer session ID that an operation is working with. * - * @see #ACTION_SESSION_DETAILS + * @see Intent#getIntExtra(String, int) */ public static final String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID"; + /** + * Package name that an operation is working with. + * + * @see Intent#getStringExtra(String) + */ + public static final String EXTRA_PACKAGE_NAME = "android.content.pm.extra.PACKAGE_NAME"; + + /** + * Current status of an operation. Will be one of + * {@link #STATUS_PENDING_USER_ACTION}, {@link #STATUS_SUCCESS}, + * {@link #STATUS_FAILURE}, {@link #STATUS_FAILURE_ABORTED}, + * {@link #STATUS_FAILURE_BLOCKED}, {@link #STATUS_FAILURE_CONFLICT}, + * {@link #STATUS_FAILURE_INCOMPATIBLE}, {@link #STATUS_FAILURE_INVALID}, or + * {@link #STATUS_FAILURE_STORAGE}. + * <p> + * More information about a status may be available through additional + * extras; see the individual status documentation for details. + * + * @see Intent#getIntExtra(String, int) + */ public static final String EXTRA_STATUS = "android.content.pm.extra.STATUS"; + + /** + * Detailed string representation of the status, including raw details that + * are useful for debugging. + * + * @see Intent#getStringExtra(String) + */ public static final String EXTRA_STATUS_MESSAGE = "android.content.pm.extra.STATUS_MESSAGE"; /** - * Package name relevant to a status. + * Another package name relevant to a status. This is typically the package + * responsible for causing an operation failure. * * @see Intent#getStringExtra(String) */ - public static final String EXTRA_PACKAGE_NAME = "android.content.pm.extra.PACKAGE_NAME"; + public static final String + EXTRA_OTHER_PACKAGE_NAME = "android.content.pm.extra.OTHER_PACKAGE_NAME"; + + /** + * Storage path relevant to a status. + * + * @see Intent#getStringExtra(String) + */ + public static final String EXTRA_STORAGE_PATH = "android.content.pm.extra.STORAGE_PATH"; /** {@hide} */ @Deprecated @@ -153,8 +192,12 @@ public class PackageInstaller { * The operation failed because it was blocked. For example, a device policy * may be blocking the operation, a package verifier may have blocked the * operation, or the app may be required for core system operation. + * <p> + * The result may also contain {@link #EXTRA_OTHER_PACKAGE_NAME} with the + * specific package blocking the install. * * @see #EXTRA_STATUS_MESSAGE + * @see #EXTRA_OTHER_PACKAGE_NAME */ public static final int STATUS_FAILURE_BLOCKED = 2; @@ -182,10 +225,11 @@ public class PackageInstaller { * permission, incompatible certificates, etc. The user may be able to * uninstall another app to fix the issue. * <p> - * The result may also contain {@link #EXTRA_PACKAGE_NAME} with the + * The result may also contain {@link #EXTRA_OTHER_PACKAGE_NAME} with the * specific package identified as the cause of the conflict. * * @see #EXTRA_STATUS_MESSAGE + * @see #EXTRA_OTHER_PACKAGE_NAME */ public static final int STATUS_FAILURE_CONFLICT = 5; @@ -193,8 +237,12 @@ public class PackageInstaller { * The operation failed because of storage issues. For example, the device * may be running low on space, or external media may be unavailable. The * user may be able to help free space or insert different external media. + * <p> + * The result may also contain {@link #EXTRA_STORAGE_PATH} with the path to + * the storage device that caused the failure. * * @see #EXTRA_STATUS_MESSAGE + * @see #EXTRA_STORAGE_PATH */ public static final int STATUS_FAILURE_STORAGE = 6; @@ -281,6 +329,13 @@ public class PackageInstaller { * To succeed, the caller must be the current home app. */ public @NonNull List<SessionInfo> getAllSessions() { + final ApplicationInfo info = mContext.getApplicationInfo(); + if ("com.google.android.googlequicksearchbox".equals(info.packageName) + && info.versionCode <= 300400070) { + Log.d(TAG, "Ignoring callback request from old prebuilt"); + return Collections.EMPTY_LIST; + } + try { return mInstaller.getAllSessions(mUserId); } catch (RemoteException e) { diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index eb8b762..142206a 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -264,7 +264,7 @@ public class PackageParser { public final boolean coreApp; public final boolean multiArch; - private PackageLite(String codePath, ApkLite baseApk, String[] splitNames, + public PackageLite(String codePath, ApkLite baseApk, String[] splitNames, String[] splitCodePaths) { this.packageName = baseApk.packageName; this.versionCode = baseApk.versionCode; diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java index 939cda9..d1fadd6 100644 --- a/core/java/android/os/storage/IMountService.java +++ b/core/java/android/os/storage/IMountService.java @@ -321,7 +321,7 @@ public interface IMountService extends IInterface { * Mount a secure container with the specified key and owner UID. * Returns an int consistent with MountServiceResultCode */ - public int mountSecureContainer(String id, String key, int ownerUid) + public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly) throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); @@ -331,6 +331,7 @@ public interface IMountService extends IInterface { _data.writeString(id); _data.writeString(key); _data.writeInt(ownerUid); + _data.writeInt(readOnly ? 1 : 0); mRemote.transact(Stub.TRANSACTION_mountSecureContainer, _data, _reply, 0); _reply.readException(); _result = _reply.readInt(); @@ -834,6 +835,27 @@ public interface IMountService extends IInterface { } return _result; } + + @Override + public int resizeSecureContainer(String id, int sizeMb, String key) + throws RemoteException { + Parcel _data = Parcel.obtain(); + Parcel _reply = Parcel.obtain(); + int _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeString(id); + _data.writeInt(sizeMb); + _data.writeString(key); + mRemote.transact(Stub.TRANSACTION_resizeSecureContainer, _data, _reply, 0); + _reply.readException(); + _result = _reply.readInt(); + } finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } } private static final String DESCRIPTOR = "IMountService"; @@ -918,6 +940,8 @@ public interface IMountService extends IInterface { static final int TRANSACTION_getField = IBinder.FIRST_CALL_TRANSACTION + 39; + static final int TRANSACTION_resizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 40; + /** * Cast an IBinder object into an IMountService interface, generating a * proxy if needed. @@ -1082,7 +1106,9 @@ public interface IMountService extends IInterface { key = data.readString(); int ownerUid; ownerUid = data.readInt(); - int resultCode = mountSecureContainer(id, key, ownerUid); + boolean readOnly; + readOnly = data.readInt() != 0; + int resultCode = mountSecureContainer(id, key, ownerUid, readOnly); reply.writeNoException(); reply.writeInt(resultCode); return true; @@ -1308,6 +1334,19 @@ public interface IMountService extends IInterface { reply.writeString(contents); return true; } + case TRANSACTION_resizeSecureContainer: { + data.enforceInterface(DESCRIPTOR); + String id; + id = data.readString(); + int sizeMb; + sizeMb = data.readInt(); + String key; + key = data.readString(); + int resultCode = resizeSecureContainer(id, sizeMb, key); + reply.writeNoException(); + reply.writeInt(resultCode); + return true; + } } return super.onTransact(code, data, reply, flags); } @@ -1405,7 +1444,8 @@ public interface IMountService extends IInterface { * Mount a secure container with the specified key and owner UID. Returns an * int consistent with MountServiceResultCode */ - public int mountSecureContainer(String id, String key, int ownerUid) throws RemoteException; + public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly) + throws RemoteException; /** * Mount external storage at given mount point. Returns an int consistent @@ -1571,4 +1611,6 @@ public interface IMountService extends IInterface { * @return contents of field */ public String getField(String field) throws RemoteException; + + public int resizeSecureContainer(String id, int sizeMb, String key) throws RemoteException; } diff --git a/core/java/com/android/internal/content/NativeLibraryHelper.java b/core/java/com/android/internal/content/NativeLibraryHelper.java index 179d5e8..02f675c 100644 --- a/core/java/com/android/internal/content/NativeLibraryHelper.java +++ b/core/java/com/android/internal/content/NativeLibraryHelper.java @@ -25,6 +25,7 @@ import static android.system.OsConstants.S_IRWXU; import static android.system.OsConstants.S_IXGRP; import static android.system.OsConstants.S_IXOTH; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageParser; import android.content.pm.PackageParser.Package; @@ -51,9 +52,11 @@ import java.util.List; */ public class NativeLibraryHelper { private static final String TAG = "NativeHelper"; - private static final boolean DEBUG_NATIVE = false; + public static final String LIB_DIR_NAME = "lib"; + public static final String LIB64_DIR_NAME = "lib64"; + // Special value for {@code PackageParser.Package#cpuAbiOverride} to indicate // that the cpuAbiOverride must be clear. public static final String CLEAR_ABI_OVERRIDE = "-"; @@ -70,6 +73,7 @@ public class NativeLibraryHelper { private volatile boolean mClosed; final long[] apkHandles; + final boolean multiArch; public static Handle create(File packageFile) throws IOException { try { @@ -81,14 +85,15 @@ public class NativeLibraryHelper { } public static Handle create(Package pkg) throws IOException { - return create(pkg.getAllCodePaths()); + return create(pkg.getAllCodePaths(), + (pkg.applicationInfo.flags & ApplicationInfo.FLAG_MULTIARCH) != 0); } public static Handle create(PackageLite lite) throws IOException { - return create(lite.getAllCodePaths()); + return create(lite.getAllCodePaths(), lite.multiArch); } - private static Handle create(List<String> codePaths) throws IOException { + private static Handle create(List<String> codePaths, boolean multiArch) throws IOException { final int size = codePaths.size(); final long[] apkHandles = new long[size]; for (int i = 0; i < size; i++) { @@ -103,11 +108,12 @@ public class NativeLibraryHelper { } } - return new Handle(apkHandles); + return new Handle(apkHandles, multiArch); } - Handle(long[] apkHandles) { + Handle(long[] apkHandles, boolean multiArch) { this.apkHandles = apkHandles; + this.multiArch = multiArch; mGuard.open("close"); } @@ -159,8 +165,7 @@ public class NativeLibraryHelper { * @return {@link PackageManager#INSTALL_SUCCEEDED} if successful or another * error code from that class if not */ - public static int copyNativeBinariesIfNeededLI(Handle handle, File sharedLibraryDir, - String abi) { + public static int copyNativeBinaries(Handle handle, File sharedLibraryDir, String abi) { for (long apkHandle : handle.apkHandles) { int res = nativeCopyNativeBinaries(apkHandle, sharedLibraryDir.getPath(), abi); if (res != INSTALL_SUCCEEDED) { @@ -267,7 +272,7 @@ public class NativeLibraryHelper { } } - private static long sumNativeBinaries(Handle handle, String[] abiList) { + private static long sumNativeBinariesForSupportedAbi(Handle handle, String[] abiList) { int abi = findSupportedAbi(handle, abiList); if (abi >= 0) { return sumNativeBinaries(handle, abiList[abi]); @@ -276,7 +281,7 @@ public class NativeLibraryHelper { } } - public static int copyNativeBinariesIfNeededLI(Handle handle, File libraryRoot, + public static int copyNativeBinariesForSupportedAbi(Handle handle, File libraryRoot, String[] abiList, boolean useIsaSubdir) throws IOException { createNativeLibrarySubdir(libraryRoot); @@ -300,7 +305,7 @@ public class NativeLibraryHelper { subDir = libraryRoot; } - int copyRet = copyNativeBinariesIfNeededLI(handle, subDir, abiList[abi]); + int copyRet = copyNativeBinaries(handle, subDir, abiList[abi]); if (copyRet != PackageManager.INSTALL_SUCCEEDED) { return copyRet; } @@ -309,10 +314,10 @@ public class NativeLibraryHelper { return abi; } - public static int copyNativeBinariesIfNeededLI(Handle handle, File libraryRoot, - String abiOverride, boolean multiArch) { + public static int copyNativeBinariesWithOverride(Handle handle, File libraryRoot, + String abiOverride) { try { - if (multiArch) { + if (handle.multiArch) { // Warn if we've set an abiOverride for multi-lib packages.. // By definition, we need to copy both 32 and 64 bit libraries for // such packages. @@ -322,7 +327,7 @@ public class NativeLibraryHelper { int copyRet = PackageManager.NO_NATIVE_LIBRARIES; if (Build.SUPPORTED_32_BIT_ABIS.length > 0) { - copyRet = copyNativeBinariesIfNeededLI(handle, libraryRoot, + copyRet = copyNativeBinariesForSupportedAbi(handle, libraryRoot, Build.SUPPORTED_32_BIT_ABIS, true /* use isa specific subdirs */); if (copyRet < 0 && copyRet != PackageManager.NO_NATIVE_LIBRARIES && copyRet != PackageManager.INSTALL_FAILED_NO_MATCHING_ABIS) { @@ -332,7 +337,7 @@ public class NativeLibraryHelper { } if (Build.SUPPORTED_64_BIT_ABIS.length > 0) { - copyRet = copyNativeBinariesIfNeededLI(handle, libraryRoot, + copyRet = copyNativeBinariesForSupportedAbi(handle, libraryRoot, Build.SUPPORTED_64_BIT_ABIS, true /* use isa specific subdirs */); if (copyRet < 0 && copyRet != PackageManager.NO_NATIVE_LIBRARIES && copyRet != PackageManager.INSTALL_FAILED_NO_MATCHING_ABIS) { @@ -355,7 +360,7 @@ public class NativeLibraryHelper { abiList = Build.SUPPORTED_32_BIT_ABIS; } - int copyRet = copyNativeBinariesIfNeededLI(handle, libraryRoot, abiList, + int copyRet = copyNativeBinariesForSupportedAbi(handle, libraryRoot, abiList, true /* use isa specific subdirs */); if (copyRet < 0 && copyRet != PackageManager.NO_NATIVE_LIBRARIES) { Slog.w(TAG, "Failure copying native libraries [errorCode=" + copyRet + "]"); @@ -370,10 +375,10 @@ public class NativeLibraryHelper { } } - public static long sumNativeBinaries(Handle handle, String abiOverride, boolean multiArch) + public static long sumNativeBinariesWithOverride(Handle handle, String abiOverride) throws IOException { long sum = 0; - if (multiArch) { + if (handle.multiArch) { // Warn if we've set an abiOverride for multi-lib packages.. // By definition, we need to copy both 32 and 64 bit libraries for // such packages. @@ -382,11 +387,11 @@ public class NativeLibraryHelper { } if (Build.SUPPORTED_32_BIT_ABIS.length > 0) { - sum += sumNativeBinaries(handle, Build.SUPPORTED_32_BIT_ABIS); + sum += sumNativeBinariesForSupportedAbi(handle, Build.SUPPORTED_32_BIT_ABIS); } if (Build.SUPPORTED_64_BIT_ABIS.length > 0) { - sum += sumNativeBinaries(handle, Build.SUPPORTED_64_BIT_ABIS); + sum += sumNativeBinariesForSupportedAbi(handle, Build.SUPPORTED_64_BIT_ABIS); } } else { String cpuAbiOverride = null; @@ -403,7 +408,7 @@ public class NativeLibraryHelper { abiList = Build.SUPPORTED_32_BIT_ABIS; } - sum += sumNativeBinaries(handle, abiList); + sum += sumNativeBinariesForSupportedAbi(handle, abiList); } return sum; } diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java index a529cc3..c17f4ee 100644 --- a/core/java/com/android/internal/content/PackageHelper.java +++ b/core/java/com/android/internal/content/PackageHelper.java @@ -16,11 +16,14 @@ package com.android.internal.content; +import static android.net.TrafficStats.MB_IN_BYTES; + import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.PackageParser.PackageLite; import android.os.Environment; import android.os.Environment.UserEnvironment; import android.os.FileUtils; @@ -77,9 +80,10 @@ public class PackageHelper { } } - public static String createSdDir(int sizeMb, String cid, String sdEncKey, int uid, + public static String createSdDir(long sizeBytes, String cid, String sdEncKey, int uid, boolean isExternal) { - // Create mount point via MountService + // Round up to nearest MB, plus another MB for filesystem overhead + final int sizeMb = (int) ((sizeBytes + MB_IN_BYTES) / MB_IN_BYTES) + 1; try { IMountService mountService = getMountService(); @@ -102,19 +106,39 @@ public class PackageHelper { return null; } - public static String mountSdDir(String cid, String key, int ownerUid) { - try { - int rc = getMountService().mountSecureContainer(cid, key, ownerUid); - if (rc != StorageResultCode.OperationSucceeded) { - Log.i(TAG, "Failed to mount container " + cid + " rc : " + rc); - return null; + public static boolean resizeSdDir(long sizeBytes, String cid, String sdEncKey) { + // Round up to nearest MB, plus another MB for filesystem overhead + final int sizeMb = (int) ((sizeBytes + MB_IN_BYTES) / MB_IN_BYTES) + 1; + try { + IMountService mountService = getMountService(); + int rc = mountService.resizeSecureContainer(cid, sizeMb, sdEncKey); + if (rc == StorageResultCode.OperationSucceeded) { + return true; + } + } catch (RemoteException e) { + Log.e(TAG, "MountService running?"); } - return getMountService().getSecureContainerPath(cid); - } catch (RemoteException e) { - Log.e(TAG, "MountService running?"); + Log.e(TAG, "Failed to create secure container " + cid); + return false; + } + + public static String mountSdDir(String cid, String key, int ownerUid) { + return mountSdDir(cid, key, ownerUid, true); + } + + public static String mountSdDir(String cid, String key, int ownerUid, boolean readOnly) { + try { + int rc = getMountService().mountSecureContainer(cid, key, ownerUid, readOnly); + if (rc != StorageResultCode.OperationSucceeded) { + Log.i(TAG, "Failed to mount container " + cid + " rc : " + rc); + return null; + } + return getMountService().getSecureContainerPath(cid); + } catch (RemoteException e) { + Log.e(TAG, "MountService running?"); + } + return null; } - return null; - } public static boolean unMountSdDir(String cid) { try { @@ -400,6 +424,37 @@ public class PackageHelper { } } + public static long calculateInstalledSize(PackageLite pkg, boolean isForwardLocked, + String abiOverride) throws IOException { + NativeLibraryHelper.Handle handle = null; + try { + handle = NativeLibraryHelper.Handle.create(pkg); + return calculateInstalledSize(pkg, handle, isForwardLocked, abiOverride); + } finally { + IoUtils.closeQuietly(handle); + } + } + + public static long calculateInstalledSize(PackageLite pkg, NativeLibraryHelper.Handle handle, + boolean isForwardLocked, String abiOverride) throws IOException { + long sizeBytes = 0; + + // Include raw APKs, and possibly unpacked resources + for (String codePath : pkg.getAllCodePaths()) { + final File codeFile = new File(codePath); + sizeBytes += codeFile.length(); + + if (isForwardLocked) { + sizeBytes += PackageHelper.extractPublicFiles(codeFile, null); + } + } + + // Include all relevant native code + sizeBytes += NativeLibraryHelper.sumNativeBinariesWithOverride(handle, abiOverride); + + return sizeBytes; + } + public static String replaceEnd(String str, String before, String after) { if (!str.endsWith(before)) { throw new IllegalArgumentException( diff --git a/core/tests/coretests/src/android/content/pm/PackageHelperTests.java b/core/tests/coretests/src/android/content/pm/PackageHelperTests.java index 7ad35d0..06c495e 100644 --- a/core/tests/coretests/src/android/content/pm/PackageHelperTests.java +++ b/core/tests/coretests/src/android/content/pm/PackageHelperTests.java @@ -16,7 +16,7 @@ package android.content.pm; -import com.android.internal.content.PackageHelper; +import static android.net.TrafficStats.MB_IN_BYTES; import android.os.IBinder; import android.os.RemoteException; @@ -25,6 +25,8 @@ import android.os.storage.IMountService; import android.test.AndroidTestCase; import android.util.Log; +import com.android.internal.content.PackageHelper; + public class PackageHelperTests extends AndroidTestCase { private static final boolean localLOGV = true; public static final String TAG = "PackageHelperTests"; @@ -81,8 +83,8 @@ public class PackageHelperTests extends AndroidTestCase { public void testMountAndPullSdCard() { try { fullId = PREFIX; - fullId2 = PackageHelper.createSdDir(1024, fullId, "none", android.os.Process.myUid(), - true); + fullId2 = PackageHelper.createSdDir(1024 * MB_IN_BYTES, fullId, "none", + android.os.Process.myUid(), true); Log.d(TAG,PackageHelper.getSdDir(fullId)); PackageHelper.unMountSdDir(fullId); diff --git a/core/tests/coretests/src/android/os/storage/AsecTests.java b/core/tests/coretests/src/android/os/storage/AsecTests.java index abb8eae..4f724fe 100644 --- a/core/tests/coretests/src/android/os/storage/AsecTests.java +++ b/core/tests/coretests/src/android/os/storage/AsecTests.java @@ -90,7 +90,7 @@ public class AsecTests extends AndroidTestCase { String fullId = SECURE_CONTAINER_PREFIX + localId; IMountService ms = getMs(); - return ms.mountSecureContainer(fullId, key, android.os.Process.myUid()); + return ms.mountSecureContainer(fullId, key, android.os.Process.myUid(), true); } private int renameContainer(String localId1, String localId2) throws Exception { |