常規方案

armel

1
# apt install gcc-arm-linux-gnueabi libc6-dev-armel-cross

armhf

1
# apt install gcc-arm-linux-gnueabihf libc6-dev-armhf-cross

獲取 BusyBox

1
$ git clone git://busybox.net/busybox.git

配置

1
2
$ cd busybox
$ make defconfig
1
2
3
4
5
6
7
$ vi .config

CONFIG_STATIC=y
# armel
CONFIG_CROSS_COMPILER_PREFIX="arm-linux-gnueabi-"
# armhf
CONFIG_CROSS_COMPILER_PREFIX="arm-linux-gnueabihf-"

編譯

1
$ make -j4

下載 Android 源碼

Android 不使用 GNU libc,使用 bionic libc。

安裝 Repo

1
# apt install repo

添加

1
export REPO_URL="https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/"

傳統初始化

1
2
$ mkdir android && cd android
$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-5.1.1_r38

同步源碼樹

1
$ repo sync

Android-NDK 編譯

1
2
# apt install google-android-ndk-installer
$ export PATH="/usr/lib/android-ndk:/usr/lib/android-ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH"

獲取 BusyBox

1
$ git clone git://busybox.net/busybox.git

配置

1
2
$ cd busybox
$ make android_ndk_defconfig
1
2
3
4
5
6
7
$ vi .config

CONFIG_STATIC=y
CONFIG_SYSROOT="/usr/lib/android-ndk/platforms/android-22/arch-arm"
CONFIG_EXTRA_CFLAGS="-DANDROID -D__ANDROID__ -DSK_RELEASE -nostdlib -msoft-float -mfloat-abi=softfp -mfpu=neon -mthumb -mthumb-interwork -fpic -fno-short-enums -fgcse-after-reload -frename-registers -fuse-ld=bfd"
CONFIG_EXTRA_LDFLAGS="-Xlinker -z -Xlinker muldefs -nostdlib -Xlinker -z -Xlinker nocopyreloc -Xlinker --no-undefined ${SYSROOT}/usr/lib/crtbegin_dynamic.o ${SYSROOT}/usr/lib/crtend_android.o"
CONFIG_EXTRA_LDLIBS="m c gcc"

編譯

1
$ make -j4

這將遇到各種錯誤,根據錯誤使用

1
$ make menuconfig

來取消錯誤模塊,並重復編譯,直到所有錯誤模塊全部禁用,編譯成功

說明

1
CONFIG_STATIC=y

爲靜態編譯。

1
CONFIG_SYSROOT="/usr/lib/android-ndk/platforms/android-22/arch-arm"

這裏的 android-22 爲 API 級別,可隨意更換。

具體請使用:

1
$ ls /usr/lib/android-ndk/platforms

查看,並前往 什幺是 API 級別?平臺版本