【Yocto】yocto编译系统Image优化笔记

yocto编译系统Image优化笔记

使用yocto编译出来的Image文件(比如ext4格式)有时候根据业务需求,是要进行剪裁以缩小Image的Size。
比如系统有OTA需求,系统预留的OTA分析大小是500M。但是Image(ext4格式)是1G大小。即使使用压缩文件,也未达到500M。这种情况下,可能就需要进行剪裁了。
这里记录下一下,Yocto Image剪裁时可能会用到的一些知识点。

是否进行了strip

对于编译系统来说,strip操作可理解为对编译生成的成果物(so、bin之类的)剔除其用于Debug的symbol等。strip后成果物的size会变下。
Yocto系统默认对Image的成果物进行Strip操作,但可以通过设置下述变量让Yocto对成果物不进行strip。

# If set to “1”, causes the build to not strip binaries in resulting packages and prevents the -dbg package from containing the source files
INHIBIT_PACKAGE_STRIP

#Prevents the OpenEmbedded build system from splitting out debug information during packaging. 
#By default, the build system splits out debugging information during the do_package task.
INHIBIT_PACKAGE_DEBUG_SPLIT

#If set to “1”, causes the build to not strip binaries in the resulting sysroot.
INHIBIT_SYSROOT_STRIP

比如在bb文件中如下设置,就不会进行strip

INHIBIT_PACKAGE_STRIP = 1
INHIBIT_PACKAGE_DEBUG_SPLIT =1 

某些成果物编译时,会特意设置上面的变量来阻止strip操作。考虑去除这些设置,进行strip操作来减少image size。

删除未使用的package

缩减Image size首先想到的肯定就是删除没使用的Package(应用包),这种就要逐个进行分析了。但是我们可以利用Yocto提供了一些内容辅助我们进行分析。

编译历史

Yocto提供了编译相关的历史记录,其中包括

  • Image包含的所有Package有哪些
  • Image包含的每个Package大小(Size从大到下排序)
  • 每个Package对应的成果物内容(头文件、二进制、so等等)
  • Package间的依赖关系(dot文件)

历史记录被Yocto收集到编译目录下的buildhistory 目录中。通过Package大小可以分析 哪些Package Size比较大。通过Package间的依赖关系(dot文件可以转成图片),可以分析包与包间的 关系。

# 比如
poky/build/buildhistory
包含的layer有哪些

不同食谱里面可以提供了相同名称的bb文件。有时候需要确定,编译过程中使用的是哪一个。可以通过在bb文件中加log的方式确认,也可以使用下述命令输出所有参与编译的Layer。

bitbake-layers show-layers
查看当前编译环境中的所有环境变量

某些Package是否启动,与Yocto的一些环境变量有关(比如DISTRO_FEATURES)。可以通过如下命令查看当前所有环境变量的值。

bitbake -e
删除package中指定内容

可以在package进行安装中,删除其中的多余内容。比如删除test类的程序。下述命令在do_install阶段删除exmaple文件。
${D}变量的值一般是编译目录中每个Package中的image这个文件夹。

do_install() {				
    oe_runmake 'DESTDIR=${D}' install				
    if [ -e "${D}/usr/share/linduo/examples" ]; then				
    rm -rf ${D}/usr/share/linduo/examples				
    fi							
}	
如何给meson传递参数?

如果package使用了meson编译方式,可以通过如下方式在对应的bb文件中传递参数。

EXTRA_OEMESON += " \		
    -Dtest1=disabled \		
    -Dtest2=disabled \
"		
清理指定的package目标

使用下述命令,可以清理指定的package目标(包括cache,但不会删除下载的源码)

 bitbake -c cleansstate xxx

清理package还有以下两个命令:

#Removes all output files, shared state (sstate) cache, and downloaded source files for a target
# 删除package相关所有内容,包括缓存文件和下载的源码(慎用)
bitbake -c cleanall xxx

# Removes all output files for a target from the do_unpack task forward
# 删除编译的成果物,不会删除缓存文件
bitbake -c clean xxx

Image剪裁是个细致入微且耗费时间的过程,考虑Size缩减的同时也需要考虑系统的功能性、稳定性、维护性等。