Android 平台的Python——基础篇(一)
Android 平台的Python——JNI方案(二)
Android 平台的Python——CLE方案实现(三)
Android 平台的Python——第三方库移植
Android 平台的Python——编译Python解释器
要想将Python解释器移植到Android平台,首先要做的就是将Python源码用NDK工具交叉编译为Android平台的二进制库。目前官方是没有提供对Android平台的支持的,但新的版本已经在考虑对Android提供支持,参考文档 API 24 is the first version where the adb shell is run on the emulator as a shell user instead of the root user previously, and the first version that supports arm64.
Android不是常见的Linux系统,只有Linux内核是共享的,其他一切都是不同的,它使用的C标准库是Bionic,与glibc有很大差异,因此直接使用NDK编译源码会报错。
上一篇博客已经谈到了关于Python第三方库移植的问题,但是 CrytaxNDK中的Python解释器存在一些问题,未支持SSL,导致无法访问HTTPS,这次我们先使用CrytaxNDK重新编译Python
在Linux平台交叉编译Python
首先需要搭建一个Linux环境,推荐使用Ubuntu,这里关于虚拟机安装Ubuntu就不说了
步骤一
设置环境。下载CrytaxNDK的Linux版本,并解压到某个目录。需要说明一下,这里可以不用将CrytaxNDK加入到环境变量,也可以加入,方便以后开发使用
输入命令,配置环境变量
sudo vim /etc/profile
将以下内容添加到文件末尾,其中NDK_DIR指向解压后的CrytaxNDK根目录,请替换成自己的实际目录
export NDK_DIR=/home/CrystaX/crystax-ndk-10.3.2
export PATH=$PATH:$NDK_DIR
export NDK_MODULE_PATH=$NDK_DIR/sources
完成后,输入命令source /etc/profile
更新环境变量,使之生效。
步骤二
下载源码。到官网下载Python3.5的源码,建议下载一个稳定版。将下载之后的源码解压到系统的某个目录,并设置一个全局环境变量,指向Python源码根目录。
export PYTHON_DIR=/home/Python-3.5.1
步骤三
下载OpenSSL源码。由于CrytaxNDK没有带openssl,所以我们必须手动添加。这里我们可以取个巧,直接下载别人编译好的so,懒得去搞环境自己编译。下载地址 这个里面倒是提供了二进制so,但是没提供头文件,所以还是得下载OpenSSL源码
按照下图路径,放入CrytaxNDK根目录下面的sources/openssl/1.0.1p/路径下,头文件放入include中,so放入libs中的对应的CPU架构目录下
步骤四
执行编译。进入到CrytaxNDK根目录下面的build/tools/目录下,执行命令
./build-target-python.sh --ndk_dir=$NDK_DIR --abis=armeabi -j5 --verbose $PYTHON_DIR
实际上CrytaxNDK已经提供了一个简单的编译脚本,可以输入./build-target-python.sh --help
查看一下选项
Valid options (defaults are in brackets):
--help Print this help.
--verbose Enable verbose mode.
--dryrun Set to dryrun mode.
--package-dir=<path> Put prebuilt tarballs into <path>
--ndk-dir=<path> Specify NDK root pa