NDK chứa các tính năng hỗ trợ chính thức dành cho ndk-build và CMake. 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 cấu 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 có thể có khả năng
ả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ư ar
và strip
) 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.