交叉编译Nginx到Android Arm
Nginx Cross Compile For Android Arm
主机环境
- OS: Windows 11
- 使用Docker Ubuntu容器完成交叉编译过程
准备工作
- 源代码下载
- Nginx: https://nginx.org/download/nginx-1.26.2.tar.gz
- Android NDK: NDK 下载 Android NDK Android Developers
- Openssl:openssl/openssl: TLS/SSL and crypto library (github.com)
- PCRE-8.45: https://sourceforge.net/projects/pcre/ 正则表达式库
- Zlib: https://github.com/madler/zlib/ 数据压缩库
- 源代码压缩包都下载好后放在一个合适的目录下,这里演示将上述压缩包统一先放在了
B:\temp source
,即我在我电脑的可用磁盘B盘的根目录下创建了一个temp source
文件夹,然后将下载好的压缩包全部拷贝到了这个文件夹 Docker 容器准备
Docker Desktop下载: Docker: Accelerated Container Application Development
将一下的Dockerfile内容拷贝到本地,命名文件为
Dockerfile
Dockerfile
:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# 使用官方ubuntu作为父镜像 FROM ubuntu:latest # 设置镜像维护者信息 LABEL maintainer="Zpekii" description="预安装各种工具,用于做集成工作的ubuntu镜像" # 预安装工具 RUN apt update && apt install -y \ vim \ nano \ curl \ wget \ git \ rsync \ unzip \ build-essential \ && rm -rf /var/lib/apt/lists/* # 指定挂载卷 VOLUME ["/data"] # 默认执行命令 CMD ["/bin/bash"]
执行
docker pull ubuntu:latest
拉取最新ubuntu镜像1
docker pull ubuntu:latest
在
Dockerfile
所在目录下执行docker build -t ubuntu:ci .
进行创建自定义镜像1
docker build -t ubuntu:ci .
在源代码压缩包存放的文件夹下运行CMD命令行窗口
执行
cd /mnt
进入挂载的本地电脑目录中,1
cd /mnt
执行
mkdir -p /var/data/src
创建存放解压后的源代码解压源代码
执行
tar -xzvf ./nginx-1.26.2.tar.gz -C /var/data/src
解压Nginx
源代码至指定目录(/var/data/src
)1
tar -xzvf ./nginx-1.26.2.tar.gz -C /var/data/src
执行
tar -xzvf ./openssl-openssl-3.3.2.tar.gz -C /var/data/src
解压openssl
1
tar -xzvf ./openssl-openssl-3.3.2.tar.gz -C /var/data/src
执行
tar -xzvf ./zlib-1.3.1.tar.gz -C /var/data/src
解压zlib
1
tar -xzvf ./zlib-1.3.1.tar.gz -C /var/data/src
执行
unzip ./android-ndk-r27-linux.zip -d /var/data/src
解压android ndk1
unzip ./android-ndk-r27-linux.zip -d /var/data/src
执行
unzip ./pcre-8.45.zip -d /var/data/src
解压 pcre1
unzip ./pcre-8.45.zip -d /var/data/src
交叉编译Nginx源代码
设置环境变量
执行到这一步仍保持在
/mnt
目录下执行
cd /var/data/src
进入接下来的工作目录1
cd /var/data/src
执行
ls
查看当前各源代码文件夹执行
export NDK=/var/data/src/android-ndk-r27
设置NDK环境变量(注: 需要根据实际解压后的源代码文件夹名进行设置!)1
export NDK=/var/data/src/android-ndk-r27
执行
export TOOLCHAINS=/var/data/src/android-ndk-r27/toolchains/llvm/prebuilt/linux-x86_64/bin
设置NDK工具链环境变量,便于后面的环境变量设置1
export TOOLCHAINS=/var/data/src/android-ndk-r27/toolchains/llvm/prebuilt/linux-x86_64/bin
执行
export CC=$TOOLCHAINS/armv7a-linux-androideabi34-clang
设置C语言编译器(C Compiler)环境变量Arm 32:
1
export CC=$TOOLCHAINS/armv7a-linux-androideabi34-clang
Arm 64:
1
export CC=$TOOLCHAINS/aarch64-linux-android34-clang
执行
export CPP=$TOOLCHAINS/armv7a-linux-androideabi34-clang++
设置C++编译器环境变量Arm 32:
1
export CPP=$TOOLCHAINS/armv7a-linux-androideabi34-clang++
Arm 64:
1
export CPP=$TOOLCHAINS/aarch64-linux-android34-clang++
执行
export ZLIB=/var/data/src/zlib-1.3.1
设置压缩库环境变量1
export ZLIB=/var/data/src/zlib-1.3.1
执行
export NGINX_PATH=/data/data/com.example.www/nginx/nginx
设置nginx
保存路径(这里是设置成在安卓中可访问和执行命令的目录),其中com.example.www
为包名需要自行设定和安卓应用包名一致1
export NGINX_PATH=/data/data/com.example.www/nginx/nginx
一条指令设置所有环境变量
Arm 32位:
1 2 3 4 5 6
export NDK=/var/data/src/android-ndk-r27 \ export TOOLCHAINS=/var/data/src/android-ndk-r27/toolchains/llvm/prebuilt/linux-x86_64/bin \ export CC=/var/data/src/android-ndk-r27/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi34-clang \ export CPP=/var/data/src/android-ndk-r27/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi34-clang++ \ export ZLIB=/var/data/src/zlib-1.3.1 \ export NGINX_PATH=/data/data/com.example.www/nginx/nginx
Arm 64位
1 2 3 4 5 6
export NDK=/var/data/src/android-ndk-r27 \ export TOOLCHAINS=/var/data/src/android-ndk-r27/toolchains/llvm/prebuilt/linux-x86_64/bin \ export CC=/var/data/src/android-ndk-r27/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang \ export CPP=/var/data/src/android-ndk-r27/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang++ \ export ZLIB=/var/data/src/zlib-1.3.1 \ export NGINX_PATH=/data/data/com.example.www/nginx/nginx
设置Nginx交叉编译配置
执行
cd nginx-1.26.2
进入Nginx源代码目录(注: 需要根据实际解压后的源代码文件夹名进行设置!)1
cd nginx-1.26.2
修改部分文件内容,以确保之后可以正常进行配置
执行
nano ./auto/cc/name
使用nano
文本编辑工具修改./auto/cc/name
文件执行
nano ./auto/types/sizeof
修改./auto/types/sizeof
文件设置
ngx_size
值为4如果是arm64则修改为8
注释掉原来的ngx_size=
$NGX_AUTOTEST
,然后写上ngx_size=4
如果是arm64则修改为8
修改
ngx_test
执行
nano ./auto/options
修改
然后执行以下指令
1
./configure --crossbuild=android-arm --prefix=$NGINX_PATH --with-http_ssl_module --with-cc=$CC --with-cpp=$CPP --with-pcre=/var/data/src/pcre-8.45 --with-openssl=/var/data/src/openssl-openssl-3.3.2 --with-zlib=$ZLIB --without-http_gzip_module --without-http_upstream_zone_module --without-stream_upstream_zone_module --with-ld-opt="-pie -fPIE" --with-cc-opt="-Wno-sign-compare -pie -fPIE -fPIC" --without-http_userid_module
执行成功截图
修改部分Nginx配置文件使编译成功
执行
nano ./objs/Makefile
修改Makefile1
nano ./objs/Makefile
- 移除
Werror
Crtl+W搜索
./config --prefix=/var/data/src/openssl-openssl-3.3.2/.openssl no-shared no-threads
Ctrl+X加输入y加回车退出编辑,返回命令行
执行
nano ./objs/ngx_auto_config.h
在最后添加以下代码1
nano ./objs/ngx_auto_config.h
- 移除
执行
nano ./src/os/unix/ngx_user.c
修改Nginx源代码文件src/os/unix/ngx_user.c
- 执行
nano ./src/os/unix/ngx_linux_config.h
给crypt.h
引入注释
执行make
进行编译nginx
1
make
- 执行成功截图
执行make install
进行安装
1
make install