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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/170903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

钩子函数-hook

钩子函数-hook hook 的作用 利用钩子函数可以在所有测试用例执行前做一些预置操作(如:准被测试数据、测试环境) 或者在测试结束后做一些后置操作(如:清理测试数据) 钩子函数在其它框架中也有&#xff0…

抽象轻松测试接口API

测试 1.测试环境 2.测试代码 3.代码结构 Maven项目核心依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.3.0</version></dependenc…

【HarmonyOS】低代码平台组件拖拽使用技巧之页签容器

【关键字】 HarmonyOS、低代码平台、Tabs、TabContent、页签导航 1、写在前面 前面几篇分别介绍了低代码平台中的堆叠容器、滚动容器、网格布局等三种容器的使用&#xff0c;实际开发中我们经常会有这样的需求&#xff0c;页面底部是三个Tab按钮点击时会分别切换不同的视图内…

申请注册苹果iOS企业级开发者证书需要公司拥有什么规模条件

在全球范围内&#xff0c;iOS应用市场的规模和影响力不断增长&#xff0c;企业级应用在其中扮演着重要角色。为了在苹果设备上开发和发布内部应用&#xff0c;企业需要获取苹果的iOS企业级开发者证书。文章旨在探讨企业在申请此证书时需要满足的条件、注册流程&#xff0c;以及…

【计算机毕业设计】Springboot高校论文管理系统 -96280,免费送源码,【开题选题+程序定制+论文书写+答辩ppt书写-原创定制程序】

SpringBoot论文管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;高校当然也不例外。论文管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方…

请收藏!2023年全栈开发人员实战进阶指南终极版

全栈工程师在过去十年中越来越受到欢迎&#xff0c;而且在国内的就业环境下&#xff0c;它是更适合从技术转管理的职位。 但究竟什么是全栈工程师&#xff1f;他需要哪些技术能力&#xff1f;如何才能成为一名优秀的全栈工程师&#xff1f;今天这篇文章就给大家全方位分享一下…

录屏软件自动开启录视频,是如何实现的?

工作要留痕&#xff0c;作为职场人的一项必备技能&#xff0c;因此许多人在做一些重要操作的时候&#xff0c;就会提前开启录屏软件&#xff0c;把操作的每一个步骤进行录制&#xff0c;以避免在出现问题的时候进行检查。当每天都需要在固定的时间点重复某项工作的时候&#xf…

ISP概念入门

这里写自定义目录标题 引言ISP的处理流程1、Sensor有暗电流2、通过镜头到达Sensor中间的光多于到达Sensor的边缘的光&#xff0c;即光学系统中的渐晕3、Senor上有的像素点的输出有坏点4、Cmos的Sensor采用了Bayer色彩滤波阵列(Bayer Color Filter Array&#xff0c;CFA)5、Seno…

OpenAI一朝领导者山姆·奥尔特曼被解除职务,领导能力不再被认可?

原创 | 文 BFT机器人 在11月17日&#xff0c;OpenAI Inc.宣布CEO山姆奥尔特曼 (Sam Altman) 离职。掌舵人发生重大转变&#xff0c;董事会却在这个时候将公司首席技术官 Mira Murati推举为临时首席执行官&#xff0c;这一操作顿时引起了热议。 这突如其来的变化标志着OpenAI的…

[汇编实操]DOSBox工具安装——Ubuntu18.04系统

一、下载&安装 sudo apt install -y dosbox 二、启动 dosbox 三、C盘挂载 将上述文件下载放在任意路径&#xff0c;将DEBUG目录映射为虚拟C盘 MASM.EXE 是用来编译的&#xff0c;LINK.EXE 用来链接&#xff0c;这俩是必须的。 执行如下命令&#xff1a; mount c /m…

超级会员卡积分收银系统源码+会员卡+积分商城+多门店系统 附带完整的搭建教程

时代在发展&#xff0c;商家对于会员管理、积分管理、收银管理以及多门店管理的需求日益增长。为了满足这些需求&#xff0c;开发一款功能全面、易于使用和管理的超级会员卡积分收银系统变得至关重要。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a; 1.会员管…

数据质量校验

1.事实表包含昨日数据 2.昨日同比趋势分析 圆通业务量较为平稳 &#xff0c;每日数据量和昨日比差距不足20%&#xff0c;会做数据量的昨日环比差距分析

2023美亚杯个人赛复盘(三)

案件基本情况&#xff1a; &#xff08;一&#xff09;案情 2023月8月的一天&#xff0c;香港警方在调查一起网络诈骗案件时&#xff0c;发现有三名本地男子&#xff0c;分別为李大輝&#xff08;李大辉&#xff09;&#xff0c;浩賢(浩贤)和Elvis CHUI&#xff0c;并确信这三名…

Jenkins 下载安装

下载 Jenkins 选择Download LTS是稳定版本,尽量选择稳定版本,然后选择你的开发系统. 安装 Jenkins需要JAVA环境,所以安装JAVA环境 Java Jenkins支持17、21等几个版本的Java,OpenJDK JDK 21.0.1 GA Release 安装不要安装到C盘,这个后面会占较大的内存空间 然后按照指…

Java自动化驱动浏览器搜索稻香

下载最新的Chrome浏览器 查看chrome版本&#xff0c;在浏览器地址栏输入&#xff1a;chrome://version/ 下载对应的浏览器驱动&#xff0c;将其放到一个目录中&#xff0c;我放到了D:/chromedriver-win64 导入对应的依赖【注意&#xff1a;不要导入最新的版本&#xff0c;最…

02-《人月神话》霍金敬酒和虫族战争-中译本纠错及联想

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 2001年&#xff0c;我们翻译《人月神话》的时候&#xff0c;由于水平有限&#xff0c;译文中存在不少错误。 这些年&#xff0c;随着阅历的增长&#xff0c;在重读的时候偶尔也会有“…

动态规划c++

1. 什么是动态规划动态规划 &#xff08;英语&#xff1a;Dynamic programming&#xff0c;简称 DP&#xff09;&#xff0c;是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规…

ros2工作空间

我们先不管ros2工作空间是什么样子的&#xff0c;如果是我自己来搞一个工作空间&#xff0c;我一定是这样安排 一个文件夹用来放自己存放的文件&#xff0c;。。。。。。。。。。对应src文件夹 一个文件夹用来放编译后的文件&#xff0c;。。。。。。。。。。。对应intall文件…

天猫超市电商营销系统:无代码开发实现API连接集成

无代码开发实现天猫超市与电商系统的高效连接 天猫超市&#xff0c;作为天猫推出的网络零售超市&#xff0c;为广大网购消费者提供了一站式的购物服务。而通过无代码开发的方式&#xff0c;天猫超市能够实现与各种电商系统的连接和集成&#xff0c;这种方式无需进行繁琐的API开…

求二叉树中第i层和第i+1层叶子节点个数之和(可执行)

运行环境.cpp 注意&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;如果没有输出结果&#xff0c;一定是输入的建树序列有错误&#xff0c;我建好了2棵树&#xff0c;如果没有输出结果&#xff0c;大家可以用这两棵树试。 main函数的btDepth(t,2)第二个参数是树…