前提条件
Android源码已经完整编译过。
在一个工程的Android.bp文件中,为编译目标添加了vendor_available属性:
cc_binary {name: "TheProjectTargetName"vendor_available = true, // <<------------...
}
单独编译功能
此时单独编译工程,使用mm或者mmm命令,可以正常编译
整编源码报错
再次在Android源码根目录下编译,就会报错:
checkvintf E 09-12 18:30:26 1016661 1016661 VintfObject.cpp:65] getFrameworkHalManifest: status from fetching VINTF information: -2147483648
checkvintf E 09-12 18:30:26 1016661 1016661 VintfObject.cpp:66] getFrameworkHalManifest: -2147483648 VINTF parse error: Cannot add manifest fragment /product/etc/vintf/manifest/system_diagnosis_service.xml:HAL "ltd.faw.system_diagnosis_service" has a conflict.
checkvintf I 09-12 18:30:26 1016661 1016661 VintfObject.cpp:55] getDeviceHalManifest: Reading VINTF information.
在out目录中存在几个文件:
~/code/qisi/out/target/product/hqcos/system$ find . -name "system_diagnosis_service.xml"
./product/etc/vintf/manifest/system_diagnosis_service.xml
./etc/vintf/manifest/system_diagnosis_service.xml~/code/qisi/out/target/product/hqcos/vendor$ find . -name "system_diagnosis_service.xml"
./etc/vintf/manifest/system_diagnosis_service.xml
把上述几个.xml文件删除,重新make就可以正常编译通过。
这几个xml是对应工程中hal接口描述文件(学名叫兼容矩阵compatibility matrix,这里不展开),根据.bp文件中的配置vendor是否可用,选择是否在vendor目录下放置此文件。
总结:
- 如果源码没有编译过,重新编译,Android.bp中的各种配置只要符合语法和规则,就不会编译出错。
- 如果已经编译过一次,修改Android.bp中的属性,和先前编译中不匹配,会导致编译过程中检查报错。类似的,如果增删Framework中的接口,但没有执行update api操作,也会报错。这里是对接口描述做校验,接口变更不仅包括接口增加、参数变化,还包括可访问范围(vendor_available、vendor)等