如何在Android 4.4上构建Perl

Perl 5.20的最新发布带来了令人兴奋的消息:Perl现在可以安装在Android上,这是谷歌的移动操作系统。但在你想象着通过UAV::Pilot使用手机控制无人机飞行之前,要知道目前,如何获取一个可工作的Perl二进制文件是唯一有文档记录的。本文将向您展示如何做到这一点——其余的工作留给先驱们去解决!

要求

要在Android上构建Perl,您需要一个类Unix环境(Cygwin也可能可行)。本文描述了在Android虚拟设备(AVD)上安装Perl,因此您不需要Android手机来尝试在Android上使用Perl。

准备

下载Android的“仅SDK工具”tarball和NDK tarball。在命令行中,切换到您下载tarballs的目录,并解压两个tarballs

$ tar xvf android-ndk-r9d-linux-x86_64.tar.bz2
$ tar xvf android-sdk_r22.6.2-linux.tgz

为了节省时间,将“android-sdk-*/tools”和“android-sdk-*/platform-tools”添加到$PATH(您需要提供目录的绝对路径)。例如,如果我将android-sdk-tools提取到我的用户目录中,在Linux上,我可以使用以下命令将其添加到PATH中

$ export PATH=$PATH:$HOME/android-sdk-linux/tools:$HOME/android-sdk-linux/platform-tools

更新PATH后,启动Android SDK Manager

$ android

这将打开一个GUI菜单,您可以从其中下载和安装所需的Android工具和库。使用菜单安装Android SDK Tools、Android SDK Platform-tools、Android SDK Build-tools和Android 4.2.2。

The Android SDK Manager

您还需要Perl 5.20.0的tarball的副本。也在命令行中解压它

$ tar xvf perl-5.20.0.tar.gz

设置Android模拟器

现在我们将创建一个Android虚拟设备,该设备可以由模拟器在您的计算机上运行Android。在命令行中键入

$ android avd

这将启动Android虚拟设备管理器

The Android Virtual Device Manager

点击“新建”以创建一个新的AVD。我创建了一个具有以下设置的AVD

Create a new AVD

请确保您选择“ARM (androideabi-v7a)”作为CPU/ABI选项。在选择这些设置时,请考虑您的平台硬件。我发现高分辨率设备在我的旧MacBook上运行非常慢。“使用快照”选项是一个节省时间的选项,它保存了虚拟设备启动后的状态,因此您可以避免在第一次启动后再次等待虚拟设备启动。一旦创建了AVD,您应该可以在AVD管理器窗口中看到它列出

The AVD has been created

创建了一个新的AVD后,您可以关闭AVD管理器窗口。

安装

以下命令将创建我们需要用于安装的环境变量。请确保将ANDROID_NDK的路径调整为您之前解压Android NDK存档的路径。

$ 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

要创建工具链,运行此命令

 $ $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

使用模拟器启动您的AVD(用您创建的avd名称替换kitkat。如果您记不起名称,只需再次运行“android avd”即可

$ emulator @kitkat&

您应该会看到一个新窗口中模拟设备开始启动

The loaded AVD

一旦启动,它看起来就像这样

The AVD is booting

在完全启动的AVD仍在运行的情况下,返回到命令行,并键入

$ adb devices

这将打印出所有连接的Android设备的名称。例如

List of devices attached 
emulator-5554   device

现在我们已经获得了设备名称,我们将使用adb在我们的模拟设备上运行shell命令。重要的是AVD必须已启动并正在运行

adb -s emulator-5554 shell "echo sh -c '\"mkdir $TARGETDIR\"' | su --"

现在切换到解压的perl-5.20.0目录,并运行configure(用您的设备名称替换“emulator-5554”)

$ ./Configure -des -Dusedevel -Dusecrosscompile -Dtargetrun=adb -Dcc=arm-linux-androideabi-gcc -Dsysroot=$SYSROOT -Dtargetdir=$TARGETDIR -Dtargethost=emulator-5554

现在您可以在设备上运行make和make test来构建和测试Perl

$ make
$ make test

请注意,make测试可能需要很长时间——在我的机器上运行了4个小时。它看起来像是进程已经挂起,这是因为adb只有在命令完成后才会打印出结果。make install不工作,但这没关系,因为您仍然可以运行Perl二进制文件并使用核心模块。例如

$ 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.

核心模块位于/mnt/asec/perl/lib。要加载它们,只需使用-I开关。例如这个单行命令

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}"'

或者如果正在运行脚本

adb -s emulator-5554 shell '/mnt/asec/perl/perl -I/mnt/asec/perl/lib my_script.pl'

警告:如果您停止AVD,Perl将被删除。您可以在Google上搜索有关如何在AVD重新启动之间保持更改的解决方案——我还没有这样做。如果您找到可靠的解决方案,请告诉我!

结论

这不是在Android上运行Perl的唯一方法。对于不同的方法,请查看Scripting Layer 4 Android项目,但是它文档不足,该项目可能已经停滞。

如果没有Brian Fraser出色的Android perldoc页面,这篇文章将不可能完成。您可以在Github上阅读,或者如果您安装了Perl 5.20.0,您可以用perldoc阅读。

$ perldoc android

谢谢Brian!

喜欢这篇文章吗?帮助我们,并tweet关于它!


这篇文章最初发布在PerlTricks.com

标签

David Farrell

David是一位专业程序员,他经常tweet博客关于代码和编程的艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?通过在GitHub上打开一个问题或pull request来帮助我们。