mercurial 怎么可能 运行 on android?

How can mercurial be run on android?

这个 page 文档 运行 旧版本 (1.8.4) 的 mercurial 但说

"(later versions need an unavaliable python module named grp)"

这是我使用 Ubuntu 16.04 机器和英特尔 64 位 android 模拟器 运行ning 在 Windows 7、使用mercurial 3.7.3

  1. 使用 Ubuntu 系统,按照这些 instructions 创建能够 运行ning hg 的 python 2.7 版本。

  2. 将python复制到android设备上的应用程序文件目录中(以便可以执行)

    在 windows 主机上

    adb push python279.x86_64 /sdcard

    adb -e shell

    在 android 设备上

    cd /data/user/0/$SOMEAPPDIR/files

    cp -Rav /scard/python279.x86_64 .

    使 python 可执行

    chmod +x python279.x86_64/bin/python2.7

    设置一些环境变量需要在 android

    上制作 python 运行

    出口LD_LIBRARY_PATH=/data/user/0/$SOMEAPPDIR/files/python279.x86_64/lib

    导出LD_PRELOAD=libffi.so:libbz2.so

    导出路径=$路径:/data/user/0/$SOMEAPPDIR/files/python279.x86_64/bin

Python 现在应该可以 运行 和 python2.7

  1. 在 Ubuntu 主机上构建 mercurial。

    download 水银 3.7.3

    uz mercurial-3.7.3.tar.gz

    cd mercurial-3.7.3 && make all

    主页=$PWD/dist 安装

  2. 稍作修改

    cd dist/mercurial-3.7.3/dist/lib/python/mercurial

    rm *.so

    cp 纯/*.py .

    编辑 posix.py 并删除“import grp”行。

  3. 将 mercurial 复制到 android 设备上

    在 windows 主机上

    adb push dist /sdcard

    adb -e shell

    在 android 设备上

    cd /data/user/0/$SOMEAPPDIR/files

    cp /sdcard/dist .

    别名 hg 以便于使用

    别名 hg='python2.7 /data/user/0/$SOMEAPPDIR/files/dist/bin/hg'

Hg 现在应该可以在 android 设备上使用了。

甚至可以克隆远程存储库,但我还必须传递 --insecure 标志以绕过 ssl 错误。

“2017 年 2 月 15 日”制作的 工作正常,但有一个相当大的缺点。 这个答案解决了这个缺点,旨在与之前的答案结合使用。

问题

这个程序:

rm *.so

cp pure/*.py .

删除本机库并使用这些库的 python 'pure' 实现。这在处理大型存储库时会导致严重的性能问题,尤其是在速度较慢的 android 设备上。

解决方案

使用 android ndk 交叉编译 mercurial,生成可在 android.

上使用的本机库

我在 mercurial 4.8.2 fork 中添加了一些辅助脚本,使交叉编译更容易。

Linux说明:

  1. 克隆存储库

    hg clone https://bitbucket.org/hindlemail/hg-stable-android/

  2. 更新至 331892efe015

    hg update -r 331892efe015

  3. 为具有适当值的环境变量设置这些:

    提供 android NDK

    的位置

    ANDROID_NDK="$HOME/Android/android-ndk-r13b"

    指定构建架构 - (armeabi, x86, x86_64, arm64)

    ARCH="armeabi"

    指定目标android sdk版本

    PLATFORM="android-22"

    指定交叉编译的输出python。

    (有关更多信息,请参阅 2017 年 2 月 15 日的回答)

    PYTHONDIR="/usr/local/android/install/python279.arm22"

  4. 运行 crosscompile.sh