如何在Termux或传统Linux上构建集成appcompat库的aapt/dx/ecj包?
我来帮你搞定这个在Termux里用buildAPKs构建APK时遇到的AppCompat错误和体积暴增问题,分Termux/PRoot环境和传统Linux主机两种场景给你详细操作步骤:
一、在Termux(含PRoot)中构建含AppCompat库的aapt、dx、ecj包
首先确保你的Termux环境是最新状态,先更新依赖:
pkg update && pkg upgrade -y
然后安装编译所需的基础工具:
pkg install git openjdk-17 build-essential make clang python3
1. 准备buildAPKs项目与AppCompat库
先克隆项目并进入目录:
git clone https://github.com/BuildAPKs/buildAPKs.git cd buildAPKs
接下来获取AppCompat库的核心代码:我们需要下载它的aar包,解压后提取classes.jar(这是包含AppCompat核心类的文件):
# 下载指定版本的AppCompat aar包(可根据项目需求替换版本号) curl -L -o appcompat.aar https://repo1.maven.org/maven2/androidx/appcompat/appcompat/1.6.1/appcompat-1.6.1.aar # 解压aar包到临时目录 unzip appcompat.aar -d appcompat # 将核心类库复制到项目libs目录(没有则创建) mkdir -p libs && cp appcompat/classes.jar libs/
2. 修改工具编译配置,整合AppCompat库
aapt、dx、ecj这三个工具的编译配置需要调整,把AppCompat的classes.jar加入到它们的编译依赖中:
- 找到
tools/aapt/Makefile,定位到CLASSPATH或LOCAL_CLASSPATH相关变量,追加:../libs/classes.jar,修改后示例:CLASSPATH := ../libs/classes.jar:$(CLASSPATH) - 对
tools/dx/Makefile和tools/ecj/Makefile执行同样的操作,确保三个工具编译时都能调用到AppCompat的类。
3. 重新编译工具
进入每个工具的目录,清理旧编译文件并重新构建:
# 编译aapt cd tools/aapt && make clean && make # 编译dx cd ../dx && make clean && make # 编译ecj cd ../ecj && make clean && make
也可以用项目自带的批量编译脚本(如果存在):
./scripts/build-tools.sh aapt dx ecj
4. 测试构建验证效果
回到目标APK项目(比如com.google.android.divideandconquer),用我们编译好的工具构建,同时禁用自动库加载:
cd ../../com.google.android.divideandconquer # 将编译好的工具加入环境变量 export PATH=$PATH:../tools/aapt:../tools/dx:../tools/ecj # 不带完整库构建 ./build.sh --no-libs
此时应该能解决Theme.AppCompat.Light.DarkActionBar的找不到资源错误,同时APK体积会远小于启用完整库时的大小。
二、传统Linux主机上的构建步骤
如果Termux/PRoot因为资源限制(比如内存不足)无法完成编译,在传统Linux主机上可以按以下步骤操作:
1. 准备基础环境
以Debian/Ubuntu为例,安装依赖:
sudo apt update && sudo apt install openjdk-17 build-essential git unzip
其他发行版请对应调整包管理命令(比如Fedora用dnf,Arch用pacman)。
2. 克隆项目与获取AppCompat库
和Termux步骤一致:
git clone https://github.com/BuildAPKs/buildAPKs.git cd buildAPKs curl -L -o appcompat.aar https://repo1.maven.org/maven2/androidx/appcompat/appcompat/1.6.1/appcompat-1.6.1.aar unzip appcompat.aar -d appcompat mkdir -p libs && cp appcompat/classes.jar libs/
3. 调整工具编译配置
同样修改tools/aapt/Makefile、tools/dx/Makefile、tools/ecj/Makefile,将AppCompat的classes.jar加入编译依赖的CLASSPATH中。
4. 编译工具与测试构建
# 编译三个工具 cd tools/aapt && make clean && make cd ../dx && make clean && make cd ../ecj && make clean && make # 测试构建目标APK cd ../../com.google.android.divideandconquer export PATH=$PATH:../tools/aapt:../tools/dx:../tools/ecj ./build.sh --no-libs
一些注意事项
- 确保AppCompat库的版本和你项目中
AndroidManifest.xml或styles.xml引用的版本一致,避免版本冲突导致的新错误。 - 如果Termux编译时遇到内存不足,可以用
termux-setup-storage挂载外部存储扩大空间,或者在PRoot中分配更多内存;Linux主机则可以临时增加swap分区缓解内存压力。 - 优先使用buildAPKs项目自带的依赖管理脚本(如果存在),比如
scripts/get-deps.sh,手动下载库时注意版本匹配。
内容的提问来源于stack exchange,提问作者S D Rausty




