网站分析流程,做设计需要素材的常用网站有哪些,满版型网站有哪些,郑州航空港建设局网站Android 14之HIDL转AIDL通信 1、interface接口1.1 接口变更1.2 生成hidl2aidl工具1.3 执行hidl2aidl指令1.4 修改aidl的Android.bp文件1.5 创建路径1.6 拷贝生成的aidl到1和current1.7 更新与冻结版本1.8 编译模块接口 2、服务端代码适配hal代码修改2.1 修改Android.bp的hidl依… Android 14之HIDL转AIDL通信 1、interface接口1.1 接口变更1.2 生成hidl2aidl工具1.3 执行hidl2aidl指令1.4 修改aidl的Android.bp文件1.5 创建路径1.6 拷贝生成的aidl到1和current1.7 更新与冻结版本1.8 编译模块接口 2、服务端代码适配hal代码修改2.1 修改Android.bp的hidl依赖2.2 修改头文件依赖2.3 修改服务启动的rc脚本2.4 修改接口函数返回值Return拆分2.5 aidl 服务实现 1、interface接口
1.1 接口变更
google原生的::ndk::ScopedAStatus 已经支持status返回了hal接口理论上不需要再自定义status。所以需要删除掉目前我们HIDL文件里面里所有使用到status的接口。 注意需要用到的返回值不需要删除要保留只需要删除无用的status即可。 例子1
gwm_subscribe(IDiagCallback callback, vecuint16_t didList) generates (GWM_StatusCode status);
修改为
gwm_subscribe(IDiagCallback callback, vecuint16_t didList) ;
并删掉enum GWM_StatusCode 枚举GWM_StatusCode不需要使用的话例子2
gwm_registerCallback(ISwumCallback callback) generates (bool status);
修改为
bool gwm_registerCallback(ISwumCallback callback);例子3:
gwm_setCallback(IInformationCallback callback) generates (GWM_StatusCode status, int32_t clientid);
修改为
int gwm_setCallback(in IInformationCallback callback);后续的例子以ILog.hal为例 修改前 sendToServer(String data) generates(boolean result) ; void setCallback(ILogCallback callback); 修改后 boolean sendToServer(in String data); void setCallback(in vendor.mediatek.hardware.log.ILogCallback callback);
1.2 生成hidl2aidl工具
注意需要先执行source和lunch命令 m hidl2aidl -j128
1.3 执行hidl2aidl指令
hidl2aidl -o 要生成的aidl的路径 -r 转换的hidl的路径 hidl_interface name 这里用的命令是 hidl2aidl -o vendor/mediatek/proprietary/hardware/interfaces/log/aidl -r vendor/mediatek/proprietary/hardware/interfaces/log vendor.mediatek.hardware.log1.0
hidl_interface name一般是hidl同级目录下Android.bp文件里面定义的。
1、如果有报错按照提示修改即可。 2、VehicleHAL/wifi/sensor等原生接口除外如VehicleHAL为原生接口需要根据原生接口适配aidl 服务器 3、当执行完上述的hidl2aidl指令后会在-o 对应目录下生成aidl文件和一些translate文件以及Android.bp。
1.4 修改aidl的Android.bp文件
删除translate文件。 会生成如下截图红框所示文件 文件结构 Android.bp:
aidl_interface {name: vendor.mediatek.hardware.log,system_ext_specific: true,vendor_available: true,host_supported: true,frozen: true,srcs: [vendor/mediatek/hardware/log/*.aidl],stability: vintf,backend: {cpp: {// FIXME should this be disabled?// prefer NDK backend which can be used anywhere// If you disable this, you also need to delete the C// translate code.enabled: true, },java: {sdk_version: system_current,enabled: true, },},versions_with_info: [{version: 1,imports: [],},],
}
backend: 服务的后端AIDL支持四种后端分别是C/JAVA/NDK/RUST, 我们要使用NDK谷歌推荐CPP和JAVA后端加上enabled: true。
vendor_available配置参考vndk介绍文档
ILog.aidl
package vendor.mediatek.hardware.log;import vendor.mediatek.hardware.log.ILogCallback;VintfStability
interface ILog {// Adding return type to method instead of out param boolean success since there is only one return value.boolean sendToServer(in String data);void setCallback(in ILogCallback callback);}
ILogCallback.aidl:
// FIXME: license file, or use the -l option to generate the files with the header.package vendor.mediatek.hardware.log;VintfStability
interface ILogCallback {// Adding return type to method instead of out param boolean success since there is only one return value.boolean callbackToClient(in String data);}
1.5 创建路径
mkdir -p aidl_api/vendor.mediatek.hardware.log cd aidl_api/vendor.mediatek.hardware.log mkdir 1 mkdir current
1.6 拷贝生成的aidl到1和current
我自己本地尝试不拷贝直接进行下一步更新和冻结版本会遇到问题提示文件夹1下面没有文件。如果可以用1.7更新api和冻结api直接生成的请跳过这一步。
1.7 更新与冻结版本
先生成hash文件 croot system/tools/aidl/build/hash_gen.sh vendor/mediatek/proprietary/hardware/interfaces/log/aidl/aidl_api/vendor.mediatek.hardware.log/1 latest-version vendor/mediatek/proprietary/hardware/interfaces/log/aidl/aidl_api/vendor.mediatek.hardware.log/1/.hash
//更新api m vendor.mediatek.hardware.log-update-api //执行后生成current的api //冻结api: m vendor.mediatek.hardware.log-freeze-api //执行后生成初始版本号为1的api并且生成.hash文件并将frozen改为true 如果提示version:这个错误需要在Android.bp添加
versions_with_info: [
{
version: 1,
imports: [],
},
],错误提示 vendor/mediatek/proprietary/hardware/interfaces/log/aidl/Android.bp:3:1: module “vendor.mediatek.hardware.log_interface”: versions: must be set (need to be frozen) because: “this is a release branch - freeze it or set ‘owners:’” 1.8 编译模块接口
先将interface编译通过 mmm vendor/mediatek/proprietary/hardware/interfaces/log/aidl 有错解错 会编译生成jar包还有ndk相关文件
2、服务端代码适配hal代码修改
2.1 修改Android.bp的hidl依赖
去掉hidl依赖库 “libhidlbase”, “libhidltransport”, 添加binder依赖库 “libbinder_ndk”, “libbinder”,
去掉hidl接口模块 vendor.mediatek.hardware.log1.0 添加aidl接口模块 “vendor.mediatek.hardware.lbs-V1-ndk”, 2.2 修改头文件依赖
HIDL的特点是服务端和客户端都引用相同的接口文件即可由编译时工具自动进行展开。这里需要将HIDL的引用该为AIDL的。
将vendor/mediatek/hardware/log/2.0/ILog.h 改为aidl/vendor/mediatek/hardware/log/BnILog.h //BinderNative 在路径gen\include\aidl\vendor\mediatek\hardware\log路径下生成的头文件。
2.3 修改服务启动的rc脚本
service mtk_lbs_service.rc:
service mtk_lbs_service /vendor/bin/mtk_lbs_serviceclass haluser systemgroup system gps radio inet2.4 修改接口函数返回值Return拆分
AIDL不再使用Return模板函数直接将其拆分为状态和值状态由 ::ndk::ScopedAStatus返回非void的值由输出参数返回。 之前实现的hidl接口返回类型为Return的需要改成**::ndk::ScopedAStatus**返回值也需要同步修改为ScopedAStatus::ok() 例子
virtual ::android::hardware::Returnbool gwm_registerCallback(
const ::android::sp::vendor::gwm::hardware::swum::V2_0::ISwumCallback callback)
override;
修改为
virtual ::ndk::ScopedAStatus gwm_registerCallback(
const ::android::sp::vendor.gwm.hardware.swum::ISwumCallback callback,bool* _aidl_return) override;状态拆分成了::ndk::ScopedAStatus作为返回值HIDL的GWM_StatusCode 返回值放到了输出参数中使用指针的形式返回。 注意 1、::ndk::ScopedAStatus 依然可以使用isOk的方法。类似于下面这种用法在aidl仍然适用。具体作用就不在这里详细讲了后面有机会更新下。
auto ret mCallback-LocationInfoStructOnChange(locationStruct);
if (!ret.isOk()) {
ALOGI(%s has error, func);
}除了拆分其实也可以直接去参考BnILog.h文件最后头文件的声明为
virtual ScopedAStatus setCallback(const std::shared_ptrILbsCallback callback) override;
virtual ScopedAStatus sendToServer(const std::vectoruint8_t data, bool* result) override;
cpp文件的实现为
ScopedAStatus AgpsDebugInterfaceLbsService::setCallback(const std::shared_ptrILbsCallback callback) {if (callback nullptr) {LOGE([%s][%s] AgpsDebugInterfaceLbsService setCallback is null !!!, g_ver, mName);return ScopedAStatus::ok();;}BaseLbsService::setCallback(callback);if(mLocalFd ! -1) {LOGE([%s][%s] DebugInterface::setCallback() mLocalFd is not -1, g_ver, mName);return ScopedAStatus::ok();}if (connectToAgpsd3()) {mIsExit false;};return ScopedAStatus::ok();
}ScopedAStatus AgpsDebugInterfaceLbsService::sendToServer(const std::vectoruint8_t data,bool* result) {char buff[MAX_BUFFER_SIZE] {0};int read_len 0;LOGD([%s][%s] DebugInterface::sendToServer() size[%d], g_ver, mName, (int)data.size());if (data.size() 0 || data.size() MAX_BUFFER_SIZE) {LOGE([%s][%s] DebugInterface::sendToServer() data size check fail !, g_ver, mName);*result false;return ScopedAStatus::ok();}covertVector2Array(data, buff);read_len mtk_socket_write(mLocalFd, buff, (int)data.size());if (read_len 0 ) {LOGE([%s][%s] DebugInterface mtk_socket_write() failed, len%d, g_ver, mName, read_len);}// we dont care the error happens in this scenarioUNUSED(read_len);mIsExit true;*result true;return ScopedAStatus::ok();
}
注意在aidl中所有的指针类型都会定义为智能指针std_sharedptr之前hidl定义的强指针sp需要修改为智能指针。
2.5 aidl 服务实现
模板大概是 hidl hal:
auto service std::make_uniqueDiag(); //创建对象
configureRpcThreadpool(4, true /* callerWillJoin */); //配置线程池
ALOGD(Diag HAL service starting);
status_t status service-registerAsService(); //注册服务
if (status ! OK) {ALOGE(Unable to register Diag HAL service (%d), status); return 1;
}ALOGI(Register DiagHAL Service successfully);
joinRpcThreadpool(); //加入线程池aidl hal
android::ProcessState::initWithDriver(/dev/vndbinder); //使用vndbinder设备节点
ABinderProcess_setThreadPoolMaxThreadCount(1); // vnbinder的线程池独立需要单独配置
ABinderProcess_startThreadPool(); //手动启动线程池
// registering
std::shared_ptrDiag service ::ndk::SharedRefBase::makeDiag(); //创建对象
const std::string desc Diag::descriptor /defaults;binder_exception_t err AServiceManager_addService(serviceasBinder().get(), desc.c_str()); //注册服务
CHECK_EQ(err, STATUS_OK);
ABinderProcess_joinThreadPool();
//加入线程池最终实现
#define LOG_TAG mtk_lbs_service#include android/binder_process.h
#include log/log.h#include mtk_lbs_service.h//namespace aidl::vendor::mediatek::hardware::lbs {
//extern int mtk_lbs_main();
//}int main() { Register AIDL servicebinder_exception_t err AServiceManager_addService(service-asBinder().get(), vendor.mediatek.hardware.log.ILog/lbs);if (err ! EX_NONE) {ALOGE(failed to register vendor.mediatek.hardware.log.ILog service, exception: %d, err);return 1;}ABinderProcess_setThreadPoolMaxThreadCount(20);ABinderProcess_startThreadPool();//aidl::vendor::mediatek::hardware::lbs::mtk_lbs_main();ABinderProcess_joinThreadPool();return EXIT_FAILURE; // should not reach
}
然后就是编译hal模块编译遇到什么问题改什么。