Add 64bit support to tests and runners in CTS

Change-Id: I9a676e19d3ef88f76d8cd862b6fb78917a227159
diff --git a/development/ide/eclipse/.classpath b/development/ide/eclipse/.classpath
index b95d52a..fafcc32 100644
--- a/development/ide/eclipse/.classpath
+++ b/development/ide/eclipse/.classpath
@@ -1,25 +1,46 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-    <classpathentry kind="lib" path="prebuilt/common/ddmlib/ddmlib-prebuilt.jar"/>
-    <classpathentry kind="lib" path="prebuilt/common/tradefed/tradefed-prebuilt.jar"/>
+    <classpathentry kind="lib" path="prebuilts/misc/common/ddmlib/ddmlib-prebuilt.jar"/>
+    <classpathentry kind="lib" path="prebuilts/misc/common/tradefed/tradefed-prebuilt.jar"/>
     <classpathentry kind="src" path="cts/apps/CtsVerifier/src"/>
-    <classpathentry kind="src" path="cts/apps/CtsVerifier/tests/src"/>
     <classpathentry kind="src" path="cts/hostsidetests/appsecurity/src"/>
     <classpathentry kind="src" path="cts/hostsidetests/appsecurity/test-apps/AppWithData/src"/>
     <classpathentry kind="src" path="cts/hostsidetests/monkey/src"/>
     <classpathentry kind="src" path="cts/hostsidetests/monkey/test-apps/CtsMonkeyApp/src"/>
     <classpathentry kind="src" path="cts/hostsidetests/monkey/test-apps/CtsMonkeyApp2/src"/>
+    <classpathentry kind="src" path="cts/hostsidetests/sample/src"/>
+    <classpathentry kind="src" path="cts/hostsidetests/sample/app/src"/>
+    <classpathentry kind="src" path="cts/hostsidetests/theme/src"/>
+    <classpathentry kind="src" path="cts/hostsidetests/theme/app/src"/>
+    <classpathentry kind="src" path="cts/hostsidetests/usb/src"/>
     <classpathentry kind="src" path="cts/libs/vogar-expect/src"/>
-    <classpathentry kind="src" path="cts/tests/ApiDemosReferenceTest/src"/>
+    <classpathentry kind="src" path="cts/libs/commonutil/src"/>
+    <classpathentry kind="src" path="cts/libs/deviceutil/src"/>
+    <classpathentry kind="src" path="cts/libs/json/src"/>
+    <classpathentry kind="src" path="cts/libs/testserver/src"/>
+    <classpathentry kind="src" path="cts/libs/wrappedgtest/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/deviceTests/browserbench/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/deviceTests/dram/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/deviceTests/filesystemperf/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/deviceTests/opengl/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/deviceTests/simplecpu/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/deviceTests/ui/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/deviceTests/videoperf/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/hostTests/jank/app/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/hostTests/jank/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/hostTests/uihost/appA/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/hostTests/uihost/appB/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/hostTests/uihost/control/src"/>
+    <classpathentry kind="src" path="cts/suite/cts/hostTests/uihost/src"/>
     <classpathentry kind="src" path="cts/tests/ProcessTest/src"/>
     <classpathentry kind="src" path="cts/tests/ProcessTest/NoShareUidApp/src"/>
     <classpathentry kind="src" path="cts/tests/ProcessTest/ShareUidApp/src"/>
     <classpathentry kind="src" path="cts/tests/SignatureTest/src"/>
     <classpathentry kind="src" path="cts/tests/SignatureTest/tests/src"/>
     <classpathentry kind="src" path="cts/tests/acceleration/src"/>
-    <classpathentry kind="src" path="cts/tests/accessibilityservice/src"/>
     <classpathentry kind="src" path="cts/tests/core/runner/src"/>
     <classpathentry kind="src" path="cts/tests/deviceadmin/src"/>
+    <classpathentry kind="src" path="cts/tests/sample/src"/>
     <classpathentry kind="src" path="cts/tests/src"/>
     <classpathentry kind="src" path="cts/tests/tests/acceleration/src"/>
     <classpathentry kind="src" path="cts/tests/tests/accessibility/src"/>
@@ -34,12 +55,10 @@
     <classpathentry kind="src" path="cts/tests/tests/dpi/src"/>
     <classpathentry kind="src" path="cts/tests/tests/dpi2/src"/>
     <classpathentry kind="src" path="cts/tests/tests/drm/src"/>
-    <classpathentry kind="src" path="cts/tests/tests/example/src"/>
     <classpathentry kind="src" path="cts/tests/tests/gesture/src"/>
     <classpathentry kind="src" path="cts/tests/tests/graphics/src"/>
     <classpathentry kind="src" path="cts/tests/tests/graphics2/src"/>
     <classpathentry kind="src" path="cts/tests/tests/hardware/src"/>
-    <classpathentry kind="src" path="cts/tests/tests/holo/src"/>
     <classpathentry kind="src" path="cts/tests/tests/jni/src"/>
     <classpathentry kind="src" path="cts/tests/tests/location/src"/>
     <classpathentry kind="src" path="cts/tests/tests/media/src"/>
@@ -48,11 +67,6 @@
     <classpathentry kind="src" path="cts/tests/tests/opengl/src"/>
     <classpathentry kind="src" path="cts/tests/tests/openglperf/src"/>
     <classpathentry kind="src" path="cts/tests/tests/os/src"/>
-    <classpathentry kind="src" path="cts/tests/tests/performance/src"/>
-    <classpathentry kind="src" path="cts/tests/tests/performance2/src"/>
-    <classpathentry kind="src" path="cts/tests/tests/performance3/src"/>
-    <classpathentry kind="src" path="cts/tests/tests/performance4/src"/>
-    <classpathentry kind="src" path="cts/tests/tests/performance5/src"/>
     <classpathentry kind="src" path="cts/tests/tests/permission/src"/>
     <classpathentry kind="src" path="cts/tests/tests/permission2/src"/>
     <classpathentry kind="src" path="cts/tests/tests/preference/src"/>
@@ -64,7 +78,6 @@
     <classpathentry kind="src" path="cts/tests/tests/telephony/src"/>
     <classpathentry kind="src" path="cts/tests/tests/text/src"/>
     <classpathentry kind="src" path="cts/tests/tests/textureview/src"/>
-    <classpathentry kind="src" path="cts/tests/tests/theme/src"/>
     <classpathentry kind="src" path="cts/tests/tests/util/src"/>
     <classpathentry kind="src" path="cts/tests/tests/view/src"/>
     <classpathentry kind="src" path="cts/tests/tests/webkit/src"/>
@@ -78,19 +91,11 @@
     <classpathentry kind="src" path="cts/tools/dasm/src"/>
     <classpathentry kind="src" path="cts/tools/device-setup/TestDeviceSetup/src"/>
     <classpathentry kind="src" path="cts/tools/dex-tools/src"/>
-    <classpathentry kind="src" path="cts/tools/dx-tests/src"/>
-    <classpathentry kind="src" path="cts/tools/host/src"/>
-    <classpathentry kind="src" path="cts/tools/host/test"/>
     <classpathentry kind="src" path="cts/tools/signature-tools/src"/>
     <classpathentry kind="src" path="cts/tools/signature-tools/test"/>
     <classpathentry kind="src" path="cts/tools/tradefed-host/src"/>
     <classpathentry kind="src" path="cts/tools/tradefed-host/tests/src"/>
     <classpathentry kind="src" path="cts/tools/utils"/>
-    <classpathentry kind="src" path="cts/tools/vm-tests/src"/>
+    <classpathentry kind="src" path="cts/tools/vm-tests-tf/src"/>
     <classpathentry kind="src" path="external/easymock/src"/>
-    <classpathentry kind="src" path="out/target/common/obj/APPS/CtsAccessibilityServiceTestCases_intermediates/src/src"/>
-    <classpathentry kind="src" path="out/target/common/obj/APPS/CtsTestStubs_intermediates/src/src"/>
-    <classpathentry kind="src" path="out/target/common/obj/APPS/CtsTestStubs_intermediates/src/renderscript/src"/>
-    <classpathentry kind="src" path="out/target/common/obj/APPS/CtsVerifier_intermediates/src"/>
-    <classpathentry kind="src" path="out/target/common/obj/APPS/CtsVerifierTests_intermediates/src"/>
 </classpath>
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
index 702002c..a0590d9 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
@@ -17,6 +17,7 @@
 package com.android.cts.appsecurity;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.Log;
 import com.android.ddmlib.testrunner.InstrumentationResultParser;
 import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
@@ -29,6 +30,8 @@
 import com.android.tradefed.result.TestResult.TestStatus;
 import com.android.tradefed.result.TestRunResult;
 import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 
 import java.io.File;
@@ -38,7 +41,7 @@
 /**
  * Set of tests that verify various security checks involving multiple apps are properly enforced.
  */
-public class AppSecurityTests extends DeviceTestCase implements IBuildReceiver {
+public class AppSecurityTests extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
 
     private static final String RUNNER = "android.support.test.runner.AndroidJUnitRunner";
 
@@ -104,8 +107,14 @@
 
     private static final String LOG_TAG = "AppSecurityTests";
 
+    private IAbi mAbi;
     private CtsBuildHelper mCtsBuild;
 
+    @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -136,12 +145,13 @@
             getDevice().uninstallPackage(SHARED_UI_PKG);
             getDevice().uninstallPackage(SHARED_UI_DIFF_CERT_PKG);
 
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             String installResult = getDevice().installPackage(getTestAppFile(SHARED_UI_APK),
-                    false);
+                    false, options);
             assertNull(String.format("failed to install shared uid app, Reason: %s", installResult),
                     installResult);
             installResult = getDevice().installPackage(getTestAppFile(SHARED_UI_DIFF_CERT_APK),
-                    false);
+                    false, options);
             assertNotNull("shared uid app with different cert than existing app installed " +
                     "successfully", installResult);
             assertEquals("INSTALL_FAILED_SHARED_USER_INCOMPATIBLE", installResult);
@@ -162,12 +172,13 @@
             // cleanup test app that might be installed from previous partial test run
             getDevice().uninstallPackage(SIMPLE_APP_PKG);
 
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             String installResult = getDevice().installPackage(getTestAppFile(SIMPLE_APP_APK),
-                    false);
+                    false, options);
             assertNull(String.format("failed to install simple app. Reason: %s", installResult),
                     installResult);
             installResult = getDevice().installPackage(getTestAppFile(SIMPLE_APP_DIFF_CERT_APK),
-                    true /* reinstall */);
+                    true /* reinstall */, options);
             assertNotNull("app upgrade with different cert than existing app installed " +
                     "successfully", installResult);
             assertEquals("INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES", installResult);
@@ -187,8 +198,9 @@
             getDevice().uninstallPackage(APP_WITH_DATA_PKG);
             getDevice().uninstallPackage(APP_ACCESS_DATA_PKG);
 
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             String installResult = getDevice().installPackage(getTestAppFile(APP_WITH_DATA_APK),
-                    false);
+                    false, options);
             assertNull(String.format("failed to install app with data. Reason: %s", installResult),
                     installResult);
             // run appwithdata's tests to create private data
@@ -196,7 +208,7 @@
                     APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD));
 
             installResult = getDevice().installPackage(getTestAppFile(APP_ACCESS_DATA_APK),
-                    false);
+                    false, options);
             assertNull(String.format("failed to install app access data. Reason: %s",
                     installResult), installResult);
             // run appaccessdata's tests which attempt to access appwithdata's private data
@@ -216,8 +228,9 @@
             wipePrimaryExternalStorage(getDevice());
 
             getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             assertNull(getDevice()
-                    .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false));
+                    .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false, options));
             assertTrue("Failed external storage with no permissions",
                     runDeviceTests(EXTERNAL_STORAGE_APP_PKG));
         } finally {
@@ -235,8 +248,9 @@
             wipePrimaryExternalStorage(getDevice());
 
             getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             assertNull(getDevice()
-                    .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false));
+                    .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false, options));
             assertTrue("Failed external storage with read permissions",
                     runDeviceTests(READ_EXTERNAL_STORAGE_APP_PKG));
         } finally {
@@ -254,8 +268,9 @@
             wipePrimaryExternalStorage(getDevice());
 
             getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             assertNull(getDevice()
-                    .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false));
+                    .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false, options));
             assertTrue("Failed external storage with write permissions",
                     runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG));
         } finally {
@@ -274,12 +289,13 @@
             getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
             getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
             getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             assertNull(getDevice()
-                    .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false));
+                    .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false, options));
             assertNull(getDevice()
-                    .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false));
+                    .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false, options));
             assertNull(getDevice()
-                    .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false));
+                    .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false, options));
 
             assertTrue("Failed to write gifts", runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG,
                     WRITE_EXTERNAL_STORAGE_APP_CLASS, "doWriteGifts"));
@@ -305,8 +321,9 @@
             // cleanup test app that might be installed from previous partial test run
             getDevice().uninstallPackage(APP_WITH_DATA_PKG);
 
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             String installResult = getDevice().installPackage(getTestAppFile(APP_WITH_DATA_APK),
-                    false);
+                    false, options);
             assertNull(String.format("failed to install app with data. Reason: %s", installResult),
                     installResult);
             // run appwithdata's tests to create private data
@@ -316,7 +333,7 @@
             getDevice().uninstallPackage(APP_WITH_DATA_PKG);
 
             installResult = getDevice().installPackage(getTestAppFile(APP_WITH_DATA_APK),
-                    false);
+                    false, options);
             assertNull(String.format("failed to install app with data second time. Reason: %s",
                     installResult), installResult);
             // run appwithdata's 'check if file exists' test
@@ -339,14 +356,15 @@
             getDevice().uninstallPackage(TARGET_INSTRUMENT_PKG);
             getDevice().uninstallPackage(INSTRUMENT_DIFF_CERT_PKG);
 
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             String installResult = getDevice().installPackage(
-                    getTestAppFile(TARGET_INSTRUMENT_APK), false);
+                    getTestAppFile(TARGET_INSTRUMENT_APK), false, options);
             assertNull(String.format("failed to install target instrumentation app. Reason: %s",
                     installResult), installResult);
 
             // the app will install, but will get error at runtime when starting instrumentation
             installResult = getDevice().installPackage(getTestAppFile(INSTRUMENT_DIFF_CERT_APK),
-                    false);
+                    false, options);
             assertNull(String.format(
                     "failed to install instrumentation app with diff cert. Reason: %s",
                     installResult), installResult);
@@ -374,19 +392,20 @@
             getDevice().uninstallPackage(DECLARE_PERMISSION_COMPAT_PKG);
             getDevice().uninstallPackage(PERMISSION_DIFF_CERT_PKG);
 
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             String installResult = getDevice().installPackage(
-                    getTestAppFile(DECLARE_PERMISSION_APK), false);
+                    getTestAppFile(DECLARE_PERMISSION_APK), false, options);
             assertNull(String.format("failed to install declare permission app. Reason: %s",
                     installResult), installResult);
 
             installResult = getDevice().installPackage(
-                    getTestAppFile(DECLARE_PERMISSION_COMPAT_APK), false);
+                    getTestAppFile(DECLARE_PERMISSION_COMPAT_APK), false, options);
             assertNull(String.format("failed to install declare permission compat app. Reason: %s",
                     installResult), installResult);
 
             // the app will install, but will get error at runtime
             installResult = getDevice().installPackage(getTestAppFile(PERMISSION_DIFF_CERT_APK),
-                    false);
+                    false, options);
             assertNull(String.format("failed to install permission app with diff cert. Reason: %s",
                     installResult), installResult);
             // run PERMISSION_DIFF_CERT_PKG tests which try to access the permission
@@ -421,8 +440,9 @@
 
             // Install our test app
             getDevice().uninstallPackage(MULTIUSER_STORAGE_PKG);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             final String installResult = getDevice()
-                    .installPackage(getTestAppFile(MULTIUSER_STORAGE_APK), false);
+                    .installPackage(getTestAppFile(MULTIUSER_STORAGE_APK), false, options);
             assertNull("Failed to install: " + installResult, installResult);
 
             // Clear data from previous tests
diff --git a/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java
index 9c27b62..9e04274 100644
--- a/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java
+++ b/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java
@@ -1,28 +1,37 @@
 package com.android.cts.monkey;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 
 import java.io.File;
 
-abstract class AbstractMonkeyTest extends DeviceTestCase implements IBuildReceiver {
+abstract class AbstractMonkeyTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
 
     static final String[] PKGS = {"com.android.cts.monkey", "com.android.cts.monkey2"};
     static final String[] APKS = {"CtsMonkeyApp.apk", "CtsMonkeyApp2.apk"};
 
-    /** 
+    /**
      * Base monkey command with flags to avoid side effects like airplane mode.
      */
     static final String MONKEY_CMD = "monkey --pct-touch 0 --pct-motion 0 --pct-majornav 0 --pct-syskeys 0 --pct-anyevent 0 --pct-rotation 0";
 
+    IAbi mAbi;
     CtsBuildHelper mBuild;
     ITestDevice mDevice;
 
     @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    @Override
     public void setBuild(IBuildInfo buildInfo) {
         mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
     }
@@ -31,10 +40,11 @@
     protected void setUp() throws Exception {
         super.setUp();
         mDevice = getDevice();
+        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
         for (int i = 0; i < PKGS.length; i++) {
             mDevice.uninstallPackage(PKGS[i]);
             File app = mBuild.getTestApp(APKS[i]);
-            mDevice.installPackage(app, false);
+            mDevice.installPackage(app, false, options);
         }
         clearLogCat();
     }
diff --git a/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java b/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java
index a3bc08f..24f4803 100644
--- a/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java
+++ b/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java
@@ -29,6 +29,7 @@
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.util.CommandResult;
 import com.android.tradefed.util.CommandStatus;
@@ -41,7 +42,7 @@
 /**
  * Test to measure the transfer time of a file from the host to the device.
  */
-public class SampleHostResultTest extends DeviceTestCase implements IBuildReceiver {
+public class SampleHostResultTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
 
     private static final String TAG = SampleHostResultTest.class.getSimpleName();
 
@@ -67,6 +68,15 @@
      */
     private ITestDevice mDevice;
 
+    private String mAbiName;
+    private String mAbiBitness;
+
+    @Override
+    public void setAbi(String name, String bitness) {
+        mAbiName = name;
+        mAbiBitness = bitness;
+    }
+
     @Override
     public void setBuild(IBuildInfo buildInfo) {
         // Get the build, this is used to access the APK.
@@ -122,7 +132,7 @@
         // Compute the stats.
         Stat.StatResult stat = Stat.getStat(result);
         // Get the report for this test and add the results to record.
-        HostReportLog report = new HostReportLog(mDevice.getSerialNumber(),
+        HostReportLog report = new HostReportLog(mDevice.getSerialNumber(), mAbiName,
                 ReportLog.getClassMethodNames());
         report.printArray("Times", result, ResultType.LOWER_BETTER, ResultUnit.MS);
         report.printValue("Min", stat.mMin, ResultType.LOWER_BETTER, ResultUnit.MS);
diff --git a/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java b/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java
index 7ccde0e..a261c1e 100644
--- a/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java
+++ b/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java
@@ -17,9 +17,12 @@
 package android.sample.cts;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 
 import java.io.File;
@@ -29,11 +32,11 @@
 /**
  * Test to check the APK logs to Logcat.
  *
- * When this test builds, it also builds {@see android.sample.app.SampleDeviceActivity} into an APK
+ * When this test builds, it also builds {@link android.sample.app.SampleDeviceActivity} into an APK
  * which it then installs at runtime and starts. The activity simply prints a message to Logcat and
  * then gets uninstalled.
  */
-public class SampleHostTest extends DeviceTestCase implements IBuildReceiver {
+public class SampleHostTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
 
     /**
      * The package name of the APK.
@@ -62,6 +65,11 @@
     private static final String TEST_STRING = "SampleTestString";
 
     /**
+     * The ABI to use.
+     */
+    private String mAbi;
+
+    /**
      * A reference to the build.
      */
     private CtsBuildHelper mBuild;
@@ -72,6 +80,11 @@
     private ITestDevice mDevice;
 
     @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    @Override
     public void setBuild(IBuildInfo buildInfo) {
         // Get the build, this is used to access the APK.
         mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
@@ -86,8 +99,10 @@
         mDevice.uninstallPackage(PACKAGE);
         // Get the APK from the build.
         File app = mBuild.getTestApp(APK);
+        // Get the ABI flag.
+        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
         // Install the APK on the device.
-        mDevice.installPackage(app, false);
+        mDevice.installPackage(app, false, options);
     }
 
     @Override
diff --git a/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java b/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java
index 19c37c0..33e67e5 100644
--- a/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java
+++ b/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java
@@ -49,7 +49,6 @@
 
     private final String mStoragePath;
 
-
     public ComparisonTask(ITestDevice device, File reference, String name) {
         mDevice = device;
         mReference = reference;
diff --git a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
index c88fb44..fded180 100644
--- a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
+++ b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
@@ -17,16 +17,18 @@
 package android.theme.cts;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
+import com.android.cts.util.TimeoutReq;
 import com.android.ddmlib.Log;
 import com.android.ddmlib.Log.LogLevel;
 import com.android.ddmlib.IShellOutputReceiver;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 
-import com.android.cts.util.TimeoutReq;
-
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.InputStream;
@@ -46,7 +48,7 @@
 /**
  * Test to check the Holo theme has not been changed.
  */
-public class ThemeHostTest extends DeviceTestCase implements IBuildReceiver {
+public class ThemeHostTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
 
     private static final String TAG = ThemeHostTest.class.getSimpleName();
 
@@ -172,6 +174,9 @@
 
     private final HashMap<String, File> mReferences = new HashMap<String, File>();
 
+    /** The ABI to use. */
+    private IAbi mAbi;
+
     /** A reference to the build. */
     private CtsBuildHelper mBuild;
 
@@ -183,6 +188,11 @@
     private ExecutorCompletionService<Boolean> mCompletionService;
 
     @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    @Override
     public void setBuild(IBuildInfo buildInfo) {
         // Get the build, this is used to access the APK.
         mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
@@ -197,8 +207,10 @@
         mDevice.uninstallPackage(PACKAGE);
         // Get the APK from the build.
         File app = mBuild.getTestApp(APK);
+        // Get the ABI flag.
+        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
         // Install the APK on the device.
-        mDevice.installPackage(app, false);
+        mDevice.installPackage(app, false, options);
 
         final String densityProp;
 
@@ -328,6 +340,7 @@
                     }
                 }
             }
+            in.close();
         }
 
         return success;
diff --git a/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java b/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
index a8ac3e0..2a69e39 100644
--- a/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
+++ b/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
@@ -16,6 +16,7 @@
 package com.android.cts.usb;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.IDevice;
 import com.android.ddmlib.Log;
 import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
@@ -29,6 +30,8 @@
 import com.android.tradefed.result.InputStreamSource;
 import com.android.tradefed.result.TestRunResult;
 import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.util.CommandResult;
 import com.android.tradefed.util.CommandStatus;
@@ -48,16 +51,23 @@
 /**
  * Functional tests for usb connection
  */
-public class TestUsbTest extends DeviceTestCase implements IBuildReceiver {
+public class TestUsbTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
 
     private static final String LOG_TAG = "TestUsbTest";
     private static final String CTS_RUNNER = "android.support.test.runner.AndroidJUnitRunner";
     private static final String PACKAGE_NAME = "com.android.cts.usb.serialtest";
     private static final String APK_NAME="CtsUsbSerialTestApp.apk";
     private ITestDevice mDevice;
+    private IAbi mAbi;
+    private String mAbiBitness;
     private CtsBuildHelper mBuild;
 
     @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    @Override
     public void setBuild(IBuildInfo buildInfo) {
         mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
     }
@@ -68,7 +78,8 @@
         mDevice = getDevice();
         mDevice.uninstallPackage(PACKAGE_NAME);
         File app = mBuild.getTestApp(APK_NAME);
-        mDevice.installPackage(app, false);
+        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+        mDevice.installPackage(app, false, options);
     }
 
     @Override
diff --git a/libs/commonutil/src/com/android/cts/util/AbiUtils.java b/libs/commonutil/src/com/android/cts/util/AbiUtils.java
new file mode 100644
index 0000000..f28237c
--- /dev/null
+++ b/libs/commonutil/src/com/android/cts/util/AbiUtils.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.util;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Utility class for handling device ABIs
+ */
+public class AbiUtils {
+
+    /**
+     * The set of 32Bit ABIs.
+     */
+    private static final Set<String> ABIS_32BIT = new HashSet<String>();
+
+    /**
+     * The set of 64Bit ABIs.
+     */
+    private static final Set<String> ABIS_64BIT = new HashSet<String>();
+
+    /**
+     * The set of ARM ABIs.
+     */
+    private static final Set<String> ARM_ABIS = new HashSet<String>();
+
+    /**
+     * The set of Intel ABIs.
+     */
+    private static final Set<String> INTEL_ABIS = new HashSet<String>();
+
+    /**
+     * The set of Mips ABIs.
+     */
+    private static final Set<String> MIPS_ABIS = new HashSet<String>();
+
+    /**
+     * The set of ABI names which CTS supports.
+     */
+    private static final Set<String> ABIS_SUPPORTED_BY_CTS = new HashSet<String>();
+
+    /**
+     * The map of architecture to ABI.
+     */
+    private static final Map<String, Set<String>> ARCH_TO_ABIS = new HashMap<String, Set<String>>();
+    static {
+        ABIS_32BIT.add("armeabi-v7a");
+        ABIS_32BIT.add("x86");
+        ABIS_32BIT.add("mips");
+
+        ABIS_64BIT.add("arm64-v8a");
+        ABIS_64BIT.add("x86_64");
+        ABIS_64BIT.add("mips64");
+
+        ARM_ABIS.add("armeabi-v7a");
+        ARM_ABIS.add("arm64-v8a");
+
+        INTEL_ABIS.add("x86");
+        INTEL_ABIS.add("x86_64");
+
+        MIPS_ABIS.add("mips");
+        MIPS_ABIS.add("mips64");
+
+        ARCH_TO_ABIS.put("arm", ARM_ABIS);
+        ARCH_TO_ABIS.put("arm64", ARM_ABIS);
+        ARCH_TO_ABIS.put("x86", INTEL_ABIS);
+        ARCH_TO_ABIS.put("x86_64", INTEL_ABIS);
+        ARCH_TO_ABIS.put("mips", MIPS_ABIS);
+        ARCH_TO_ABIS.put("mips64", MIPS_ABIS);
+
+        ABIS_SUPPORTED_BY_CTS.addAll(ARM_ABIS);
+        ABIS_SUPPORTED_BY_CTS.addAll(INTEL_ABIS);
+        ABIS_SUPPORTED_BY_CTS.addAll(MIPS_ABIS);
+    }
+
+    /**
+     * Private constructor to avoid instantiation.
+     */
+    private AbiUtils() {}
+
+    /**
+     * Returns the set of ABIs associated with the given architecture.
+     * @param arch The architecture to look up.
+     * @return a new Set containing the ABIs.
+     */
+    public static Set<String> getAbisForArch(String arch) {
+        return new HashSet<String>(ARCH_TO_ABIS.get(arch));
+    }
+
+    /**
+     * Returns the set of ABIs supported by CTS.
+     * @return a new Set containing the supported ABIs.
+     */
+    public static Set<String> getAbisSupportedByCts() {
+        return new HashSet<String>(ABIS_SUPPORTED_BY_CTS);
+    }
+
+    /**
+     * @param abi The ABI name to test.
+     * @return true if the given ABI is supported by CTS.
+     */
+    public static boolean isAbiSupportedByCts(String abi) {
+        return ABIS_SUPPORTED_BY_CTS.contains(abi);
+    }
+
+    /**
+     * Creates a flag for the given ABI.
+     * @param abi the ABI to create the flag for.
+     * @return a string which can be add to a command sent to ADB.
+     */
+    public static String createAbiFlag(String abi) {
+        if (abi == null || abi.isEmpty() || !isAbiSupportedByCts(abi)) {
+            return "";
+        }
+        return String.format("--abi %s ", abi);
+    }
+
+    /**
+     * Creates a unique id from the given ABI and name.
+     * @param abi The ABI to use.
+     * @param name The name to use.
+     * @return a string which uniquely identifies a run.
+     */
+    public static String createId(String abi, String name) {
+        return String.format("%s %s", abi, name);
+    }
+
+    /**
+     * Parses a unique id into the ABI and name.
+     * @param id The id to parse.
+     * @return a string array containing the ABI and name.
+     */
+    public static String[] parseId(String id) {
+        if (id == null || !id.contains(" ")) {
+            return new String[] {"", ""};
+        }
+        return id.split(" ");
+    }
+
+    /**
+     * @param name The name of the ABI.
+     * @return The bitness of the ABI with the given name
+     */
+    public static String getBitness(String name) {
+        return ABIS_32BIT.contains(name) ? "32" : "64";
+    }
+}
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java
index f8c7ec1..e196bfb 100644
--- a/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java
+++ b/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java
@@ -23,16 +23,19 @@
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 
 import java.io.File;
 import java.util.HashMap;
 import java.util.Scanner;
 
-public class CtsHostJankTest extends DeviceTestCase implements IBuildReceiver {
+public class CtsHostJankTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
 
     private static final String TAG = CtsHostJankTest.class.getSimpleName();
     private static final String DEVICE_LOCATION = "/data/local/tmp/";
+    // FIXME uiautomator is deprecated and does not support --abi flag
     private static final String RUN_UI_AUTOMATOR_CMD = "uiautomator runtest %s -c %s";
     private final String mHostTestClass;
     private final String mDeviceTestClass;
@@ -40,6 +43,7 @@
     private final String mJarPath;
     protected ITestDevice mDevice;
     protected CtsBuildHelper mBuild;
+    protected IAbi mAbi;
 
     public CtsHostJankTest(String jarName, String deviceTestClass, String hostTestClass) {
         this.mHostTestClass = hostTestClass;
@@ -49,6 +53,11 @@
     }
 
     @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    @Override
     public void setBuild(IBuildInfo buildInfo) {
         mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
     }
@@ -80,6 +89,7 @@
                 new IShellOutputReceiver() {
                     private StringBuilder sb = new StringBuilder();
 
+                    @Override
                     public void addOutput(byte[] data, int offset, int length) {
                         byte[] raw = new byte[length];
                         for (int i = 0; i < length; i++) {
@@ -88,10 +98,12 @@
                         sb.append(new String(raw));
                     }
 
+                    @Override
                     public void flush() {
                         Log.logAndDisplay(LogLevel.INFO, TAG, sb.toString());
                     }
 
+                    @Override
                     public boolean isCancelled() {
                         return false;
                     }
@@ -109,6 +121,7 @@
                 results.put(parts[0], Double.parseDouble(parts[1]));
             }
         }
+        in.close();
         Log.logAndDisplay(LogLevel.INFO, TAG, "Results: " + results);
         assertEquals("Could not parse the results file: ", 4, results.size());
 
@@ -118,8 +131,8 @@
         double avgMaxAccFrames = results.get("average of max accumulated frames");
 
         // Create and deliver the report.
-        HostReportLog report =
-                new HostReportLog(mDevice.getSerialNumber(), mHostTestClass + "#" + testName);
+        HostReportLog report = new HostReportLog(mDevice.getSerialNumber(), mAbi.getName(),
+                mHostTestClass + "#" + testName);
         report.printValue(
                 "Average Frame Rate", avgFrameRate, ResultType.HIGHER_BETTER, ResultUnit.COUNT);
         report.printValue("Average of Maximum Accumulated Frames", avgMaxAccFrames,
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java
index ebd5bfa..2942ecf 100644
--- a/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java
+++ b/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java
@@ -14,7 +14,7 @@
 package com.android.cts.jank.opengl;
 
 import com.android.cts.jank.CtsHostJankTest;
-
+import com.android.cts.util.AbiUtils;
 import java.io.File;
 
 public class CtsHostJankOpenGl extends CtsHostJankTest {
@@ -36,7 +36,8 @@
         // Install the app.
         mDevice.uninstallPackage(APK_PACKAGE);
         File app = mBuild.getTestApp(APK);
-        mDevice.installPackage(app, false);
+        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+        mDevice.installPackage(app, false, options);
     }
 
     @Override
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
index 3027899..a07171e 100644
--- a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
+++ b/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
@@ -14,7 +14,7 @@
 package com.android.cts.jank.ui;
 
 import com.android.cts.jank.CtsHostJankTest;
-
+import com.android.cts.util.AbiUtils;
 import java.io.File;
 
 public class CtsHostJankUi extends CtsHostJankTest {
@@ -36,7 +36,8 @@
         // Install the app.
         mDevice.uninstallPackage(APK_PACKAGE);
         File app = mBuild.getTestApp(APK);
-        mDevice.installPackage(app, false);
+        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+        mDevice.installPackage(app, false, options);
     }
 
     @Override
diff --git a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java
index 63c2d84..75a2e92 100644
--- a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java
+++ b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java
@@ -18,6 +18,7 @@
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
 import com.android.cts.tradefed.util.HostReportLog;
+import com.android.cts.util.AbiUtils;
 import com.android.cts.util.MeasureRun;
 import com.android.cts.util.MeasureTime;
 import com.android.cts.util.ResultType;
@@ -28,6 +29,8 @@
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 
 import java.io.File;
@@ -36,9 +39,10 @@
 /**
  * Test to measure installation time of a APK.
  */
-public class InstallTimeTest extends DeviceTestCase implements IBuildReceiver {
+public class InstallTimeTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
     private CtsBuildHelper mBuild;
     private ITestDevice mDevice;
+    private IAbi mAbi;
 
     private static final String TAG = "InstallTimeTest";
     static final String PACKAGE = "com.replica.replicaisland";
@@ -46,6 +50,11 @@
     private static final double OUTLIER_THRESHOLD = 0.1;
 
     @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    @Override
     public void setBuild(IBuildInfo buildInfo) {
         mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
     }
@@ -64,8 +73,8 @@
     }
 
     public void testInstallTime() throws Exception {
-        HostReportLog report =
-                new HostReportLog(mDevice.getSerialNumber(), ReportLog.getClassMethodNames());
+        HostReportLog report = new HostReportLog(mDevice.getSerialNumber(), mAbi.getName(),
+                ReportLog.getClassMethodNames());
         final int NUMBER_REPEAT = 10;
         final CtsBuildHelper build = mBuild;
         final ITestDevice device = mDevice;
@@ -77,7 +86,8 @@
             @Override
             public void run(int i) throws Exception {
                 File app = build.getTestApp(APK);
-                device.installPackage(app, false);
+                String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+                device.installPackage(app, false, options);
             }
         });
         report.printArray("install time", result, ResultType.LOWER_BETTER,
diff --git a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
index 50a2047..9ccff10 100644
--- a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
+++ b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
@@ -17,9 +17,9 @@
 package com.android.cts.uihost;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.cts.tradefed.result.CtsReportUtil;
 import com.android.cts.tradefed.util.CtsHostStore;
 import com.android.cts.tradefed.util.HostReportLog;
+import com.android.cts.util.AbiUtils;
 import com.android.cts.util.ReportLog;
 import com.android.cts.util.TimeoutReq;
 import com.android.ddmlib.Log;
@@ -34,6 +34,8 @@
 import com.android.tradefed.result.TestResult;
 import com.android.tradefed.result.TestRunResult;
 import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 
 import java.io.File;
@@ -45,12 +47,13 @@
  * Actual test is done in device, but this host side code installs all necessary APKs
  * and starts device test which is in CtsDeviceTaskswitchingControl.
  */
-public class TaskSwitchingTest extends DeviceTestCase implements IBuildReceiver {
+public class TaskSwitchingTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
     private static final String TAG = "TaskSwitchingTest";
     private final static String RUNNER = "android.support.test.runner.AndroidJUnitRunner";
     private CtsBuildHelper mBuild;
     private ITestDevice mDevice;
     private String mCtsReport = null;
+    private IAbi mAbi;
 
     static final String[] PACKAGES = {
         "com.android.cts.taskswitching.control",
@@ -64,6 +67,11 @@
     };
 
     @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    @Override
     public void setBuild(IBuildInfo buildInfo) {
         mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
     }
@@ -72,10 +80,11 @@
     protected void setUp() throws Exception {
         super.setUp();
         mDevice = getDevice();
+        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
         for (int i = 0; i < PACKAGES.length; i++) {
             mDevice.uninstallPackage(PACKAGES[i]);
             File app = mBuild.getTestApp(APKS[i]);
-            mDevice.installPackage(app, false);
+            mDevice.installPackage(app, false, options);
         }
     }
 
@@ -90,8 +99,9 @@
 
     @TimeoutReq(minutes = 30)
     public void testTaskswitching() throws Exception {
-        HostReportLog report =
-                new HostReportLog(mDevice.getSerialNumber(), ReportLog.getClassMethodNames());
+        // TODO is this used?
+        HostReportLog report = new HostReportLog(mDevice.getSerialNumber(), mAbi.getName(),
+                ReportLog.getClassMethodNames());
         RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(PACKAGES[0], RUNNER,
                 mDevice.getIDevice());
         LocalListener listener = new LocalListener();
@@ -101,7 +111,7 @@
             fail(result.getRunFailureMessage());
         }
         assertNotNull("no performance data", mCtsReport);
-        CtsHostStore.storeCtsResult(mDevice.getSerialNumber(),
+        CtsHostStore.storeCtsResult(mDevice.getSerialNumber(), mAbi.getName(),
                 ReportLog.getClassMethodNames(), mCtsReport);
 
     }
@@ -110,7 +120,7 @@
         @Override
         public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
             // necessary as testMetrics passed from CollectingTestListerner is empty
-            mCtsReport = CtsReportUtil.getCtsResultFromMetrics(testMetrics);
+            mCtsReport = testMetrics.get("CTS_TEST_REPORT");
             super.testEnded(test, testMetrics);
         }
     }
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
index ed82b08..00845bd 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
@@ -57,6 +57,7 @@
             final CountDownLatch done = new CountDownLatch(1);
             final int version = i;
             DeviceInfoActivity.this.runOnUiThread(new Runnable() {
+                @Override
                 public void run() {
                     setContentView(new GLESSurfaceView(DeviceInfoActivity.this, version, done));
                 }
@@ -121,6 +122,7 @@
         ConfigurationInfo info = am.getDeviceConfigurationInfo();
         final int glVersion = (info.reqGlEsVersion & 0xffff0000) >> 16;
         new Thread() {
+            @Override
             public void run() {
                 runIterations(glVersion);
             }
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
index d77a44c..1eb4acb 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
@@ -51,6 +51,9 @@
     public static final String VERSION_RELEASE = "buildVersion";
     public static final String BUILD_ABI = "build_abi";
     public static final String BUILD_ABI2 = "build_abi2";
+    public static final String BUILD_ABIS = "build_abis";
+    public static final String BUILD_ABIS_32 = "build_abis_32";
+    public static final String BUILD_ABIS_64 = "build_abis_64";
     public static final String BUILD_FINGERPRINT = "build_fingerprint";
     public static final String BUILD_TYPE = "build_type";
     public static final String BUILD_MODEL = "build_model";
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
index cdf1df3..19349e5 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
@@ -28,6 +28,7 @@
 import android.os.Environment;
 import android.os.UserManager;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.Display;
@@ -38,6 +39,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Scanner;
@@ -71,6 +73,9 @@
         addResult(BUILD_FINGERPRINT, Build.FINGERPRINT);
         addResult(BUILD_ABI, Build.CPU_ABI);
         addResult(BUILD_ABI2, Build.CPU_ABI2);
+        addResult(BUILD_ABIS, TextUtils.join(",", Build.SUPPORTED_ABIS));
+        addResult(BUILD_ABIS_32, TextUtils.join(",", Build.SUPPORTED_32_BIT_ABIS));
+        addResult(BUILD_ABIS_64, TextUtils.join(",", Build.SUPPORTED_64_BIT_ABIS));
         addResult(SERIAL_NUMBER, Build.SERIAL);
 
         addResult(VERSION_RELEASE, Build.VERSION.RELEASE);
@@ -163,7 +168,7 @@
      * @param key the string of the key name.
      * @param value integer value.
      */
-    private void addResult(final String key, final int value){
+    static void addResult(final String key, final int value){
         mResults.putInt(key, value);
     }
 
@@ -173,7 +178,7 @@
      * @param key the string of the key name.
      * @param value float value.
      */
-    private void addResult(final String key, final float value){
+    static void addResult(final String key, final float value){
         mResults.putFloat(key, value);
     }
 
@@ -361,7 +366,6 @@
                 count, getContext().getExternalFilesDirs(Environment.DIRECTORY_PICTURES).length);
         count = Math.max(count, getContext().getObbDirs().length);
 
-        final String result;
         if (Environment.isExternalStorageEmulated()) {
             if (count == 1) {
                 return "1 emulated";
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java
index 1d3bf7f..04289e9 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java
@@ -16,7 +16,6 @@
 
 package android.tests.getinfo;
 
-import android.content.Context;
 import android.opengl.GLES20;
 import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
@@ -89,7 +88,7 @@
                     }
                 }
             }
-
+            scanner.close();
             mDone.countDown();
         }
 
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java
index fefff99..d8018a1 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java
@@ -146,13 +146,13 @@
         try {
             scanner = new Scanner(status);
 
-            scanner = findToken(scanner, "Name:");
+            findToken(scanner, "Name:");
             String name = scanner.next();
 
-            scanner = findToken(scanner, "Uid:");
+            findToken(scanner, "Uid:");
             boolean rootUid = hasRootId(scanner);
 
-            scanner = findToken(scanner, "Gid:");
+            findToken(scanner, "Gid:");
             boolean rootGid = hasRootId(scanner);
 
             return !ROOT_PROCESS_WHITELIST_PATTERN.matcher(name).matches()
@@ -182,13 +182,12 @@
      *
      * @param scanner to call next() until the token is found
      * @param token to find like "Name:"
-     * @return scanner after finding token
      */
-    private static Scanner findToken(Scanner scanner, String token) {
+    private static void findToken(Scanner scanner, String token) {
         while (true) {
             String next = scanner.next();
             if (next.equals(token)) {
-                return scanner;
+                return;
             }
         }
 
@@ -214,7 +213,7 @@
         File status = getProcessStatus(processDir);
         Scanner scanner = new Scanner(status);
         try {
-            scanner = findToken(scanner, "Name:");
+            findToken(scanner, "Name:");
             return scanner.next();
         } finally {
             scanner.close();
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java b/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
index 3aa57a0..903ac74 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
@@ -15,6 +15,7 @@
  */
 package com.android.cts.tradefed.device;
 
+import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.Log;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
@@ -22,6 +23,8 @@
 import com.android.tradefed.testtype.InstrumentationTest;
 
 import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * Collects info from device under test.
@@ -36,16 +39,22 @@
     private static final String APK_NAME = "TestDeviceSetup";
     public static final String APP_PACKAGE_NAME = "android.tests.devicesetup";
     private static final String INSTRUMENTATION_NAME = "android.tests.getinfo.DeviceInfoInstrument";
+    public static final Set<String> IDS = new HashSet<String>();
+    static {
+        for (String abi : AbiUtils.getAbisSupportedByCts()) {
+            IDS.add(AbiUtils.createId(abi, APP_PACKAGE_NAME));
+        }
+    }
 
     /**
      * Installs and runs the device info collector instrumentation, and forwards results
-     * to the <var>listener</var>
+     * to the listener.
      *
      * @param device
      * @param listener
      * @throws DeviceNotAvailableException
      */
-    public static void collectDeviceInfo(ITestDevice device, File testApkDir,
+    public static void collectDeviceInfo(ITestDevice device, String abi, File testApkDir,
             ITestInvocationListener listener) throws DeviceNotAvailableException {
         File apkFile = new File(testApkDir, String.format("%s.apk", APK_NAME));
         if (!apkFile.exists()) {
@@ -59,6 +68,7 @@
         // no need to collect tests and re-run
         instrTest.setRerunMode(false);
         instrTest.setPackageName(APP_PACKAGE_NAME);
+        instrTest.setRunName(AbiUtils.createId(abi, APP_PACKAGE_NAME));
         instrTest.setRunnerName(INSTRUMENTATION_NAME);
         instrTest.run(listener);
     }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
index 956f1b1..5357588 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
@@ -272,7 +272,7 @@
         String perfResult = CtsReportUtil.getCtsResultFromMetrics(testMetrics);
         // host test should be checked in CtsHostStore.
         if (perfResult == null) {
-            perfResult = CtsHostStore.removeCtsResult(mDeviceSerial, test.toString());
+            perfResult = CtsHostStore.removeCtsResult(mDeviceSerial, "armeabi-v7a", test.toString());
         }
         if (perfResult != null) {
             // CTS result is passed in Summary++++Details format.
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/Abi.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/Abi.java
new file mode 100644
index 0000000..926e14b
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/Abi.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.tradefed.testtype;
+
+import com.android.tradefed.testtype.IAbi;
+/**
+ * A class representing an ABI.
+ */
+public class Abi implements IAbi {
+
+    private String mName;
+    private String mBitness;
+
+    public Abi(String name, String bitness) {
+        mName = name;
+        mBitness = bitness;
+    }
+
+    @Override
+    public String getName() {
+        return mName;
+    }
+
+    @Override
+    public String getBitness() {
+        return mBitness;
+    }
+
+}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
index 4cfd263..17391ed 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
@@ -16,8 +16,8 @@
 
 package com.android.cts.tradefed.testtype;
 
-import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.tradefed.build.IBuildInfo;
+import com.android.cts.util.AbiUtils;
+import com.android.ddmlib.Log;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.util.FileUtil;
@@ -39,7 +39,10 @@
  * maintained so cts-tradefed can run against older CTS builds that still
  * require this class.
  */
-public class AccessibilityServiceTestRunner extends InstrumentationApkTest {
+@Deprecated
+public class AccessibilityServiceTestRunner extends CtsInstrumentationApkTest {
+
+    private static final String LOG_TAG = AccessibilityServiceTestRunner.class.getSimpleName();
 
     private static final String DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME =
         "android.accessibilityservice.delegate";
@@ -50,14 +53,6 @@
     private static final String DELEGATING_ACCESSIBLITY_SERVICE_APK =
         "CtsDelegatingAccessibilityService.apk";
 
-    private CtsBuildHelper mCtsBuild;
-
-    @Override
-    public void setBuild(IBuildInfo build) {
-        super.setBuild(build);
-        mCtsBuild  = CtsBuildHelper.createBuildHelper(build);
-    }
-
     @Override
     public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
         beforeTest();
@@ -77,7 +72,9 @@
 
     private void installApkAndAssert(String apkName) throws DeviceNotAvailableException {
         File file = FileUtil.getFileForPath(mCtsBuild.getTestCasesDir(), apkName);
-        String errorMessage = getDevice().installPackage(file, true);
+        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+        Log.d(LOG_TAG, "installPackage options: " + options);
+        String errorMessage = getDevice().installPackage(file, true, options);
         TestCase.assertNull("Error installing: " + apkName, errorMessage);
     }
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java
index 2a4239a..932a8a1 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java
@@ -16,9 +16,9 @@
 
 package com.android.cts.tradefed.testtype;
 
-import com.android.cts.tradefed.build.CtsBuildHelper;
 import com.android.cts.tradefed.targetprep.SettingsToggler;
-import com.android.tradefed.build.IBuildInfo;
+import com.android.cts.util.AbiUtils;
+import com.android.ddmlib.Log;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
@@ -37,7 +37,9 @@
  * these services, running the tests, disabling the services, and removing
  * the accessibility services package.
  */
-public class AccessibilityTestRunner extends InstrumentationApkTest {
+public class AccessibilityTestRunner extends CtsInstrumentationApkTest {
+
+    private static final String LOG_TAG = AccessibilityTestRunner.class.getSimpleName();
 
     private static final String SOME_ACCESSIBLITY_SERVICES_PACKAGE_NAME =
         "android.view.accessibility.services";
@@ -51,14 +53,6 @@
     private static final String SOME_ACCESSIBLITY_SERVICES_APK =
         "CtsSomeAccessibilityServices.apk";
 
-    private CtsBuildHelper mCtsBuild;
-
-    @Override
-    public void setBuild(IBuildInfo build) {
-        super.setBuild(build);
-        mCtsBuild  = CtsBuildHelper.createBuildHelper(build);
-    }
-
     @Override
     public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
         beforeTest();
@@ -78,7 +72,9 @@
 
     private void installApkAndAssert(String apkName) throws DeviceNotAvailableException {
         File file = FileUtil.getFileForPath(mCtsBuild.getTestCasesDir(), apkName);
-        String errorMessage = getDevice().installPackage(file, true);
+        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+        Log.d(LOG_TAG, "installPackage options: " + options);
+        String errorMessage = getDevice().installPackage(file, true, options);
         TestCase.assertNull("Error installing: " + apkName, errorMessage);
     }
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsInstrumentationApkTest.java
similarity index 75%
rename from tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java
rename to tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsInstrumentationApkTest.java
index 4195dda..1e42f3b 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsInstrumentationApkTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2014 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,18 +16,15 @@
 package com.android.cts.tradefed.testtype;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.Log;
 import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.Option;
-import com.android.tradefed.config.Option.Importance;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.InstrumentationTest;
-import com.android.tradefed.util.AbiFormatter;
-
-import junit.framework.Assert;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -35,25 +32,32 @@
 import java.util.Collection;
 
 /**
- * A {@link InstrumentationTest} that will install CTS apks
+ * An {@link InstrumentationTest} that will install CTS apks
  * before test execution, and uninstall on execution completion.
  */
-public class InstrumentationApkTest extends InstrumentationTest implements IBuildReceiver {
+public class CtsInstrumentationApkTest extends InstrumentationTest implements IBuildReceiver {
 
-    private static final String LOG_TAG = "InstrumentationApkTest";
+    private static final String LOG_TAG = "CtsInstrumentationApkTest";
 
     /** the file names of the CTS apks to install */
     private Collection<String> mInstallFileNames = new ArrayList<String>();
     private Collection<String> mUninstallPackages = new ArrayList<String>();
+    protected CtsBuildHelper mCtsBuild = null;
+    protected IAbi mAbi = null;
 
-    private CtsBuildHelper mCtsBuild = null;
+    /**
+     * @param abi the ABI to run the test on
+     */
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
 
     /**
      * {@inheritDoc}
      */
     @Override
     public void setBuild(IBuildInfo build) {
-        mCtsBuild  = CtsBuildHelper.createBuildHelper(build);
+        mCtsBuild = CtsBuildHelper.createBuildHelper(build);
     }
 
     /**
@@ -76,11 +80,11 @@
         ITestDevice mTestDevice = getDevice();
 
         if (mTestDevice == null) {
-            Log.e(LOG_TAG, String.format("Missing device."));
+            Log.e(LOG_TAG, "Missing device.");
             return;
         }
         if (mCtsBuild == null) {
-            Log.e(LOG_TAG, String.format("Missing build %s", mCtsBuild));
+            Log.e(LOG_TAG, "Missing build");
             return;
         }
 
@@ -90,14 +94,7 @@
             try {
                 File apkFile = mCtsBuild.getTestApp(apkFileName);
                 String errorCode = null;
-                String[] options = {};
-                String forceAbi = getForceAbi();
-                if (forceAbi != null) {
-                    String abi = AbiFormatter.getDefaultAbi(mTestDevice, forceAbi);
-                    if (abi != null) {
-                        options = new String[]{String.format("--abi %s ", abi)};
-                    }
-                }
+                String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
                 Log.d(LOG_TAG, "installPackage options: " + options);
                 errorCode = mTestDevice.installPackage(apkFile, true, options);
                 if (errorCode != null) {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
index 2e3fadc..5917479 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
@@ -487,8 +487,8 @@
                 if (test instanceof InstrumentationTest) {
                     ((InstrumentationTest)test).setForceAbi(mForceAbi);
                 }
-                if (test instanceof DeqpTest) {
-                    ((DeqpTest)test).setCollectLogs(mCollectDeqpLogs);
+                if (test instanceof DeqpTestRunner) {
+                    ((DeqpTestRunner)test).setCollectLogs(mCollectDeqpLogs);
                 }
 
                 forwardPackageDetails(knownTests.getPackageDef(), listener);
@@ -821,7 +821,7 @@
     void collectDeviceInfo(ITestDevice device, CtsBuildHelper ctsBuild,
             ITestInvocationListener listener) throws DeviceNotAvailableException {
         if (!mSkipDeviceInfo) {
-            DeviceInfoCollector.collectDeviceInfo(device, ctsBuild.getTestCasesDir(), listener);
+            DeviceInfoCollector.collectDeviceInfo(device, "armeabi-v7a", ctsBuild.getTestCasesDir(), listener);
         }
     }
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
similarity index 93%
rename from tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTest.java
rename to tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
index 5149695..6c6267f 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
@@ -1,28 +1,18 @@
 package com.android.cts.tradefed.testtype;
 
-import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.ddmlib.IShellOutputReceiver;
 import com.android.ddmlib.MultiLineReceiver;
 import com.android.ddmlib.testrunner.ITestRunListener;
 import com.android.ddmlib.testrunner.TestIdentifier;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.Option;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.result.ByteArrayInputStreamSource;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.LogDataType;
-import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.lang.Thread;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -35,7 +25,7 @@
  *
  * Supports running drawElements Quality Program tests found under external/deqp.
  */
-public class DeqpTest implements IDeviceTest, IRemoteTest {
+public class DeqpTestRunner implements IDeviceTest, IRemoteTest {
     final private int TESTCASE_BATCH_LIMIT = 1000;
 
     private boolean mLogData;
@@ -45,6 +35,7 @@
     private final String mUri;
     private final String mName;
     private Collection<TestIdentifier> mTests;
+    private IAbi mAbi;
 
     private TestIdentifier mCurrentTestId;
     private boolean mGotTestResult;
@@ -52,7 +43,7 @@
 
     private ITestInvocationListener mListener;
 
-    public DeqpTest(String uri, String name, Collection<TestIdentifier> tests) {
+    public DeqpTestRunner(String uri, String name, Collection<TestIdentifier> tests) {
         mUri = uri;
         mName = name;
         mTests = tests;
@@ -60,6 +51,13 @@
     }
 
     /**
+     * @param abi the ABI to run the test on
+     */
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    /**
      * Enable or disable raw dEQP test log collection.
      */
     public void setCollectLogs(boolean logData) {
@@ -70,14 +68,14 @@
      * dEQP instrumentation parser
      */
     class InstrumentationParser extends MultiLineReceiver {
-        private DeqpTest mDeqpTests;
+        private DeqpTestRunner mDeqpTests;
 
         private Map<String, String> mValues;
         private String mCurrentName;
         private String mCurrentValue;
 
 
-        public InstrumentationParser(DeqpTest tests) {
+        public InstrumentationParser(DeqpTestRunner tests) {
             mDeqpTests = tests;
         }
 
@@ -86,8 +84,7 @@
          */
         @Override
         public void processNewLines(String[] lines) {
-            for (String line : lines)
-            {
+            for (String line : lines) {
                 if (mValues == null) mValues = new HashMap<String, String>();
 
                 if (line.startsWith("INSTRUMENTATION_STATUS_CODE: ")) {
@@ -151,8 +148,7 @@
     /**
      * Converts dEQP testcase path to TestIdentifier.
      */
-    private TestIdentifier pathToIdentifier(String testPath)
-    {
+    private TestIdentifier pathToIdentifier(String testPath) {
         String[] components = testPath.split("\\.");
         String name = components[components.length - 1];
         String className = null;
@@ -286,8 +282,9 @@
     public void handleStatus(Map<String, String> values) {
         String eventType = values.get("dEQP-EventType");
 
-        if (eventType == null)
+        if (eventType == null) {
             return;
+        }
 
         if (eventType.compareTo("BeginSession") == 0) {
             handleBeginSession(values);
@@ -330,7 +327,7 @@
         }
 
         if (!tests.isEmpty()) {
-            HashMap<String, ArrayList<String> > testGroups = new HashMap();
+            HashMap<String, ArrayList<String> > testGroups = new HashMap<>();
 
             // Collect all sub testgroups
             for (String test : tests) {
@@ -338,7 +335,7 @@
                 ArrayList<String> testGroup = testGroups.get(components[0]);
 
                 if (testGroup == null) {
-                    testGroup = new ArrayList();
+                    testGroup = new ArrayList<String>();
                     testGroups.put(components[0], testGroup);
                 }
 
@@ -360,10 +357,10 @@
     }
 
     /**
-     * Generates testacase trie from TestIdentifiers.
+     * Generates testcase trie from TestIdentifiers.
      */
     private String generateTestCaseTrie(Collection<TestIdentifier> tests) {
-        ArrayList<String> testPaths = new ArrayList();
+        ArrayList<String> testPaths = new ArrayList<String>();
 
         for (TestIdentifier test : tests) {
             testPaths.add(test.getClassName() + "." + test.getTestName());
@@ -391,6 +388,7 @@
 
         String instrumentationName =
                 "com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation";
+        // TODO run the test with the given ABI
         String command = "am instrument -w -e deqpLogFileName \"" + logFileName
                 + "\" -e deqpCmdLine \"--deqp-caselist-file=" + caseListFileName + " "
                 + "--deqp-gl-config-name=rgba8888d24s8\" "
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java
index 4c83aa9..59bfcf8 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java
@@ -25,7 +25,7 @@
  * Secure settings cannot be changed from device CTS tests since system signature permission is
  * required. Such settings can be modified by the shell user, so a host side test is used.
  */
-public class DisplayTestRunner extends InstrumentationApkTest {
+public class DisplayTestRunner extends CtsInstrumentationApkTest {
     private static final String OVERLAY_DISPLAY_DEVICES_SETTING_NAME = "overlay_display_devices";
 
     // Use a non-standard pattern, must match values in tests/tests/display/.../DisplayTest.java
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
index 035b4a2..9bfe151 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
@@ -23,6 +23,7 @@
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
@@ -47,6 +48,7 @@
 
     private CtsBuildHelper mCtsBuild;
     private ITestDevice mDevice;
+    private IAbi mAbi;
 
     private final String mPackageName;
     private final String mExeName;
@@ -56,6 +58,13 @@
         mExeName = exeName;
     }
 
+    /**
+     * @param abi The ABI to run the test on
+     */
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
     @Override
     public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
         if (installTest()) {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JUnitDeviceTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JUnitDeviceTest.java
index 4adcb0b..5efa7cd 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JUnitDeviceTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JUnitDeviceTest.java
@@ -25,6 +25,7 @@
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
@@ -52,10 +53,6 @@
 
     private static final String TMP_DIR = "/data/local/tmp/";
 
-    @Option(name = AbiFormatter.FORCE_ABI_STRING, description = AbiFormatter.FORCE_ABI_DESCRIPTION,
-            importance = Importance.IF_UNSET)
-    private String mForceAbi = null;
-
     @Option(name = "junit-device-runtime",
             description = "The name of the runtime to use on the device",
             importance = Importance.ALWAYS)
@@ -79,12 +76,19 @@
 
     private String mRuntimeArgs;
 
-
+    private IAbi mAbi;
 
     private static final String JUNIT_JAR = "cts-junit.jar";
 
     private Set<String> mTestJars = new HashSet<String>(Arrays.asList(JUNIT_JAR));
 
+    /**
+     * @param abi The ABI to run the test on
+     */
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
     @Override
     public ITestDevice getDevice() {
         return mDevice;
@@ -127,7 +131,7 @@
                         "com.android.cts.junit.SingleJUnitTestRunner %s#%s",
                         mDeviceTestTmpPath, mRuntimePath, jarPath, mRuntimeArgs,
                         testId.getClassName(), testId.getTestName());
-                String cmd = AbiFormatter.formatCmdForAbi(cmdLine, mForceAbi);
+                String cmd = AbiFormatter.formatCmdForAbi(cmdLine, mAbi.getBitness());
                 CLog.d("Running %s", cmd);
                 listener.testStarted(testId);
                 mDevice.executeShellCommand(cmd, resultParser, mMaxTimeToOutputResponse,
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
index 22a016a..9d9596e 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
@@ -23,8 +23,9 @@
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
-
 import com.android.tradefed.testtype.DeviceTestResult.RuntimeDeviceNotAvailableException;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
@@ -59,10 +60,17 @@
     private String mRunName;
     private CtsBuildHelper mCtsBuild = null;
     private IBuildInfo mBuildInfo = null;
-
+    private IAbi mAbi;
     private ClassLoader mClassLoader;
 
     /**
+     * @param abi the ABI to run the test on
+     */
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -133,7 +141,7 @@
      * Tests that take longer than this amount will be failed with a {@link TestTimeoutException}
      * as the cause.
      *
-     * @param testTimeout
+     * @param testTimeoutMs
      */
     void setTimeout(long testTimeoutMs) {
         mTimeoutMs = testTimeoutMs;
@@ -190,14 +198,6 @@
     }
 
     /**
-     * setOptions sets options to the tests invoked from this test.
-     * It is used to passing options from JarHostTest to the tests started by JarHostTest.
-     * The default implementation does nothing.
-     */
-    protected void setOptions(Test junitTest) throws ConfigurationException {
-    }
-
-    /**
      * Run test with timeout support.
      */
     private void runTest(TestIdentifier testId, final Test junitTest, final TestResult junitResult) {
@@ -210,14 +210,12 @@
             deviceTest.setDevice(getDevice().getIDevice());
             deviceTest.setTestAppPath(mCtsBuild.getTestCasesDir().getAbsolutePath());
         }
+        if (junitTest instanceof IAbiReceiver) {
+            ((IAbiReceiver)junitTest).setAbi(mAbi);
+        }
         if (junitTest instanceof IBuildReceiver) {
             ((IBuildReceiver)junitTest).setBuild(mBuildInfo);
         }
-        try {
-            setOptions(junitTest);
-        } catch (ConfigurationException e) {
-            Log.e(LOG_TAG, e.toString());
-        }
         TestRunnable testRunnable = new TestRunnable(junitTest, junitResult);
 
         CommandStatus status = RunUtil.getDefault().runTimed(mTimeoutMs, testRunnable, true);
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java
index a7a6ccc..44d2d3a 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java
@@ -18,12 +18,14 @@
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
 import com.android.cts.tradefed.targetprep.SettingsToggler;
+import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner;
 import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner.TestSize;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
@@ -65,6 +67,7 @@
 
     private CtsBuildHelper mCtsBuild;
 
+    private IAbi mAbi;
     private String mPackageName;
     private String mRunnerName = "android.test.InstrumentationTestRunner";
     private String mTestClassName;
@@ -75,6 +78,13 @@
     private String mRunName = null;
     private Map<String, String> mInstrArgMap = new HashMap<String, String>();
 
+    /**
+     * @param abi The ABI to run the test on
+     */
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
     @Override
     public void setBuild(IBuildInfo buildInfo) {
         mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
@@ -191,8 +201,9 @@
 
     private void installTestsAndServicesApk() throws DeviceNotAvailableException {
         try {
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
             String installCode = getDevice().installPackage(mCtsBuild.getTestApp(
-                    PRINT_TEST_AND_SERVICES_APP_NAME), true);
+                    PRINT_TEST_AND_SERVICES_APP_NAME), true, options);
             if (installCode != null) {
                 throw new IllegalArgumentException("Failed to install "
                         + PRINT_TEST_AND_SERVICES_APP_NAME + " on " + getDevice().getSerialNumber()
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
index 7a9756c..863a7a7 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
@@ -235,7 +235,7 @@
             mDigest = generateDigest(testCaseDir, mJarPath);
             return vmHostTest;
         } else if (DEQP_TEST.equals(mTestType)) {
-            return new DeqpTest(mUri, mName, mTests);
+            return new DeqpTestRunner(mUri, mName, mTests);
         } else if (NATIVE_TEST.equals(mTestType)) {
             return new GeeTest(mUri, mName);
         } else if (WRAPPED_NATIVE_TEST.equals(mTestType)) {
@@ -261,7 +261,7 @@
             // specialized instrumentation. Eventually this special case for signatureTest can be
             // removed, and it can be treated just like a normal InstrumentationTest
             CLog.d("Creating signature test %s", mName);
-            InstrumentationApkTest instrTest = new InstrumentationApkTest();
+            CtsInstrumentationApkTest instrTest = new CtsInstrumentationApkTest();
             instrTest.setPackageName(mAppNameSpace);
             instrTest.setRunnerName("android.test.InstrumentationTestRunner");
             instrTest.setClassName(SIGNATURE_TEST_CLASS);
@@ -285,7 +285,7 @@
             return jUnitDeviceTest;
         } else {
             CLog.d("Creating instrumentation test for %s", mName);
-            InstrumentationApkTest instrTest = new InstrumentationApkTest();
+            CtsInstrumentationApkTest instrTest = new CtsInstrumentationApkTest();
             if (mTimeoutInMins >= 0) {
                 // as timeout cannot be set for each test,
                 // increase the time-out of the whole package
@@ -309,13 +309,13 @@
     }
 
     /**
-     * Populates given {@link InstrumentationApkTest} with data from the package xml.
+     * Populates given {@link CtsInstrumentationApkTest} with data from the package xml.
      *
      * @param testCaseDir
      * @param instrTest
      * @return the populated {@link InstrumentationTest} or <code>null</code>
      */
-    private InstrumentationTest setInstrumentationTest(InstrumentationApkTest instrTest,
+    private InstrumentationTest setInstrumentationTest(CtsInstrumentationApkTest instrTest,
             File testCaseDir) {
         instrTest.setRunName(getUri());
         instrTest.setPackageName(mAppNameSpace);
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java
index 9b4c86d..0ebdeea 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/VMHostTest.java
@@ -16,19 +16,12 @@
 package com.android.cts.tradefed.testtype;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.tradefed.config.ConfigurationException;
-import com.android.tradefed.config.Option;
-import com.android.tradefed.config.Option.Importance;
-import com.android.tradefed.config.OptionSetter;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.util.AbiFormatter;
 import com.android.tradefed.util.FileUtil;
 
-import junit.framework.Test;
-
 import java.io.File;
 import java.io.IOException;
 import java.util.zip.ZipFile;
@@ -42,12 +35,6 @@
     private static final String VM_TEST_TEMP_DIR = "/data/local/tmp/vm-tests";
     private static final String EMULATOR_TEMP_DIR = "/data/local/tmp";
 
-    @Option(name = AbiFormatter.FORCE_ABI_STRING,
-            description = AbiFormatter.FORCE_ABI_DESCRIPTION,
-            importance = Importance.IF_UNSET)
-    private String mForceAbi = null;
-
-
     /**
      * {@inheritDoc}
      */
@@ -108,14 +95,6 @@
         return true;
     }
 
-    @Override
-    protected void setOptions(Test junitTest) throws ConfigurationException{
-        if (mForceAbi != null) {
-            OptionSetter optionSetter = new OptionSetter(junitTest);
-            optionSetter.setOptionValue(AbiFormatter.FORCE_ABI_STRING, mForceAbi);
-        }
-    }
-
     /**
      * Removes temporary file directory from device
      *
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTest.java
index 78cd6f77..9c19f36 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/WrappedGTest.java
@@ -17,18 +17,17 @@
 package com.android.cts.tradefed.testtype;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.testrunner.ITestRunListener;
 import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.Option;
-import com.android.tradefed.config.Option.Importance;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.util.AbiFormatter;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -38,21 +37,19 @@
  */
 public class WrappedGTest implements IBuildReceiver, IDeviceTest, IRemoteTest {
 
+    private static final String LOG_TAG = WrappedGTest.class.getSimpleName();
+
     private int mMaxTestTimeMs = 1 * 60 * 1000;
 
     private CtsBuildHelper mCtsBuild;
     private ITestDevice mDevice;
+    private IAbi mAbi;
 
     private final String mAppNameSpace;
     private final String mRunner;
     private final String mName;
     private final String mUri;
 
-    @Option(name = AbiFormatter.FORCE_ABI_STRING,
-            description = AbiFormatter.FORCE_ABI_DESCRIPTION,
-            importance = Importance.IF_UNSET)
-    private String mForceAbi = null;
-
     public WrappedGTest(String appNameSpace, String uri, String name, String runner) {
         mAppNameSpace = appNameSpace;
         mRunner = runner;
@@ -60,6 +57,13 @@
         mUri = uri;
     }
 
+    /**
+     * @param abi The ABI to run the test on
+     */
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
     @Override
     public void setBuild(IBuildInfo buildInfo) {
         mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
@@ -88,7 +92,9 @@
     private boolean installTest() throws DeviceNotAvailableException {
         try {
             File testApp = mCtsBuild.getTestApp(String.format("%s.apk", mName));
-            String installCode = mDevice.installPackage(testApp, true);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+            CLog.d(LOG_TAG, "installPackage options: " + options);
+            String installCode = mDevice.installPackage(testApp, true, options);
 
             if (installCode != null) {
                 CLog.e("Failed to install %s.apk on %s. Reason: %s", mName,
@@ -107,13 +113,7 @@
         WrappedGTestResultParser resultParser = new WrappedGTestResultParser(mUri, listener);
         resultParser.setFakePackagePrefix(mUri + ".");
         try {
-            String options = "";
-            if (mForceAbi != null) {
-                String abi = AbiFormatter.getDefaultAbi(getDevice(), mForceAbi);
-                if (abi != null) {
-                    options = String.format("--abi %s ", abi);
-                }
-            }
+            String options = mAbi == null ? "" : String.format("--abi %s ", mAbi);
             String command = String.format("am instrument -w %s%s/.%s", options, mAppNameSpace, mRunner);
             mDevice.executeShellCommand(command, resultParser, mMaxTestTimeMs, 0);
         } catch (DeviceNotAvailableException e) {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java b/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java
index 9c1e283..186d08e 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java
@@ -33,26 +33,27 @@
      * Note that key is generated in the form of device_serial#class#method name.
      * So there should be no concurrent test for the same (serial, class, method).
      * @param deviceSerial
+     * @param abi
      * @param classMethodName
      * @param result CTS result string
      */
-    public static void storeCtsResult(String deviceSerial, String classMethodName, String result) {
-        mMap.put(generateTestKey(deviceSerial, classMethodName), result);
+    public static void storeCtsResult(String deviceSerial, String abi, String classMethodName, String result) {
+        mMap.put(generateTestKey(deviceSerial, abi, classMethodName), result);
     }
 
     /**
      * retrieves a CTS result for the given condition and remove it from the internal
      * storage. If there is no result for the given condition, it will return null.
      */
-    public static String removeCtsResult(String deviceSerial, String classMethodName) {
-        return mMap.remove(generateTestKey(deviceSerial, classMethodName));
+    public static String removeCtsResult(String deviceSerial, String abi, String classMethodName) {
+        return mMap.remove(generateTestKey(deviceSerial, abi, classMethodName));
     }
 
     /**
-     * return test key in the form of device_serial#class_name#method_name
+     * return test key in the form of device_serial#abi#class_name#method_name
      */
-    private static String generateTestKey(String deviceSerial, String classMethodName) {
-        return String.format("%s#%s", deviceSerial, classMethodName);
+    private static String generateTestKey(String deviceSerial, String abi, String classMethodName) {
+        return String.format("%s#%s#%s", deviceSerial, abi, classMethodName);
 
     }
 }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java b/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java
index 125c56e..da0d4bb 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java
@@ -24,19 +24,22 @@
  */
 public class HostReportLog extends ReportLog {
     private String mDeviceSerial;
+    private String mAbi;
     private String mClassMethodName;
 
     /**
      * @param deviceSerial serial number of the device
+     * @param abi abi the test was run on
      * @param classMethodName class name and method name of the test in class#method format.
      *        Note that ReportLog.getClassMethodNames() provide this.
      */
-    public HostReportLog(String deviceSerial, String classMethodName) {
+    public HostReportLog(String deviceSerial, String abi, String classMethodName) {
         mDeviceSerial = deviceSerial;
+        mAbi = abi;
         mClassMethodName = classMethodName;
     }
 
     public void deliverReportToHost() {
-        CtsHostStore.storeCtsResult(mDeviceSerial, mClassMethodName, generateReport());
+        CtsHostStore.storeCtsResult(mDeviceSerial, mAbi, mClassMethodName, generateReport());
     }
 }
diff --git a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
index 3630446..0307375 100644
--- a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
+++ b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
@@ -211,19 +211,19 @@
         curJunitFileData = getWarningMessage() +
         "package " + pName + ";\n" +
         "import java.io.IOException;\n" +
+        "import com.android.tradefed.testtype.IAbi;\n" +
+        "import com.android.tradefed.testtype.IAbiReceiver;\n" +
         "import com.android.tradefed.testtype.DeviceTestCase;\n" +
-        "import com.android.tradefed.config.Option;\n" +
-        "import com.android.tradefed.config.Option.Importance;\n" +
         "import com.android.tradefed.util.AbiFormatter;\n" +
         "\n" +
-        "public class " + sourceName + " extends DeviceTestCase {\n";
+        "public class " + sourceName + " extends DeviceTestCase implements IAbiReceiver {\n";
     }
 
     private String getShellExecJavaLine(String classpath, String mainclass) {
       String cmd = String.format("ANDROID_DATA=%s dalvikvm|#ABI#| -Xmx512M -Xss32K " +
               "-Djava.io.tmpdir=%s -classpath %s %s", TARGET_JAR_ROOT_PATH, TARGET_JAR_ROOT_PATH,
               classpath, mainclass);
-      return "String cmd = AbiFormatter.formatCmdForAbi(\"" + cmd + "\", mForceAbi);\n" +
+      return "String cmd = AbiFormatter.formatCmdForAbi(\"" + cmd + "\", mAbi.getBitness());\n" +
           "String res = getDevice().executeShellCommand(cmd);\n" +
           "// A sucessful adb shell command returns an empty string.\n" +
           "assertEquals(cmd, \"\", res);";
@@ -283,9 +283,12 @@
 
             openCTSHostFileFor(pName, classOnlyName);
 
-            curJunitFileData += "@Option(name = AbiFormatter.FORCE_ABI_STRING,\n" +
-                "description = AbiFormatter.FORCE_ABI_DESCRIPTION,\n" +
-                "importance = Importance.IF_UNSET)\nprivate String mForceAbi = null;\n\n";
+            curJunitFileData += "\n" +
+                    "protected IAbi mAbi;\n" +
+                    "@Override\n" +
+                    "public void setAbi(IAbi abi) {\n" +
+                    "    mAbi = abi;\n" +
+                    "}\n\n";
 
             List<String> methods = entry.getValue();
             Collections.sort(methods, new Comparator<String>() {