注:添加过程中发现了一个问题,添加的模块无法通过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宏里面包含
后续代码因为编译问题重新调整为了添加宏支持方法:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐