Through cross compilation, on Linux it is possible to build CoreCLR for arm64 Android.
You'll need to generate a toolchain and a sysroot for Android. There's a script which takes care of the required steps.
To generate the rootfs, run the following command in the coreclr folder:
cross/init-android-rootfs.sh
This will download the NDK and any packages required to compile Android on your system. It's over 1 GB of data, so it may take a while.
Once the rootfs has been generated, it will be possible to cross compile CoreCLR.
When cross compiling, you need to set both the CONFIG_DIR and ROOTFS_DIR variables.
To compile for arm64, run:
CONFIG_DIR=`realpath cross/android/arm64` ROOTFS_DIR=`realpath cross/android-rootfs/toolchain/arm64/sysroot` ./build.sh cross arm64 cmakeargs -DENABLE_LLDBPLUGIN=0
The resulting binaries will be found in artifacts/bin/coreclr/Linux.BuildArch.BuildType/
You can run the PAL tests on an Android device. To run the tests, you first copy the PAL tests to your Android phone using
adb, and then run them in an interactive Android shell using adb shell:
To copy the PAL tests over to an Android phone:
adb push artifacts/obj/coreclr/Linux.arm64.Debug/src/pal/tests/palsuite/ /data/local/tmp/coreclr/pal/tests/palsuite
adb push cross/android/toolchain/arm64/sysroot/usr/lib/libandroid-support.so /data/local/tmp/coreclr/lib/
adb push cross/android/toolchain/arm64/sysroot/usr/lib/libandroid-glob.so /data/local/tmp/coreclr/lib/
adb push src/pal/tests/palsuite/paltestlist.txt /data/local/tmp/coreclr
adb push src/pal/tests/palsuite/runpaltests.sh /data/local/tmp/coreclr/
Then, use adb shell to launch a shell on Android. Inside that shell, you can launch the PAL tests:
LD_LIBRARY_PATH=/data/local/tmp/coreclr/lib ./runpaltests.sh /data/local/tmp/coreclr/
You can debug coreclr on Android using a remote lldb server which you run on your Android device.
First, push the lldb server to Android:
adb push cross/android/lldb/2.2/android/arm64-v8a/lldb-server /data/local/tmp/
Then, launch the lldb server on the Android device. Open a shell using adb shell and run:
adb shell
cd /data/local/tmp
./lldb-server platform --listen *:1234
After that, you'll need to forward port 1234 from your Android device to your PC:
adb forward tcp:1234 tcp:1234
Finally, install lldb on your PC and connect to the debug server running on your Android device:
lldb-3.9
(lldb) platform select remote-android
Platform: remote-android
Connected: no
(lldb) platform connect connect://localhost:1234
Platform: remote-android
Triple: aarch64-*-linux-android
OS Version: 23.0.0 (3.10.84-perf-gf38969a)
Kernel: #1 SMP PREEMPT Fri Sep 16 11:29:29 2016
Hostname: localhost
Connected: yes
WorkingDir: /data/local/tmp
(lldb) target create coreclr/pal/tests/palsuite/file_io/CopyFileA/test4/paltest_copyfilea_test4
(lldb) env LD_LIBRARY_PATH=/data/local/tmp/coreclr/lib
(lldb) run