android11源码如何将第三库添加到整个系统编译流程中(涉及到binder机制)
注:添加过程中发现了一个问题,添加的模块无法通过binder模块的IInterface.h的断言检测,折腾了一段时间,具体流程后面叙述android添加模块支持主要是通过添加配置进行,在相应的配置文件中添加模块的支持比如前一文章中编译的mhelloworld模块按照常规的添加流程进行添加:这里主要是仿照tinyalsa进行添加的1、搜索libtinyalsa库(在相应的配置目录搜索)grep -R
注:添加过程中发现了一个问题,添加的模块无法通过binder模块的IInterface.h的断言检测,折腾了一段时间,具体流程后面叙述
android添加模块支持主要是通过添加配置进行,在相应的配置文件中添加模块的支持
比如前一文章中编译的mhelloworld模块
按照常规的添加流程进行添加:
这里主要是仿照tinyalsa进行添加的
1、搜索libtinyalsa库(在相应的配置目录搜索)
grep -Rn “libtinyalsa” build/ development/ sdk/
根据搜索结果,实际查看并没有我们需要的内容
2、搜索tinyplay可执行文件的配置依赖
3、上面的搜索结果,做了一定的尝试,(对安卓不熟悉)
vim build/target/product/mainline_system.mk
并定位到tinyplay的位置
注:这里是后面做了一定了解重新备注的内容,mainline_system.mk是添加与系统层面相关的一层内容,个人的代码模块一般不建议添加到这里面,
通常个人的代码模块一般按照功能的所属性质进行添加,如果是系统层面的代码,添加到上面的mainline_system.mk中,如果是与硬件厂商相关的
内容,则添加到./build/target/product/handheld_vendor.mk中,实际我这次项目的代码是要添加到./build/target/product/handheld_vendor.mk中,主要
原因是binder机制,binder机制实际有三个驱动,mainline_system.mk代码默认是走binder,handheld_vendor.mk代码默认走的是VNDK的binder_ndk,因为我的代码
要与hal层打交到
除了上面的修改外,还需要设置一个参数:
根据上面的内容,将编译选项上添加上vendor: true,
开始添加到PRODUCT_HOST_PACKAGES中,编译没过,原因不名,查了些资料,添加到了PRODUCT_PACKAGES下,编译成功了,这里并没有深究
4、回到源码主目录,进行编译
查看输出文件已经重新编译更新,over
5、现在回到开头说的问题
1)按常规的操作,新写的代码继续添加到extern目录下
注:新写的代码里面有包含binder相关的接口调用(多进程通讯)
按上面的流程进行编译后,出现报错如下:
binder模块的IInterface.h中的118行报错了,编译不过,对代码进行了一定的分析,
实际是DO_NOT_CHECK_MANUAL_BINDER_INTERFACES宏未定义
老办法,在配置目录下搜索该宏:
grep -Rn DO_NOT_CHECK_MANUAL_BINDER_INTERFACES build/ development/ sdk
2)分析build/core/binary.mk文件,定位到155行
单纯的从.mk文件上,不太好看原因,于是添加了部分打印,进一步分析:
通过打印,ALLOWED_MANUAL_INTERFACE_PATHS宏表示两个内容:
vendor hardware
整体上面代码的意识是过滤掉非vendor和非hardware目录下的关于binder机制依赖的关系,
看起来android做了限制,外部依赖binder的代码只能在这两个目录下包含,
下面粘贴一下IInterface.h中的断言错误:
综上,为了快速解决,于是将新写的代码,添加到hardware目录下,编译问题才得以解决
通过逆向分析,也可以将新添加的代码路径添加到ALLOWED_MANUAL_INTERFACE_PATHS宏里面包含
后续代码因为编译问题重新调整为了添加宏支持方法:
更多推荐
所有评论(0)