1. 参考
https://zhuanlan.zhihu.com/p/210272418
2. 步骤
- 安装docker环境
- 下载cmake
从 https://cmake.org/files/v3.12/cmake-3.12.2-Linux-x86_64.tar.gz 下载cmake-3.12.2-Linux-x86_64.tar.gz - 下载Android NDK
从 https://developer.android.google.cn/ndk/downloads/ 下载,这里下载了 android-ndk-r23-linux.zip - 编写dockerfile脚本
Dockerfile
FROM ubuntu
MAINTAINER someone
ARG DEBIAN_FRONTEND=noninteractive
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get update \
&& apt-get -qq install build-essential \
&& apt-get -qq install git \
&& mkdir -p /home/android-toolchain
COPY android-ndk-r23-linux.zip /home/android-toolchain
RUN cd /home/android-toolchain \
&& apt-get -qq install unzip \
&& unzip android-ndk-r23-linux.zip \
&& rm -rf android-ndk-r23-linux.zip
ENV NDK_STANDALONE_TOOLCHAIN="/home/android-toolchain/android-ndk-r23"
COPY cmake-3.12.2-Linux-x86_64.tar.gz /home/android-toolchain
RUN cd /home/android-toolchain \
&& tar -zxvf cmake-3.12.2-Linux-x86_64.tar.gz \
&& rm -rf cmake-3.12.2-Linux-x86_64.tar.gz \
&& mv cmake-3.12.2-Linux-x86_64 cmake-3.12.2 \
&& ln -sf /home/android-toolchain/cmake-3.12.2/bin/* /usr/bin
NDK 和 cmake 也可以在Dockerfile里用wget命令下载,这样还可以减少镜像的大小
- 构建image
docker build -t ubuntu_android_test:v1.0 .
3. 测试
用一个 hello world 程序测试交叉编译和运行的效果
建立三个源码文件,目录结构如下:
-test
-CMakeLists.txt
-generate.sh
-main.cpp
3.1 CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(hello_cmake)
add_definitions("-Wall -g")
add_executable(${PROJECT_NAME} main.cpp )
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${PROJECT_SOURCE_DIR})
3.2 generate.sh
#/bin/bash
rm -r build
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_STANDALONE_TOOLCHAIN/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_NDK=$NDK_STANDALONE_TOOLCHAIN \
-DANDROID_PLATFORM=android-26 \
..
make && make install
cd ..
3.3 main.cpp
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
运行容器,并把源码文件夹映射到容器里
docker run -it -v /home/temp/test:/home/test --name ubuntu_android_test ubuntu_android_test:v1.0 /bin/bash
/home/temp/test
为上述三个源码文件的文件夹,可根据自己情况更改,进入容器后编译执行:
cd /home/test
chmod +x ./generate.sh
./generate.sh
如此便完成了hello_cmake的交叉编译,可执行程序 hello_cmake
便在目录/home/temp/test
里
3.4 放到手机上执行
安装adb工具
ubuntu下 : sudo apt install android-tools-adb android-tools-fastboot
push到手机
adb push hello_cmake /data/local/tmp
给hello执行权限
adb shell
cd /data/local/tmp
chmod +x hello_cmake
执行hello
./hello_cmake
就可以看到hello world
输出
4. 放在gitlab上用CI自动编译输出
4.1 把镜像push到私人仓库
假设在 10.168.1.108 主机上开启私人仓库
docker run -d -p 5000:5000 --restart=always --name registry registry
docker push
docker image tag ubuntu_android_test:v1.0 10.168.1.108:5000/ubuntu_android_test:v1.0
docker push 10.168.1.108:5000/ubuntu_android_test:v1.0
4.2 在gitlab上新建工程test
上传那三个源码文件到test工程。
也可以直接在网页上新建那三个文件,把内容复制进去
4.3 编写 .gitlab-ci.yml
image: 10.168.1.108:5000/ubuntu_android_test:v1.0
build:
stage: build
script:
- cd /home
- mkdir test
- cp -r ${CI_PROJECT_DIR} test
- cd test
- cd test
- ls -l
- chmod +x ./generate.sh
- ./generate.sh
- cp -r hello_cmake ${CI_PROJECT_DIR}
artifacts:
name: "$CI_COMMIT_REF_NAME"
expire_in: 1 week
paths:
- hello_cmake
CI编译完成后从编译结果中取出 hello_cmake,同样放在手机执行一遍即可