Sử dụng NDK với các hệ thống xây dựng khác

NDK chứa các tính năng hỗ trợ chính thức dành cho ndk-buildCMake. Hầu hết người dùng sẽ tham khảo một trong những hướng dẫn tạo mã ứng dụng đó. Mục đích của tài liệu này là mô tả cách tạo mã hiện có bằng các hệ thống xây dựng khác. Trường hợp này thường xảy ra với các phần phụ thuộc bên thứ ba không dành riêng cho Android, chẳng hạn như OpenSSL và libbzip2.

Nếu là một đơn vị phụ trách duy trì hệ thống xây dựng đang muốn tìm cách thêm tính năng hỗ trợ NDK gốc vào hệ thống xây dựng của mình thì bạn nên đọc nội dung Hướng dẫn duy trì hệ thống xây dựng.

Tổng quan

Bạn có thể dùng trình biên dịch Clang trong NDK chỉ với cấu hình tối thiểu cần thiết để xác định môi trường đích của mình.

Để đảm bảo rằng bạn xây dựng cho đúng kiến trúc, hãy truyền bằng -target khi gọi Clang. Ví dụ: để biên dịch cho phiên bản 64 bit Trên ARM Android với minSdkVersion là 21, hãy làm như sau:

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
    --target aarch64-linux-android21 foo.cpp

Ngoài ra, bạn cũng có thể dùng các điểm truy cập có tiền tố mục tiêu cho Clang. Đây có thể là đường liên kết tượng trưng hoặc tập lệnh chuyển tiếp đến clang, tuỳ thuộc vào bản phát hành NDK và hệ điều hành lưu trữ. Việc gọi Clang trực tiếp bằng --target sẽ đáng tin cậy hơn, vì đó là quy trình được thử nghiệm nhiều nhất, đồng thời đôi khi có chuyển tiếp đối số các lỗi trong tập lệnh. Trên Windows, bạn cần có thêm CreateProcess để chuyển tiếp từ tập lệnh đến trình biên dịch thực tế có thể đáng kể ảnh hưởng tiêu cực đến tốc độ bản dựng.

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
    foo.cpp

Trong cả hai trường hợp, hãy thay thế $NDK bằng đường dẫn đến NDK và $HOST_TAG để khớp với phiên bản NDK mà bạn đã tải xuống theo bảng sau:

Biến thể NDK dành cho hệ điều hành Thẻ lưu trữ
macOS darwin-x86_64
Linux linux-x86_64
Windows 64 bit windows-x86_64

Định dạng của tiền tố hoặc đối số mục tiêu ở đây là bộ ba mục tiêu với một hậu tố biểu thị minSdkVersion. Hậu tố này chỉ được dùng với clang/clang++. Các công cụ binutils (chẳng hạn như arstrip) không đòi hỏi hậu tố vì không chịu ảnh hưởng của minSdkVersion. Sau đây là bộ ba mục tiêu được Android hỗ trợ:

ABI Bộ ba
armeabi-v7a armv7a-linux-androideabi
arm64-v8a aarch64-linux-android
x86 i686-linux-android
x86-64 x86_64-linux-android

Thông thường, tập lệnh bản dựng của nhiều dự án sẽ có các trình biên dịch chéo theo kiểu GCC, trong đó mỗi trình biên dịch chỉ nhắm đến một tổ hợp hệ điều hành/kiến trúc nên có thể sẽ không xử lý -target thật gọn ghẽ. Trong những trường hợp này, bạn thường có thể thêm -target đối số như một phần của định nghĩa trình biên dịch (ví dụ: CC="clang -target aarch64-linux-android21). Trong một số ít trường hợp, hệ thống xây dựng bạn đang sử dụng không thể sử dụng biểu mẫu đó, hãy sử dụng các tệp nhị phân Clang có 3 tiền tố.

Autoconf

Với những dự án Autoconf, bạn có thể chỉ định chuỗi công cụ để sử dụng với các biến môi trường. Ví dụ: nội dung sau đây cho biết cách xây dựng libpng dành cho Android x86-64 với minSdkVersion là API cấp 21 trên Linux.

# Check out the source.
git clone https://github.com/glennrp/libpng -b v1.6.37
cd libpng
# Only choose one of these, depending on your build machine...
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Only choose one of these, depending on your device...
export TARGET=aarch64-linux-android
export TARGET=armv7a-linux-androideabi
export TARGET=i686-linux-android
export TARGET=x86_64-linux-android
# Set this to your minSdkVersion.
export API=21
# Configure and build.
export AR=$TOOLCHAIN/bin/llvm-ar
export CC="$TOOLCHAIN/bin/clang --target=$TARGET$API"
export AS=$CC
export CXX="$TOOLCHAIN/bin/clang++ --target=$TARGET$API"
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
./configure --host $TARGET
make

Các công cụ được chọn trong mẫu này là chính xác cho NDK r22 trở lên. Các phiên bản NDK cũ có thể cần đến các công cụ khác.

Dự án make không phải autoconf

Một số dự án makefile cho phép biên dịch chéo bằng cách ghi đè các biến giống nhau, tương tự như cách mà bạn sẽ thực hiện với dự án autoconf. Ví dụ: sau đây là cách tạo libbzip2 dành cho Android x86-64 với minSdkVersion là 21.

# Check out the source.
git clone https://gitlab.com/bzip/bzip2.git
cd bzip2

# Only choose one of these, depending on your build machine...
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

# Only choose one of these, depending on your device...
export TARGET=aarch64-linux-android
export TARGET=armv7a-linux-androideabi
export TARGET=i686-linux-android
export TARGET=x86_64-linux-android

# Set this to your minSdkVersion.
export API=21

# Build.
make \
    CC="$TOOLCHAIN/bin/clang --target=$TARGET$API" \
    AR=$TOOLCHAIN/bin/llvm-ar \
    RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
    bzip2

Các công cụ được chọn trong mẫu này là chính xác cho NDK r22 trở lên. Các phiên bản NDK cũ có thể cần đến các công cụ khác.