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.mzph.cn/news/153478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习:十大算法快速回顾

一、说明 对于机器学习的是个经典算法,本篇将展示一个回顾,注意,本篇不是具体原理信息介绍,没有代码,但是对于初学者是一个有益的导读。 二. 线性回归 2.1 算法描述 有没有想过数据奇才如何预测未来?输入线…

Linux 终端 Ctrl + C 无法终止当前程序(详细解决步骤)

Linux 终端 Ctrl C 无法终止当前程序 linux 终端 ctrl c无法终止当前程序 Ctrl C无法终止进程时该怎么办? linux ctrlc无法退出当前进程, 怎么办?------进程的前台后台切换 1、Ctrl Z 让进程在后台运行 2、通过 ps 命令查看已挂起的进程…

Linux安装rabbitMq(亲测可用)解决只能本地访问的问题

安装er https://blog.csdn.net/laterstage/article/details/131513793?spm1001.2014.3001.5501下载mq wget --content-disposition "https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.10.0-1.el7.noarch.rpm/download.rpm?distro_v…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《氢耦合区域综合能源系统集群双层博弈随机优化调度策略》

这个标题涉及到复杂的领域,主要包括氢能源、能源系统集群、双层博弈、随机优化和调度策略。我将分步解读这个标题: 氢耦合区域综合能源系统集群: 氢能源: 这指的是使用氢作为能源的系统,可能是指氢燃料电池等。区域综合…

TensorFlow实战教程(二十六)-什么是生成对抗网络GAN?基础原理和代码普及

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了Keras实现经典的深度学习文本分类算法,包括LSTM、BiLSTM、BiLSTM+Attention和CNN、TextCNN。这篇文章将详细介绍生成对抗网络GAN的基础知识,包括什么是GAN、常用算法(CGAN、DCGAN、…

护眼灯买哪种好?考研必备的护眼台灯推荐

家里顶灯太暗了且高度太高,还是原始的LED灯,晚上用着眼睛都有点难受,还好遇到了儿童护眼灯。下面小编为大家介绍下儿童护眼灯哪个牌子好?什么护眼台灯比较专业 1、色温 台灯的色温也是一个需要考虑的因素,所谓的色温其…

【数据结构】图的存储结构及实现(邻接表和十字链表)

一.邻接矩阵的空间复杂度 假设图G有n个顶点e条边,则存储该图需要O(n^2) 不适用稀疏图的存储 二.邻接表 1.邻接表的存储思想: 对于图的每个顶点vi,将所有邻接于vi的顶点链成一个单链表,称为顶点vi的边表&#xff08…

海外服务器相较于国内服务器有何特点?亚马逊海外服务器为何零跑全球

随着数字时代的迅猛发展,云计算基础设施的重要性愈发凸显。在这个信息爆炸的全球化时代,很多企业的海外业务的成功往往取决于是否拥有安全、可靠、高性能、可扩展、灵活且全球覆盖的云基础设施,因此对很多企业来说,选择一款优质的…

Selenium IDE录制脚本

文章目录 1.环境搭建1.1 Chrome浏览器安装1.2 Chrome驱动安装1.3 Selenium IDE插件的安装 2.Selenium IDE插件介绍2.1 初始化界面2.2 菜单栏2.3 工具栏2.4 地址栏2.5 测试用例窗口2.6 测试脚本窗口2.7 日志和引用窗口 3.元素定位3.1 通过id进行元素定位3.2 通过name进行元素定位…

笔记本散热怎么做?学会4招,快速散热!

“不知道为什么,我的笔记本总是用着用着就会发热。有时候还会非常的烫。这是为什么呢?应该怎么解决笔记本散热的问题呢?” 随着笔记本性能的提高,散热变得尤为重要。合理的散热不仅可以保持笔记本的稳定性能,还能延长其…

React Native项目接入Sentry指南

本文主要介绍React Native项目接入Sentry流程,以及遇到的一些注意点,方便大家去解决和处理,如果在接入过程中,遇到任何问题可以在评论区留言,我将根据自己的接入经验给出一些解决方案和建议。 1, 安装sentry sdk 我们可以在项目中执行如下命令来安装sentry,命令如下: …

端口探测技术总结

基于TCP的探测 关于三次握手(Three-way Handshake) 向处于开放或关闭状态的端口发送不同字段设置的探测请求包时,被探测端口的回应如下表所示: closed portopen portSYN 包丢弃并返回一个RST包回复SYN或ACKSYN关闭的包丢弃不回复丢弃不回复RST包丢弃不…

对一个Series序列内的元素逐个扩展同一聚合操作一个序列中共有m个元素,从指定的第n个元素开始,对前i元素进行聚合计算Series.expanding()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 一个序列中共有m个元素 从指定的第n个元素开始 对前i元素进行聚合计算 其中&#xff1a;n < i < m 聚合计算&#xff1a;求最大、平均值等 Series.expanding(n).max() Series.expanding(…

什么是加工制造业ERP系统?加工制造业ERP软件有哪些作用

化工、电子、五金、来料加工等不同性质的加工企业有差异化的业务特点&#xff0c;传统的管理模式难以解决多仓库、多工厂、多门店、多渠道信息统一和实时共享等问题。 另外如何实时掌握车间产能、科学制定生产计划、多门店数据统一和实时同步等问题&#xff0c;是很多加工制造…

C语言编程陷阱 (九)

陷阱41&#xff1a;不要使用内存下标越界 C语言中&#xff0c;集群的下标可能是从0开始的&#xff0c;比如集群的长度是5&#xff0c;那么它的下标范围是0到4&#xff0c;如果我们使用一个超出范围的下标来访问集群&#xff0c;会导致集群下标越界。 有时&#xff0c;我们会错误…

【Linux】基本指令

Linux现在已经是绕不开的操作系统&#xff0c;其开源导致的稳定性&#xff0c;安全性等方面遥遥领先。今天我们开始学习Linux操作系统的基本指令 目录 lspwdcdtouchmkdirrmdir && rmmancp ls 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xf…

NOI1995:石子合并

题目链接 [NOI1995] 石子合并 题目描述 在一个圆形操场的四周摆放 N N N 堆石子&#xff0c;现要将石子有次序地合并成一堆&#xff0c;规定每次只能选相邻的 2 2 2 堆合并成新的一堆&#xff0c;并将新的一堆的石子数&#xff0c;记为该次合并的得分。 试设计出一个算法…

在回调之间共享数据

可以在 App 中为 UI 组件编写回调函数&#xff0c;以指定用户与其交互时的行为方式。 在具有多个相互依赖的 UI 组件的 App 中&#xff0c;回调函数通常必须访问主 App 函数中定义的数据&#xff0c;或与其他回调函数共享数据。例如&#xff0c;如果创建一个具有列表框的 App&a…

关于WhatsApp群发营销价值、类型、优劣势……这里一次性讲清楚

01 社交销售互动&#xff1a;全球营销新趋势 当下&#xff0c;全球品牌的营销销售互动都步入了社交销售新时代&#xff0c;相比原来任何一种形式的互动沟通来说&#xff0c;其沟通效率、体验、效果都是无与伦比的。 企业与销售的互动&#xff0c;与通讯信息技术发展息息相关。…

python数据结构与算法-08_字典

字典 dict 上一章我们介绍了哈希表&#xff0c;其实 python 内置的 dict 就是用哈希表实现的&#xff0c;所以这一章实现 dict 就非常简单了。 当然 cpython 使用的是 c 语言实现的&#xff0c;远比我们写的复杂得多 (cpython/Objects/dictobject.c)。 上一章我们用 python 自…