如何为ARM-v7a/ARM64-v8a架构编译Android SDK工具(aapt、adb等)
编译ARM-v7a/ARM64-v8a架构的Android SDK工具(可直接在设备上运行)
一、可行性确认
完全可以实现!你之前完成的是开发机(x86/x86_64)使用的host端SDK工具编译,而要得到能在Android设备上运行的工具,需要调整编译目标,生成对应ARM架构的target端二进制文件。
二、具体编译步骤
1. 代码库初始化(和你之前的操作一致)
mkdir ~/WORKING_DIRECTORY cd ~/WORKING_DIRECTORY repo init -u https://android.googlesource.com/platform/manifest -b master -g all,-notdefault,tools repo sync
2. 选择对应架构的编译目标
你之前尝试的sdk_arm-eng并不是合法目标,需要选择ARM/ARM64对应的设备eng目标:
- 编译ARM-v7a版本:
. build/envsetup.sh lunch aosp_arm-eng - 编译ARM64-v8a版本:
. build/envsetup.sh lunch aosp_arm64-eng
3. 编译指定工具模块
make sdk是生成host端SDK包的命令,我们需要单独编译target端的工具模块:
- 编译aapt/aapt2:
make aapt2 -j$(nproc) # 不同Android版本可能需要用make aapt - 编译adb(设备端的adb客户端)和adbd(设备守护进程):
make adb -j$(nproc) make adbd -j$(nproc) - 编译其他工具(如fastboot、dex2oat等):
make fastboot -j$(nproc) make dex2oat -j$(nproc)
编译完成后,二进制文件会输出到对应架构的目录:
- ARM-v7a:
out/target/product/generic_arm/system/bin/ - ARM64-v8a:
out/target/product/generic_arm64/system/bin/
三、依赖问题解决(针对Debian包的问题)
你提到的Debian ARM/ARM64版本工具,依赖的是GNU C库组件(libgcc_s.so.1、ld-linux-aarch64.so.1等),而Android系统使用的是自研的Bionic C库,所以这些包无法直接在Android设备上运行。
而通过Android源码编译的target端工具,会自动链接Android系统预装的Bionic库(libc.so、libutils.so、liblog.so等),不需要额外依赖就能运行。你可以用NDK的readelf工具验证:
# 以ARM64的aapt2为例 ~/android-sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-readelf -a out/target/product/generic_arm64/system/bin/aapt2 | grep Shared
输出的依赖项全是Android系统自带的库,不会出现GNU相关依赖。
四、部署到Android设备
编译完成后,通过adb将工具推送到设备并赋予执行权限即可运行:
# 推送ARM64版本的aapt2到设备临时目录 adb push out/target/product/generic_arm64/system/bin/aapt2 /data/local/tmp/ # 赋予执行权限 adb shell chmod +x /data/local/tmp/aapt2 # 在设备上运行验证 adb shell /data/local/tmp/aapt2 --version
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

