summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorTodd Kennedy <toddke@google.com>2016-05-11 14:35:18 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-05-11 14:35:19 +0000
commitf09f0699369c02a6a46fbff68c02b00a7c703697 (patch)
tree26cdea6e3de393772d364f9696243e9aab6251d8 /core/java
parent25118d1aa2274d258c183187b90963a11840b0f3 (diff)
parente713efcac103f3d8083ec9d5b00c528af7266b21 (diff)
Merge "Fix secondary ABI instrumetion" into nyc-dev
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/app/ActivityThread.java27
-rw-r--r--core/java/android/content/pm/InstrumentationInfo.java13
2 files changed, 34 insertions, 6 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 061d924fa529..e54edf2a574b 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4957,6 +4957,31 @@ public final class ActivityThread {
}
}
+ /**
+ * Returns the correct library directory for the current ABI.
+ * <p>
+ * If we're dealing with a multi-arch application that has both 32 and 64 bit shared
+ * libraries, we might need to choose the secondary depending on what the current
+ * runtime's instruction set is.
+ */
+ private String getInstrumentationLibrary(ApplicationInfo appInfo, InstrumentationInfo insInfo) {
+ if (appInfo.primaryCpuAbi != null && appInfo.secondaryCpuAbi != null) {
+ // Get the instruction set supported by the secondary ABI. In the presence
+ // of a native bridge this might be different than the one secondary ABI used.
+ String secondaryIsa =
+ VMRuntime.getInstructionSet(appInfo.secondaryCpuAbi);
+ final String secondaryDexCodeIsa =
+ SystemProperties.get("ro.dalvik.vm.isa." + secondaryIsa);
+ secondaryIsa = secondaryDexCodeIsa.isEmpty() ? secondaryIsa : secondaryDexCodeIsa;
+
+ final String runtimeIsa = VMRuntime.getRuntime().vmInstructionSet();
+ if (runtimeIsa.equals(secondaryIsa)) {
+ return insInfo.secondaryNativeLibraryDir;
+ }
+ }
+ return insInfo.nativeLibraryDir;
+ }
+
private void handleBindApplication(AppBindData data) {
// Register the UI Thread as a sensitive thread to the runtime.
VMRuntime.registerSensitiveThread();
@@ -5130,7 +5155,7 @@ public final class ActivityThread {
mInstrumentationPackageName = ii.packageName;
mInstrumentationAppDir = ii.sourceDir;
mInstrumentationSplitAppDirs = ii.splitSourceDirs;
- mInstrumentationLibDir = ii.nativeLibraryDir;
+ mInstrumentationLibDir = getInstrumentationLibrary(data.appInfo, ii);
mInstrumentedAppDir = data.info.getAppDir();
mInstrumentedSplitAppDirs = data.info.getSplitAppDirs();
mInstrumentedLibDir = data.info.getLibDir();
diff --git a/core/java/android/content/pm/InstrumentationInfo.java b/core/java/android/content/pm/InstrumentationInfo.java
index cbeed357224a..9d88cdd8d484 100644
--- a/core/java/android/content/pm/InstrumentationInfo.java
+++ b/core/java/android/content/pm/InstrumentationInfo.java
@@ -66,13 +66,12 @@ public class InstrumentationInfo extends PackageItemInfo implements Parcelable {
/** {@hide} */
public String credentialProtectedDataDir;
- /**
- * Full path to the directory where the native JNI libraries are stored.
- *
- * {@hide}
- */
+ /** {@hide} Full path to the directory containing primary ABI native libraries. */
public String nativeLibraryDir;
+ /** {@hide} Full path to the directory containing secondary ABI native libraries. */
+ public String secondaryNativeLibraryDir;
+
/**
* Specifies whether or not this instrumentation will handle profiling.
*/
@@ -95,6 +94,7 @@ public class InstrumentationInfo extends PackageItemInfo implements Parcelable {
deviceProtectedDataDir = orig.deviceProtectedDataDir;
credentialProtectedDataDir = orig.credentialProtectedDataDir;
nativeLibraryDir = orig.nativeLibraryDir;
+ secondaryNativeLibraryDir = orig.secondaryNativeLibraryDir;
handleProfiling = orig.handleProfiling;
functionalTest = orig.functionalTest;
}
@@ -120,6 +120,7 @@ public class InstrumentationInfo extends PackageItemInfo implements Parcelable {
dest.writeString(deviceProtectedDataDir);
dest.writeString(credentialProtectedDataDir);
dest.writeString(nativeLibraryDir);
+ dest.writeString(secondaryNativeLibraryDir);
dest.writeInt((handleProfiling == false) ? 0 : 1);
dest.writeInt((functionalTest == false) ? 0 : 1);
}
@@ -145,6 +146,7 @@ public class InstrumentationInfo extends PackageItemInfo implements Parcelable {
deviceProtectedDataDir = source.readString();
credentialProtectedDataDir = source.readString();
nativeLibraryDir = source.readString();
+ secondaryNativeLibraryDir = source.readString();
handleProfiling = source.readInt() != 0;
functionalTest = source.readInt() != 0;
}
@@ -160,5 +162,6 @@ public class InstrumentationInfo extends PackageItemInfo implements Parcelable {
ai.deviceProtectedDataDir = deviceProtectedDataDir;
ai.credentialProtectedDataDir = credentialProtectedDataDir;
ai.nativeLibraryDir = nativeLibraryDir;
+ ai.secondaryNativeLibraryDir = secondaryNativeLibraryDir;
}
}