Set tmpdir to application cache directory.
Otherwise File.createTempFile() uses /sdcard which most apps don't
have write access to.
Bug: 6347289
Change-Id: Ibde191a63e4dbb9b03437406f8c999f192bcfa21
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 1a46430b..b55ee26 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -3843,7 +3843,7 @@
windowManager.endTrimMemory();
}
- private void setupGraphicsSupport(LoadedApk info) {
+ private void setupGraphicsSupport(LoadedApk info, File cacheDir) {
if (Process.isIsolated()) {
// Isolated processes aren't going to do UI.
return;
@@ -3855,11 +3855,8 @@
// If there are several packages in this application we won't
// initialize the graphics disk caches
if (packages != null && packages.length == 1) {
- ContextImpl appContext = new ContextImpl();
- appContext.init(info, null, this);
-
- HardwareRenderer.setupDiskCache(appContext.getCacheDir());
- RenderScript.setupDiskCache(appContext.getCacheDir());
+ HardwareRenderer.setupDiskCache(cacheDir);
+ RenderScript.setupDiskCache(cacheDir);
}
} catch (RemoteException e) {
// Ignore
@@ -3925,8 +3922,15 @@
data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
- setupGraphicsSupport(data.info);
-
+ final ContextImpl appContext = new ContextImpl();
+ appContext.init(data.info, null, this);
+ final File cacheDir = appContext.getCacheDir();
+
+ // Provide a usable directory for temporary files
+ System.setProperty("java.io.tmpdir", cacheDir.getAbsolutePath());
+
+ setupGraphicsSupport(data.info, cacheDir);
+
/**
* For system applications on userdebug/eng builds, log stack
* traces of disk and network access to dropbox for analysis.
@@ -4003,8 +4007,6 @@
}
if (data.instrumentationName != null) {
- ContextImpl appContext = new ContextImpl();
- appContext.init(data.info, null, this);
InstrumentationInfo ii = null;
try {
ii = appContext.getPackageManager().