You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Termux或传统Linux上构建集成appcompat库的aapt/dx/ecj包?

解决buildAPKs中AppCompat依赖与APK体积问题的构建方案

我来帮你搞定这个在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,定位到CLASSPATHLOCAL_CLASSPATH相关变量,追加:../libs/classes.jar,修改后示例:
    CLASSPATH := ../libs/classes.jar:$(CLASSPATH)
    
  • tools/dx/Makefiletools/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/Makefiletools/dx/Makefiletools/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.xmlstyles.xml引用的版本一致,避免版本冲突导致的新错误。
  • 如果Termux编译时遇到内存不足,可以用termux-setup-storage挂载外部存储扩大空间,或者在PRoot中分配更多内存;Linux主机则可以临时增加swap分区缓解内存压力。
  • 优先使用buildAPKs项目自带的依赖管理脚本(如果存在),比如scripts/get-deps.sh,手动下载库时注意版本匹配。

内容的提问来源于stack exchange,提问作者S D Rausty

火山引擎 最新活动