How to build Perl on Android 4.4
The recent release of Perl 5.20 came with the exciting news that Perl was now installable on Android, Google’s mobile operating system. But before you get grand visions of flying phone-controlled drones via UAV::Pilot, know that right now, how to get a working Perl binary is just about all that’s documented. This article shows you how to get that far - solving the rest is left for the pioneers!
Requirements
To build Perl on Android you’ll need a unix-like environment (Cygwin may work too). This article describes installing Perl on an Android Virtual Device (AVD), so you do not need an Android phone to try Perl on Android.
Preparation
Download the Android “SDK Tools Only” tarball, and the NDK tarball. At the command line, change to the directory where you downloaded the tarballs to and untar both tarballs:
$ tar xvf android-ndk-r9d-linux-x86_64.tar.bz2
$ tar xvf android-sdk_r22.6.2-linux.tgz
To save typing later, add “android-sdk-*/tools” and “android-sdk-*/platform-tools” to $PATH (you’ll need to provide the absolute paths to the directories). For example if I had extracted android-sdk-tools to my user directory, on Linux I could add it to PATH with the following command:
$ export PATH=$PATH:$HOME/android-sdk-linux/tools:$HOME/android-sdk-linux/platform-tools
With your PATH updated, launch the Android SDK Manager:
$ android
This will open a GUI menu from where you can download and install the required Android tools and libraries. Using the menu, install Android SDK Tools, Android SDK Platform-tools, Android SDK Build-tools and Android 4.2.2.
You’ll also need a copy of the Perl 5.20.0 tarball. Untar this at the command line too:
$ tar xvf perl-5.20.0.tar.gz
Setup the Android emulator
Now we’re going to create an Android Virtual Device that can be used by the emulator to run Android on your machine. At the command line type:
$ android avd
This will launch the Android Virtual Device Manager:
Click “new” to create a new AVD. I created one with the following settings:
Make sure you select “ARM (androideabi-v7a)” as the CPU/ABI option. Keep in mind your platform’s hardware when choosing these settings. I found higher resolution devices ran very slowly on my old MacBook. The “use snapshot” option is a timesaver that saves the virtual device’s state post-boot, so saves you from waiting for the virtual device to boot up again after the first time. Once you’ve created the AVD, you should see it listed in the AVD Manager window:
Having created a new AVD, you can close the AVD Manager window.
Installation
The following commands will create environment variables we’ll need for the install. Be sure to adjust the path for ANDROID_NDK to the location where you untarred the Android NDK archive earlier.
$ export ANDROID_NDK=$HOME/android-ndk-r9d
$ export TARGET_ARCH=arm-linux-androideabi
$ export ANDROID_TOOLCHAIN=/tmp/my-toolchain-arm-linux-androideabi
$ export SYSROOT=$ANDROID_TOOLCHAIN/sysroot
$ export TARGETDIR=/mnt/asec/perl
$ export PATH=$PATH:$ANDROID_NDK/toolchains/$TARGET_ARCH-4.8/prebuilt/linux-x86_64/bin
To create the toolchain, run this command:
$ $ANDROID_NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=$ANDROID_TOOLCHAIN --system=`uname | tr '[A-Z]' '[a-z]'`-x86_64 --toolchain=arm-linux-androideabi-4.8
Launch your AVD with the emulator (replace kitkat with the name of the avd you created. If you can’t remember the name, just run “android avd” again:
$ emulator @kitkat&
You should see your emulated device start booting in a new window:
Once it’s booted, it will look like this:
With the fully booted AVD still running, return to the command line and type:
$ adb devices
This will print out the names of all the connected Android devices.For example:
List of devices attached
emulator-5554 device
Now we’ve got the device name, we’ll use adb to run shell commands on our emulated device. It’s important that the AVD is booted and running:
adb -s emulator-5554 shell "echo sh -c '\"mkdir $TARGETDIR\"' | su --"
Now change into the untarred perl-5.20.0 directory, and run configure (replace “emulator-5554” with your device name):
$ ./Configure -des -Dusedevel -Dusecrosscompile -Dtargetrun=adb -Dcc=arm-linux-androideabi-gcc -Dsysroot=$SYSROOT -Dtargetdir=$TARGETDIR -Dtargethost=emulator-5554
You can now run make and make test to build and test Perl on the device:
$ make
$ make test
Bear in mind that the make test can take a long time - on my machine it ran for 4 hours. It will appear like the process has hung, this is because adb only prints out the results once the command has completed. Make isntall does not work, but this does not matter, as you can still run the Perl binary and use core modules. For example:
$ adb -s emulator-5554 shell "/mnt/asec/perl/perl -v"
This is perl 5, version 20, subversion 0 (v5.20.0) built for linux-androideabi
Copyright 1987-2014, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
Core modules are located in /mnt/asec/perl/lib. To load them, just use the -I switch. For example this one liner:
adb -s emulator-5554 shell '/mnt/asec/perl/perl -I/mnt/asec/perl/lib -MHTTP::Tiny -E "say HTTP::Tiny->new->get(q{http://perltricks.com})->{content}"'
Or if running a script:
adb -s emulator-5554 shell '/mnt/asec/perl/perl -I/mnt/asec/perl/lib my_script.pl'
Be warned - if you stop the AVD, Perl will be removed. You can Google for solutions on how to persist changes across AVD reboots - I have not done this yet. Let me know if you find a reliable solution!
Conclusion
This is not the only way to get Perl running on Android. For a different approach, checkout the Scripting Layer 4 Android project, however it is under-documented and the project may have stagnated.
This article would not have been possible without the excellent Android perldoc page by Brian Fraser. You can read it on Github or with Perl 5.20.0 installed you can read it with perldoc:
$ perldoc android
Thanks Brian!
Enjoyed this article? Help us out and tweet about it!
This article was originally posted on PerlTricks.com.
Tags
David Farrell
David is the editor of Perl.com. An organizer of the New York Perl Meetup, he works for ZipRecruiter as a software developer, and sometimes tweets about Perl and Open Source.
Browse their articles
Feedback
Something wrong with this article? Help us out by opening an issue or pull request on GitHub