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