PRODUCT_COPY_FILES语法解析
Android 编译系统解析系列文档
编译系统入口envsetup.sh解析
解析lunch的执行过程以及make执行过程中include文件的顺序
关注一些make执行过程中的几个关键点
对一些独特的语法结构进行解析
PRODUCT_COPY_FILES变量很常用,但是这个变量的作用方式却又与一般的定义符号作用不一样,所以单独提出来说说
解析PRODUCT_COPY_FILES变量作用的函数,位于build/core/Makefile
1 | # ----------------------------------------------------------------- |
我们来看这里使用了两个变量
unique_product_copy_files_pairs
unique_product_copy_files_destinations
从名字上来说,我们也能发现,这两个变量是分别用来处理copy对以及copy目标的,我们挨个儿解析,先去掉重复对(pairs)的,也就是source:dest 定义重复的
1 | unique_product_copy_files_pairs := |
然后开始处理destination重复定义的
从之前去重的copy对中挨个提取_src,_dest,
word-colon
只是用来分离:
前后字段的一个封装使用check-product-copy-files检查apk混了进来,那么就报错,因为apk是使用
BUILD_PREBUILT
方式来处理的然后以dest文件为目标过滤重复,保留出现的第一个,去掉后边重复的(dest file重复),然后对过滤出的文件追加out的路径(out/target/product/xxxxx/)
这里第三步比较关键,我们来分析一下:
这里用到一个if判断,如果检测到重复了,那么将这个pair打印出来,否则就做以下这些操作:
为dest追加out的路径,因为编译系统默认的路径都在源码根目录,所以拷贝的时候需要添加out目录前缀
对于xml文件来说,使用xmllint来验证格式是否正确,如果没问题,那么执行copy操作,对于其他文件直接copy(实际使用copy-file-to-target执行)
追加到ALL_DEFAULT_INSTALLED_MODULES 这个变量中,表示已经安装过了这个文件
以及加入到unique_product_copy_files_destinations变量表示已经执行拷贝操作了,下次遇到就要过滤
对于这样的实现方式,不是很符合我们的直觉,因为我们直觉是后边拷贝的文件会覆盖前边拷贝的文件,所以
我们通过追查build/core/Makefile的提交历史,找到了这样一条提交518ce5753a95355eccf396f8ed9c36960c83274b
额,提交前的实现方式是直接覆盖,提交之后就变成拷贝第一个了,提交信息也比较含糊…没有办法看出这样做的原因是什么坑:对于PRODUCT_COPY_FILES,dest目标都是使用字符串匹配形式的,所以对于/system/system/这属于两个字符串,不会被过滤
PRODUCT_COPY_FILES语法解析
http://www.0xforee.top/2016/02/24/android-build-system-parse-PRODUCT_COPY_FILES/