aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2015-05-11 09:00:51 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-05-11 12:49:01 +0000
commitca96e111f0e22bd50a2a12ca3d53e4bcba8221c8 (patch)
treedd3354c02105a562abf91aad15f61e67c685cb17 /src/tools/android/java/com/google/devtools/build/android/incrementaldeployment
parent5c0e4b2c64e9c9ccf80607ce4d8855ad032c302f (diff)
Get the code cache directory for stub application from the Context instead of hard-coding it and move the incremental deployment directory from /sdcard/incrementaldeployment to /data/local/tmp/incrementaldeployment.
The first is necessary because if the app is not run under the default user profile (e.g. Android For Work), the default location is not writable, thus, sadness, the second is necessary because /sdcard is not accessible from the non-default profile. This also makes it possible to eventually install .so files there, because the +x bit can be set under /data/local/tmp (unlike under /sdcard). -- MOS_MIGRATED_REVID=93287264
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/incrementaldeployment')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/IncrementalClassLoader.java20
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/StubApplication.java33
2 files changed, 25 insertions, 28 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/IncrementalClassLoader.java b/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/IncrementalClassLoader.java
index 773787614a..1000b18890 100644
--- a/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/IncrementalClassLoader.java
+++ b/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/IncrementalClassLoader.java
@@ -30,13 +30,14 @@ import java.util.List;
public class IncrementalClassLoader extends ClassLoader {
private final DelegateClassLoader delegateClassLoader;
- public IncrementalClassLoader(ClassLoader original, String packageName, List<String> dexes) {
+ public IncrementalClassLoader(
+ ClassLoader original, String packageName, String codeCacheDir, List<String> dexes) {
super(original.getParent());
// TODO(bazel-team): For some mysterious reason, we need to use two class loaders so that
// everything works correctly. Investigate why that is the case so that the code can be
// simplified.
- delegateClassLoader = createDelegateClassLoader(packageName, dexes, original);
+ delegateClassLoader = createDelegateClassLoader(packageName, codeCacheDir, dexes, original);
}
@Override
@@ -60,7 +61,7 @@ public class IncrementalClassLoader extends ClassLoader {
}
private static DelegateClassLoader createDelegateClassLoader(
- String packageName, List<String> dexes, ClassLoader original) {
+ String packageName, String codeCacheDir, List<String> dexes, ClassLoader original) {
StringBuilder pathBuilder = new StringBuilder();
boolean first = true;
for (String dex : dexes) {
@@ -74,16 +75,10 @@ public class IncrementalClassLoader extends ClassLoader {
}
Log.v("IncrementalClassLoader", "Incremental dex path is " + pathBuilder);
- return new DelegateClassLoader(pathBuilder.toString(), getCodeCacheDir(packageName),
+ return new DelegateClassLoader(pathBuilder.toString(), new File(codeCacheDir),
"/data/data/" + packageName + "/lib", original);
}
- private static File getCodeCacheDir(String packageName) {
- File result = new File("/data/data/" + packageName + "/code_cache");
- boolean success = result.mkdir();
- return result;
- }
-
private static void setParent(ClassLoader classLoader, ClassLoader newParent) {
try {
Field parent = ClassLoader.class.getDeclaredField("parent");
@@ -94,9 +89,10 @@ public class IncrementalClassLoader extends ClassLoader {
}
}
- public static void inject(ClassLoader classLoader, String packageName, List<String> dexes) {
+ public static void inject(
+ ClassLoader classLoader, String packageName, String codeCacheDir, List<String> dexes) {
IncrementalClassLoader incrementalClassLoader =
- new IncrementalClassLoader(classLoader, packageName, dexes);
+ new IncrementalClassLoader(classLoader, packageName, codeCacheDir, dexes);
setParent(classLoader, incrementalClassLoader);
}
}
diff --git a/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/StubApplication.java b/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/StubApplication.java
index e729f558b6..89a19bc656 100644
--- a/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/StubApplication.java
+++ b/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/StubApplication.java
@@ -54,12 +54,13 @@ import java.util.Map;
* because any class loaded before it cannot be incrementally deployed.
*/
public class StubApplication extends Application {
- private static final String INCREMENTAL_DEPLOYMENT_DIR = "/sdcard/incrementaldeployment";
+ private static final String INCREMENTAL_DEPLOYMENT_DIR = "/data/local/tmp/incrementaldeployment";
- private final Application realApplication;
private final String realClassName;
private final String packageName;
- private final String externalResourceFile;
+
+ private String externalResourceFile;
+ private Application realApplication;
public StubApplication() {
String[] stubApplicationData = getResourceAsString("stub_application_data.txt").split("\n");
@@ -68,17 +69,7 @@ public class StubApplication extends Application {
Log.v("StubApplication", String.format(
"StubApplication created. Android package is %s, real application class is %s.",
- packageName,
- realClassName));
-
- externalResourceFile = getExternalResourceFile();
-
- IncrementalClassLoader.inject(
- StubApplication.class.getClassLoader(),
- packageName,
- getDexList(packageName));
-
- realApplication = instantiateRealApplication();
+ packageName, realClassName));
}
private String getExternalResourceFile() {
@@ -286,13 +277,21 @@ public class StubApplication extends Application {
}
}
- private Application instantiateRealApplication() {
+ private void instantiateRealApplication(String codeCacheDir) {
+ externalResourceFile = getExternalResourceFile();
+
+ IncrementalClassLoader.inject(
+ StubApplication.class.getClassLoader(),
+ packageName,
+ codeCacheDir,
+ getDexList(packageName));
+
try {
@SuppressWarnings("unchecked")
Class<? extends Application> realClass =
(Class<? extends Application>) Class.forName(realClassName);
Constructor<? extends Application> ctor = realClass.getConstructor();
- return ctor.newInstance();
+ realApplication = ctor.newInstance();
} catch (Exception e) {
throw new IllegalStateException(e);
}
@@ -300,6 +299,8 @@ public class StubApplication extends Application {
@Override
protected void attachBaseContext(Context context) {
+ instantiateRealApplication(context.getCacheDir().getPath());
+
// This is called from ActivityThread#handleBindApplication() -> LoadedApk#makeApplication().
// Application#mApplication is changed right after this call, so we cannot do the monkey
// patching here. So just forward this method to the real Application instance.