如何为Android构建Apache Portable Runtime(APR)?
我了解Apache Portable Runtime(APR)并未提供Android平台支持,但仍希望在Android上使用该库。此前我曾按照NDK指南构建其他库,但APR的./configure脚本更为复杂,会进行更多检查项。我确定需要对其进行修改,但由于对该库不够熟悉,不知从何入手。
我曾尝试在执行./configure脚本前设置参数,通过手动指定config.log中的以下变量,成功让脚本运行完成80%:
ac_cv_file__dev_zero=yes ac_cv_func_getpgrp_void=no ac_cv_func_setpgrp_void=yes ac_cv_func_memcmp_working=yes rb_cv_binary_elf=no rb_cv_negative_time_t=no ac_rc=no pr_cv_mutex_robust_shared=no apr_cv_tcp_nodelay_with_crok=yes
我有以下疑问:
- 这些变量是否与Android平台的适配相关?
- 手动强制设置这些变量是否会给库的后续使用带来问题?
- 这是否是为Android构建APR的正确方式,或是有其他可行方案?
1. 手动指定configure变量的风险
你设置的这些变量都是configure脚本对目标平台特性的检测结果。强制跳过检测直接赋值确实能推进编译流程,但存在明显风险:
- 如果某个变量对应的特性在Android上实际不支持,强制设为
yes会导致编译出的代码调用不存在的系统函数或依赖未实现的特性,运行时直接崩溃。 - 部分变量存在逻辑依赖,单独修改可能引发冲突。比如
pr_cv_mutex_robust_shared设为no符合Android的实际情况,但如果后续APR代码依赖健壮共享锁的逻辑,就会出现功能异常。
2. 更可靠的构建方案
方案一:使用NDK交叉编译工具链
先配置交叉编译环境变量,指定Android的工具链、目标架构与API级别(以arm64、API 29为例):
export NDK_PATH=/path/to/your/android-ndk export TOOLCHAIN=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64 export TARGET=aarch64-linux-android export API=29 export AR=$TOOLCHAIN/bin/$TARGET-ar export CC=$TOOLCHAIN/bin/$TARGET$API-clang export AS=$CC export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++ export LD=$TOOLCHAIN/bin/$TARGET-ld export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib export STRIP=$TOOLCHAIN/bin/$TARGET-strip export CFLAGS="-fPIC"
然后运行configure时指定交叉编译参数,结合你已验证的变量:
./configure --host=$TARGET --prefix=/path/to/install \ --disable-nls \ --disable-threads \ --disable-shared \ ac_cv_file__dev_zero=yes \ ac_cv_func_getpgrp_void=no \ ac_cv_func_setpgrp_void=yes \ ac_cv_func_memcmp_working=yes \ rb_cv_binary_elf=no \ rb_cv_negative_time_t=no \ ac_rc=no \ pr_cv_mutex_robust_shared=no \ apr_cv_tcp_nodelay_with_crok=yes
--host参数会告知configure这是交叉编译场景,自动跳过部分针对主机平台的检测,减少适配工作量。
方案二:修改configure脚本适配Android
找到configure中针对Linux平台的检测逻辑,添加Android平台的判断分支。比如在检测getpgrp函数的部分,增加条件判断:如果目标平台是Android,则直接设置ac_cv_func_getpgrp_void=no。这种方式需要你熟悉configure的shell逻辑,但能从根源上解决适配问题,避免后续重复手动设置变量。
方案三:使用社区适配补丁
社区已有开发者为Android适配APR提交过补丁,你可以查找APR的第三方fork或开源项目中的适配代码,直接将补丁应用到源码后再编译,这是最省时的方案。
3. 构建后验证
无论采用哪种方案,编译完成后都需要做以下验证:
- 用
readelf -h检查生成的库文件,确认目标架构与Android设备匹配。 - 在Android设备或模拟器上编写测试程序,调用APR的核心API(如内存分配、文件I/O、网络操作),验证功能正常且无运行时崩溃。
内容的提问来源于stack exchange,提问作者Pol Ros

