当前位置: 首页 > 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

相关文章:

Android13 新增 Stable AIDL接口

问题描述: 我需要在netd aidl 中添加新的接口: 设置网卡MAC地址: void setHardwareAddress(in utf8InCpp String iface, in utf8InCpp String hwAddr); 背景: Android 10 添加了对稳定的 Android 接口定义语言 (AIDL) 的支持&…...

Postman API Enterprise 10.18.1 Crack

适合您企业的 Postman API 平台 掌控您的 API 环境。构建更好的 API。加快产品开发。 无论您处于 API 之旅的哪个阶段,Postman 都会为您提供帮助 想让您团队的 API 更容易被发现吗?希望减少开发和质量检查之间的滞后时间?想要更快地让新开发…...

电脑内存升级

ddr代兼容 自从DDR内存时代开启之后,只要满足内存的插槽规格相同(DDR3或DDR4或DDR5即为内存规格)这一条件,不同品牌、不同频率以及不同容量的茶品都可以一起使用,除了品牌和容量的影响之外,不同频率的搭配可能会造成性能方面的影…...

ExcelBDD PHP Guideline

在PHP里面支持利用Excel的BDD,也支持利用Excel进行参数化测试 ExcelBDD Use Excel file as BDD feature file, get example data from Excel files, support automation tests. Features The main features provided by this library are: Read test data acco…...

C++静态链接库的生成以及使用

目录 一.前言二.生成静态链接库三.使用静态链接库四.其他 一.前言 这篇文章简单讨论一下VS如何生成和使用C静态链接库,示例使用VS2022环境。 二.生成静态链接库 先创建C项目-静态库 然后将默认生成的.h和.cpp文件清理干净,当然你也可以选择保留。 然…...

【2024系统架构设计】 系统架构设计师第二版-未来信息综合技术

目录 一 信息物理系统 二 人工智能 三 机器人技术 四 边缘计算 五 数字孪生体...

JavaFX修改软件图标

JavaFX默认使用jdk的程序图片显示,可以通过以下代码进行修改设置 stage.getIcons().add(new Image("static/icon.png")); static/icon.png改为自己图片路径 这里可以使用相对路径和绝对路径,看自己需求设置 例: import javafx.a…...

Linux ps -ef|grep去除 grep --color=auto信息

linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep...

jQuery的学习(一篇文章齐全)

目录 Day29 jQuery 1、jQuery介绍 2、jQuery的选择器 2.1、直接查找 2.2、导航查找 3、jQuery的绑定事件 案例1:绑定取消事件 案例2:模拟事件触发 4、jQuery的操作标签 tab切换案例jQuery版本: 案例1: 案例2&#xff…...

注塑行业各类业务流程图(系统化)

...

Android Studio 安装及使用

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...

计算机网络的OSI七层模型

目录 1、OSI七层模型是什么 1.1 物理层(Physical Layer) 1.2 数据链路层(Data Link Layer) 1.3 网络层(Network Layer) 1.4 传输层(Transport Layer) 1.5 会话层(S…...

如何一次性解压多个文件

第一步:多选压缩包 第二步:右键解压即可 一句话,单个怎么解压,多个就怎么解压,只不过先选中 参考:如何一次性解压多个文件...

类和对象学习笔记

类和对象 类的定义this指针类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载赋值运算符重载运算符重载const成员 取地址操作符重载const取地址操作符重载 初始化列表explicit关键字static成员匿名对象友元内部类拷贝对象时编译器的优化 类的定义 c类的定义形式…...

Linux程序之可变参数选项那些事!

一、linux应用程序如何接收参数? 1. argc、argv Linux应用程序执行时,我们往往通过命令行带入参数给程序,比如 ls /dev/ -l 其中参数 /dev/ 、-l都是作为参数传递给命令 ls 应用程序又是如何接收这些参数的? 通常应用程序都…...

【1day】泛微e-office OA系统user_page接口未授权访问漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...

Midjourney绘画提示词Prompt参考教程

Midjourney绘画提示词Prompt参考教程:无需魔法使用。 一、AI工具 SparkAi: SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常…...

Altium Designer学习笔记6

原理图库的制作,SMA元件的制作: 图形不是很重要,重要的是管脚的功能。 Design Item ID和Designator两个值是要注意的。 进行Place放置,切换到原理图工作区,测试下功能。 AD9851元件库制作: 不需要再新建原…...

【问题解决】Maven密码加密

普通的maven部署方式是把maven私服的账号密码以明文的方式配置在settings.xml文件中 <server><id>deploymentRepo</id><username>xxx</username><password>123</password></server> 这种方式的配置很容易被别人看到从而泄漏…...

vue3基于vite打包

大的js和css打包成&#xff1a;gzip npm install vite-plugin-compression 在vite.config.ts中配置&#xff1a; import viteCompression from vite-plugin-compressionplugins:[viteCompression({verbose:true,//控制台输出压缩结果disable:false,//开启还是禁用threshold:…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...