[!IMPORTANT] This page was copied from https://github.com/dart-lang/sdk/wiki and needs review. Please contribute changes to bring it up-to-date - removing this header - or send a CL to delete the file.


Introduction

It is possible to build and run the standalone Dart VM for Android devices. This setup is not yet thoroughly tested, but is available for experimentation.

Limitations

  • The host (build) machine must be an x86 Linux machine.
  • The target (Android) device must be a device or emulator that supports the Android NDK.
  • The resulting Android Dart VM can only be run from the Android command line.
  • The resulting Android Dart VM only has access to dart:core APIs. It does not have access to the Android C or Java APIs.
  • The Android-related tools and emulator image files will take about 2GB of disk space on the host machine.

One-time Setup

Download and install the Dart source tree using the standard instructions for building Dart.

Use a text editor to add the following line to the very bottom of your Dart .gclient file (which is located in the directory that contains the main ‘dart’ directory):

download_android_deps = True

Run gclient sync to install the Android NDK and SDK. This may take 10 minutes or more depending upon the speed of your Internet connection

$ gclient sync

Building for Android

Once you've set up your build tree, you can build the Dart VM for Android by using the standard Dart build script with the addition of the --os android build flag:

$ tools/build.py --no-goma --arch=arm,arm64,ia32,x64 --os=android runtime

Testing the result

Adding adb to your path

For convenience, add the path to the adb tool to your shell PATH:

$ export PATH=$PATH:path-to-dart/third_party/android_tools/sdk/platform-tools

Starting an Android emulator

You can start an emulator running, by using the android_finder.py script:

$ runtime/tools/android_finder.py -a {armeabi-v7a, x86} -b

The -a flag says to find an Android device for the specified architecture. The -b flag says to start (or bootstrap) a new emulator if no existing emulator or device with a given ABI can be found. This script could take up to 20 seconds to run if a new emulator needs to be started.

Running the Dart VM on an Android emulator

Once you have finished building the Android Dart VM and have a running Android emulator, you can run Dart scripts on the emulator as follows:

Create a directory on the Android emulator.

$ adb shell mkdir /data/local/tmp/dart

Copy the Dart VM executable to the Android emulator:

$ adb push out/android/ReleaseAndroid{ARM,ARM64,IA32,X64}/dart /data/local/tmp/dart/dart

Create a simple Dart test script:

$ echo "main(){ print(\"Hello, world\!\");}" >hello.dart

Copy the Dart test script to the Android emulator:

$ adb push hello.dart /data/local/tmp/dart

Run the Dart VM with the test script:

$ adb shell /data/local/tmp/dart/dart /data/local/tmp/dart/hello.dart

Hello, world!

Stopping an Android Emulator

You can list all currently attached Android devices, including emulators, using the adb command:

$ adb devices

You can stop a running emulator using the adb emu kill command:

$ adb emu kill ← if there is just one emulator running

or

$ adb -s emulator-name emu kill ← if there is more than one emulator running

Running the Dart VM on an Android device

First, make sure that the “USB Debugging” mode is enabled by navigating to Settings > Developer options > USB debugging. The box should be checked. You may need to have root on the device.

Now, plug in your device. Then, run:

$ adb devices

There should be an entry for your device, such as:

List of devices attached 
TA23701VKR  device

Now, you can copy dart and hello.dart to the device as above. If an emulator is also running, be sure to give adb the -d switch to tell it to use the attached device instead of the emulator. Use the -s switch to give the device ID explicitly.

Notes

The only effect of the target_os line in the Dart .gclient configuration file is to install the Android tools. Despite what the name target_os implies, the target_os line does not affect which OS is targeted. Therefore, once you've installed the Android tools you can (and should) leave the target_os = ["android"] line in place even when switching back and forth between building for Android and building for Linux.