当前位置: 首页 > news >正文

Android13 新增 Stable AIDL接口

问题描述:

我需要在netd aidl 中添加新的接口:

设置网卡MAC地址:

void setHardwareAddress(in @utf8InCpp String iface, in @utf8InCpp String hwAddr);

背景:

Android 10 添加了对稳定的 Android 接口定义语言 (AIDL) 的支持,这是一种跟踪由 AIDL 接口提供的应用编程接口 (API)/应用二进制接口 (ABI) 的新方法。稳定的 AIDL 与 AIDL 的主要区别如下:

在构建系统中使用 aidl_interfaces 定义接口。
接口只能包含结构化数据。对于代表所需类型的 Parcelable,系统会根据其 AIDL 定义自动创建,并自动对其进行编组和解组。
可以将接口声明为“稳定”接口(向后兼容)。声明之后,会在 AIDL 接口旁的一个文件中对这些接口的 API 进行跟踪和版本编号。
 

添加以后:使用如下指令编译模块

mmm /frameworks/libs/net/common/netd

报错提示说需要更新api:

API dump for the current version of AIDL interface setHardwareAddress does not exist.

Run m netd_aidl_interface-update-api or add unstable: true to the build rule for the interface if it does not need to be versioned

我们按照提示更新api:

make netd_aidl_interface-update-api 更新当前api 此命令执行成会更新如下目录下的aidl文件

QSSI.13\frameworks\libs\net\common\netd\aidl_api\netd_aidl_interface\current 

因为我们是在原来的aidl文件内新增的接口, 所以我们需要使用如下指令重新生成一个version 的api

make netd_aidl_interface-freeze-api 此命令会生成新的版本号的api:之前最大是10,更新以后多了11

QSSI.13\frameworks\libs\net\common\netd\aidl_api\netd_aidl_interface\11 

然后我们再重新编译模块:

mmm /frameworks/libs/net/common/netd 在如下路径会生成该版本的aidl对应的java文件和.h文件。 QSSI.13\out\soong\.intermediates\frameworks\libs\net\common\netd\netd_aidl_interface-V11-java-source\gen\android\net QSSI.13\out\soong\.intermediates\frameworks\libs\net\common\netd\netd_aidl_interface-V11-cpp-source\gen\include\android\net 

我们可以打开.h文件找到我们定义的方法:

经过如上操作我们就可以实现该方法了: 

//QSSI.13\system\netd\server\NetdNativeService.h
binder::Status setHardwareAddress(const ::std::string& iface, const ::std::string& hwAddr) override;
QSSI.13\system\netd\server\NetdNativeService.cpp
binder::Status NetdNativeService::setHardwareAddress(const std::string& iface,const std::string& hwAddr){....return binder::Status::ok();
}

 service层就实现好了,我们可以编译模块然后上层就可以调用了

编译模块的时候,报错如下:

FAILED: out/soong/apex/depsinfo/new-allowed-deps.txt.check if grep -v '^#' packages/modules/common/build/allowed_deps.txt | diff -B - out/soong/apex/depsinfo/new-allowed-deps.txt; then touch out/soong/apex/depsinfo/new-allowed-deps.txt.check; else echo -e "\n******************************"; echo "ERROR: go/apex-allowed-deps-error"; echo "******************************"; echo "Detected changes to allowed dependencies in updatable modules."; echo "To fix and update packages/modules/common/build/allowed_deps.txt, please run:"; echo -e "$ (croot && packages/modules/common/build/update-apex-allowed-deps.sh)\n"; echo "When submitting the generated CL, you must include the following information"; echo "in the commit message if you are adding a new dependency:"; echo "Apex-Size-Increase:"; echo "Previous-Platform-Support:"; echo "Aosp-First:"; echo "Test-Info:"; echo "You do not need OWNERS approval to submit the change, but mainline-modularization@"; echo "will periodically review additions and may require changes."; echo -e "******************************\n"; exit 1; fi; 738a739,740 > netd_aidl_interface-V11-java(minSdkVersion:29) > netd_aidl_interface-V11-ndk(minSdkVersion:29) ****************************** ERROR: go/apex-allowed-deps-error ****************************** Detected changes to allowed dependencies in updatable modules. To fix and update packages/modules/common/build/allowed_deps.txt, please run: $ (croot && packages/modules/common/build/update-apex-allowed-deps.sh) When submitting the generated CL, you must include the following information in the commit message if you are adding a new dependency: Apex-Size-Increase: Previous-Platform-Support: Aosp-First: Test-Info: You do not need OWNERS approval to submit the change, but mainline-modularization@ will periodically review additions and may require changes. ******************************

可以看到提示,需要我们在系统添加如下声明:

netd_aidl_interface-V11-java(minSdkVersion:29)

netd_aidl_interface-V11-ndk(minSdkVersion:29)

如上声明我们可以使用脚本自动生成:

运行如下python脚本就可以了。

(croot && packages/modules/common/build/update-apex-allowed-deps.sh)

如上我们就可以编译模块成功了,编译成功以后,我们就可以通过INetd 调用该函数了

@Override
public void setHardwareAddress(String iface, String hwAddr) {// TODO: Remove CONNECTIVITY_INTERNAL after bluetooth tethering has no longer called these//  APIs.NetworkStack.checkNetworkStackPermissionOr(mContext, CONNECTIVITY_INTERNAL);Slog.i(TAG, "setHardwareAddress..." + iface + ":" + hwAddr);try {mNetdService.setHardwareAddress(iface, hwAddr);} catch (RemoteException | ServiceSpecificException e) {throw new IllegalStateException(e);}
}

在调试过程中,遇到的错误如下:

  • Backward incompatible change detected on AIDL API

该问题的原因是因为我新增的方法加在了中间,导致原始的API顺序产生了变化,我们需要把新增的接口,加在最后面,然后使用make netd_aidl_interface-update-api 更新current

  • ERROR: Modification detected of stable AIDL API file

该问题产生的原因是因为我手动修改QSSI.13\frameworks\libs\net\common\netd\aidl_api\netd_aidl_interface\10 目录下的aidl文件,导致hash值更改了,后面通过make netd_aidl_interface-freeze-api  生成新的api,后续更改应用的版本就可以了。

  • java层通过INetd 调用不到新增的方法

该问题的原因为:frameworks\libs\net\common\netd\Android.bp 使用的AIDL版本为10,我们新增的aidl接口是在11版本里面

所以我们需要将这里的10修改成11。

如上即为新增aidl接口遇到的全部问题。

关于Stable  AIDL的详细资料:穩定的 AIDL  |  Android Open Source Project

http://www.lryc.cn/news/239311.html

相关文章:

  • Postman API Enterprise 10.18.1 Crack
  • 电脑内存升级
  • ExcelBDD PHP Guideline
  • C++静态链接库的生成以及使用
  • 【2024系统架构设计】 系统架构设计师第二版-未来信息综合技术
  • JavaFX修改软件图标
  • Linux ps -ef|grep去除 grep --color=auto信息
  • jQuery的学习(一篇文章齐全)
  • 注塑行业各类业务流程图(系统化)
  • Android Studio 安装及使用
  • 计算机网络的OSI七层模型
  • 如何一次性解压多个文件
  • 类和对象学习笔记
  • Linux程序之可变参数选项那些事!
  • 【1day】泛微e-office OA系统user_page接口未授权访问漏洞学习
  • Midjourney绘画提示词Prompt参考教程
  • Altium Designer学习笔记6
  • 【问题解决】Maven密码加密
  • vue3基于vite打包
  • 前端使用JWT时无法获取Authorization请求头
  • postman定义公共函数这样写,测试组长直呼牛逼!!!
  • 单元测试实战(六)其它
  • jmeter 主从配置
  • 4
  • C++ Day04 this指针,友元函数,重载
  • 2023做车载测试真的可以远离内耗!转行车载月入20K!
  • LINUXZ
  • C#单例模式懒汉式与饿汉式
  • 小微初创企业,如何利用媒体宣传快速成长
  • 【封装UI组件库系列】全局样式的定义与重置