当前位置: 首页 > 工具软件 > ccache > 使用案例 >

开启ccache加速android代码编译

倪德业
2023-12-01

关于android 编译很慢的问题,大家可以尝试开启 ccache 缓存机制,加速编译,命令如下:

注意:一般ccache开启后,第一次编译是和常规编译没多大区别的,后期的增量编译或者删除out后对同一套代码编译的话,差不多可以提速20%。但如果在不同代码之间来回切换,因为在不停的刷新缓存,所以也没多大提速了。

sudo apt install ccache -y

然后追加如下内容到 ~/.bashrc 文件下

export CCACHE_EXEC=$(command -v ccache)

export PATH="$CCACHE_EXEC:$PATH"
export USE_CCACHE=true
export CCACHE_DIR=~/.ccache          //对于该参数大家可以根据系统的家目录大小设定对应的路径,只要编译时能够对该目录有读写权限即可。默认是 $HOME/.ccache
export CCACHE_UMASK=002
export CCACHE_HARDLINK=false

保存文件,然后设定缓存大小

$ ccache --max-size=50G          // 根据需要设定大小

$ source ~/.bashrc  //让如上参数生效

还有一些其他的参数,例如是否忽略某些文件的变更等感兴趣的可以 man ccache 获取详细帮助, 

如下统计是之前的固态硬盘上[Ubuntu 18.04.5 LTS Linux 5.4.0-70-generic x86-64 Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz 8c16u   32G DDR4] 做的测试,机械硬盘时间上会有一定延长。

鉴于最近很多人都出现了无法编译Android 7/8问题,做一个简单的总结
android7/8 默认启用jack-server, 对代码进行预编译和处理,加快系统编译和构建,弊端是同一台机器不允许多用户同时编译,经常出现端口冲突,内存不足和溢出现象<android 10之后该功能默认被禁用了>。

另外ubuntu系统默认开启了自动升级功能,因此默认会升级相关软件包或依赖包,从而出现无法编译代码问题。主要问题如下:

ubuntu 16.04     Linux 4.15.0-142-generic    gcc 5.4.x
1)java 8u292  <1.8.0_292>  无法编译android7/8,错误显示jack-server服务端口(8086/8087)被占用,修改相关端口,重启服务,此时服务无法开启<即使卸载应用,重新安装>,查看dump显示端口已经被重新获取到,但依旧无法重启服务,原因还是端口被占用。
2)java 8u282 <1.8.0_282> 及早期版本会在同机多人编译Android 版本时,会出现端口冲突,但只要修改不同的端口,即可正常开启jack-server,不影响编译。
ubuntu 18.04   Linux 5.4.0-70-generic     gcc 7.5.x
1)java 8u292   在没有同机多人编译android时,jack-server 服务可正常开启。
2)该版本编译错误主要集中在flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertioncnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed.Aborted (core dumped),
但一般只要执行如下命令即可编译:  export  LC_ALL=C
3)在2)的基础上编译通过后,会出现新的问题:
 3.1)在编译android 7/8代码时,目前出现编译bootloader无法开机现象<Lily和L2系列都出现了类似问题>,更换早期版本发布的emmc_appsboot.mbn文件即可开机<待确认是哪个工具包导致的>
因此有如下几点大家需要注意:
1)在编译android 7/8代码时,尽量确保java版本不要高于 8u282。
2) 如果使用ubuntu 18.04及其更高linux版本编译android 7/8及其更低android版本时,注意gcc版本不要高于 7.x
 2.1) 不建议使用ubuntu20.x及其以上版本, 之前有测试过无法编译modem<adsp和boot模块无法编译,高通源代码会去匹配linux版本,代码自身不带20.x相关的镜像>
3)必要的时候可以关闭linux自动更新功能
附:
1)官方关于java 8u292更新信息:<安全漏洞修复等>
https://www.linuxcompatible.org/story/rhsa2021144401-moderate-openjdk-8u292-security-update-for-portable-linux-builds/ 
2)openjdk-8u282版本共享:   openjdk\java-8-openjdk-amd64.tar.gz

apt install 命令安装的jdk默认路径在: /usr/lib/jvm/,  因此将如上包解压后放到: /usr/lib/jvm/下,

$ sudo tar zxvf java-8-openjdk-amd64.tar.gz  -C  /usr/lib/jvm/  &&  cd /usr/lib/jvm/ 

$ sudo rm -r java-1.8.0-openjdk-amd64 && sudo ln -s java-8-openjdk-amd64  java-1.8.0-openjdk-amd64

如果默认路径不在/usr/lib/jvm/下,请先查找对应的实际安装路径,可借助 which java获取相关的执行路径和安装路径

:~$ which java
/usr/bin/java
:~$ ls -la /usr/bin/java
lrwxrwxrwx 1 root root 22 Oct 30  2017 /usr/bin/java -> /etc/alternatives/java
:~$ ls -la /etc/alternatives/java
lrwxrwxrwx 1 root root 46 Nov  6  2017 /etc/alternatives/java -> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

项目可以用下面方式编译模块(有些模块比较大,无法定位到子模块,可以用mmm, 如CameraX和Chi)

XXXninja Settings

   关于android 10及以上 单编译模块速度慢的问题  主要是因为 mm  build的过程中 去调用了

subdir_makefiles := $(SOONG_ANDROID_MK) $(file <$(OUT_DIR)/.module_paths/Android.mk.list) $(SOONG_OUT_DIR)/late-$(TARGET_PRODUCT).mk
subdir_makefiles_total := $(words int $(subdir_makefiles) post finish)
.KATI_READONLY := subdir_makefiles_total

等方法 需要搜索  所有的 BP  android.mk  和生成 新的ninja 文件 导致编译过慢

我们可以在build/make/envsetup.sh
新增一个xxninja函数

function XXninja()
{
    local cmdline="time prebuilts/build-tools/linux-x86/bin/ninja -v -d keepdepfile $@ -f out/combined-xx5Gphone.ninja -w dupbuild=warn"
    echo $cmdline
    $cmdline
}

其中 out/combined-XX5Gphone.ninja 是你全编时生成的ninja文件

添加后

. build/envsetup.sh

就可以使用 新的 命令去 编译模块 如果不知道模块名字可以在模块的目录下

grep -rnws --include='*.bp' 'name:'

使用这个命令搜索

举个例子:

如需要编译Settings

xxninja Settings

 类似资料: