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

江苏弘仁建设有限公司网站高端定制网站建设

江苏弘仁建设有限公司网站,高端定制网站建设,百度联盟一天多少收入,上海网络营销推广服务文章目录 AIDL的原理构建AIDL的流程往冻结的AIDL中加接口 AIDL的原理 可以利用ALDL定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为进行通信&a…

文章目录

      • AIDL的原理
      • 构建AIDL的流程
      • 往冻结的AIDL中加接口

AIDL的原理

可以利用ALDL定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象。编写执行该编组操作的代码较为繁琐,因此 Android 会使用 AIDL 为您处理此问题。

AIDL 可以理解成是一个范式, 通过这个范式编写接口文件, 然后利用Android的AIDL工具 会生成继承binder所需要能力的头文件。

构建AIDL的流程

以automotive的audiocontrol模块为例

  1. 编写AIDL接口文件,编写Android.bp, 通过AIDL 生成头文件
    其aidl的文件位于下面的目录
hardware/interfaces/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/

编译会在下面的目录生成实现binder通信的接口文件。
接口文件有java cpp ndk三种类型。 使得能够被不同的客户端和服务端的代码引用到。

out/soong/.intermediates/hardware/interfaces/automotive/audiocontrol/aidl/android.hardware.automotive.audiocontrol-V2-cpp-source/gen/include/android/hardware/automotive/audiocontrol$ ls
AudioFocusChange.h    BnFocusListener.h     BpDuckingInfo.h    IAudioControl.h
BnAudioControl.h      BnMutingInfo.h        BpFocusListener.h  IFocusListener.h
BnAudioFocusChange.h  BpAudioControl.h      BpMutingInfo.h     MutingInfo.h
BnDuckingInfo.h       BpAudioFocusChange.h  DuckingInfo.h
  1. 实现service,实现service对应的bin,以及rc,注册服务到servicemananger
    AudioContro 实现的demo bin位于hardware/interfaces/automotive/audiocontrol/aidl/default
    目录下,编译会生成
    android.hardware.automotive.audiocontrol-service.example这样的bin 这个bin在 audiocontrol-default.rc 中启动。
    当然服务端的是 就是把audiocontrol的服务注册到servicemanger中。
    std::shared_ptr<AudioControl> audioControl = ::ndk::SharedRefBase::make<AudioControl>();const std::string instance = std::string() + AudioControl::descriptor + "/default";binder_status_t status =AServiceManager_addService(audioControl->asBinder().get(), instance.c_str());CHECK_EQ(status, STATUS_OK);

服务的名字在audiocontrol-default.xml中定义为
android.hardware.automotive.audiocontrol.IAudioControl/default

  1. 实现client,获取service,调用service相关的接口。

clinet 端 主要是通过名字从serviceManager 中获取到audioControl的服务。然后通过服务调用其接口。
如下通过getService 获取服务,然后通过名字获取IAudioControl对象。然后就可以调用其函数了

    private static final String AUDIO_CONTROL_SERVICE ="android.hardware.automotive.audiocontrol.IAudioControl/default";private IBinder mBinder;private IAudioControl mAudioControl;private boolean mListenerRegistered = false;private AudioControlDeathRecipient mDeathRecipient;static @Nullable IBinder getService() {return Binder.allowBlocking(ServiceManager.waitForDeclaredService(AUDIO_CONTROL_SERVICE));}AudioControlWrapperAidl(IBinder binder) {mBinder = Objects.requireNonNull(binder);mAudioControl = IAudioControl.Stub.asInterface(binder);}IBinder binder = AudioControlWrapperAidl.getService();
if (binder != null) {return new AudioControlWrapperAidl(binder);
}@Overridepublic void onAudioFocusChange(@AttributeUsage int usage, int zoneId, int focusChange) {if (Slogf.isLoggable(TAG, Log.DEBUG)) {Slogf.d(TAG, "onAudioFocusChange: usage " + usageToString(usage)+ ", zoneId " + zoneId + ", focusChange " + focusChange);}try {String usageName = usageToXsdString(usage);mAudioControl.onAudioFocusChange(usageName, zoneId, focusChange);} catch (RemoteException e) {throw new IllegalStateException("Failed to query IAudioControl#onAudioFocusChange", e);}}

往冻结的AIDL中加接口

按照Android规则来说 发布之后的AIDL接口是不能修改的。 有相应的Freeze AIDL APIs处理。 从提交记录看 freeze 的操作是加hash值。

diff --git a/automotive/audiocontrol/aidl/Android.bp b/automotive/audiocontrol/aidl/Android.bp
index 7a947d3ab..4acfd82d6 100644
--- a/automotive/audiocontrol/aidl/Android.bp
+++ b/automotive/audiocontrol/aidl/Android.bp
@@ -19,4 +19,5 @@ aidl_interface {
sdk_version: "module_current",
},
},
+ versions: ["1"],
}
diff --git a/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/1/.hash b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/1/.hash
new file mode 100644
index 000000000..c4bb36b47
--- /dev/null
+++ b/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/1/.hash
@@ -0,0 +1 @@
+ba2a7caca61683385b3b100e4faab1b4139fc547

看提交记录加接口的地方:

  1. /aidl/android/hardware/automotive/audiocontrol/IAudioControl.aidl
  2. /aidl/default/AudioControl.h
  3. /aidl/default/AudioControl.cpp
diff --git a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/IAudioControl.aidl b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/IAudioControl.aidl
index 4b03af11a..3a0224557 100644
--- a/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/IAudioControl.aidl
+++ b/automotive/audiocontrol/aidl/android/hardware/automotive/audiocontrol/IAudioControl.aidldiff --git a/automotive/audiocontrol/aidl/default/AudioControl.cpp b/automotive/audiocontrol/aidl/default/AudioControl.cpp
index 748947cb2..b076d0128 100644
--- a/automotive/audiocontrol/aidl/default/AudioControl.cpp
+++ b/automotive/audiocontrol/aidl/default/AudioControl.cppdiff --git a/automotive/audiocontrol/aidl/default/AudioControl.h b/automotive/audiocontrol/aidl/default/AudioControl.h
index cf5694762..ab0b1b305 100644
--- a/automotive/audiocontrol/aidl/default/AudioControl.h
+++ b/automotive/audiocontrol/aidl/default/AudioControl.h
  • 出现AIDL修改报错
Above AIDL file(s) has changed and this is NEVER allowed on a release platform
(i.e., PLATFORM_VERSION_CODENAME is REL). If a device is shipped with this
change by ignoring this message, it has a high risk of breaking later when a
module using the interface is updated, e.g., Maineline modules.
11:47:01 ninja failed with: exit status 1

报错的原因解释:
stability :此接口的稳定性承诺的可选标志。目前仅支持"vintf" 。如果未设置,则对应于在此编译上下文中具有稳定性的接口(因此此处加载的接口只能与一起编译的东西一起使用,例如在 system.img 上)。如果将其设置为"vintf" ,则这对应于稳定性承诺:接口必须在使用期间保持稳定。

解决: 所有的AIDL有关地方的接口都要增加。

  • 出现hash校验错误:
hardware/interfaces/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocont FAILED: out/soong/.intermediates/hardware/interfaces/automotive/audiocontrol/aidl/android.hardware.automotive.audiocontrol-api/checkhash_1.timestamp if [ $(cd 'hardware/interfaces/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/1' && { find ./ -name "*.aidl" -print0 | LC_ALL=C sort -z | xargs -0 sha1sum && echo latest-version; } | sha1sum | cut -d " " -f 1) = $(read -r <'hardware/interfaces/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/1/.hash' hash extra; printf %s $hash) ]; then touch out/soong/.intermediates/hardware/interfaces/automotive/audiocontrol/aidl/android.hardware.automotive.audiocontrol-api/checkhash_1.timestamp; else cat 'system/tools/aidl/build/message_check_integrity.txt' && exit 1; fi ############################################################################### # ERROR: Modification detected of stable AIDL API file # ############################################################################### Above AIDL file(s) has changed, resulting in a different hash. Hash values may be checked at runtime to verify interface stability. If a device is shipped with this change by ignoring this message, it has a high risk of breaking later when a module using the interface is updated, e.g., Mainline modules. 16:41:52 ninja failed with: exit status 1

错误原因:

构建过程未能验证 AIDL 文件的哈希值,表明发生了修改。
哈希检查脚本:bash

if [ $(cd 'hardware/interfaces/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/1' && { find ./ -name "*.aidl" -print0 | LC_ALL=C sort -z | xargs -0 sha1sum && echo latest-version; } | sha1sum | cut -d " " -f 1) = $(read -r <'hardware/interfaces/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/1/.hash' hash extra; printf %s $hash) ]; then touch out/soong/.intermediates/hardware/interfaces/automotive/audiocontrol/aidl/android.hardware.automotive.audiocontrol-api/checkhash_1.timestamp; else cat 'system/tools/aidl/build/message_check_integrity.txt' && exit 1; fi

这是检查 AIDL 文件哈希值是否与预期哈希值匹配的脚本。如果哈希值匹配,构建过程将继续进行;否则,将引发错误。错误消息:makefile
ERROR: Modification detected of stable AIDL API file

  • 修改hash值。
    根据报错的提交脚本。使用下面的脚本在对应的目录下生成hash 值, 将这个hash值替换到.hash文件即可
    目录hardware/interfaces/automotive/audiocontrol/aidl/aidl_api/android.hardware.automotive.audiocontrol/1
{ find ./ -name "*.aidl" -print0 | LC_ALL=C sort -z | xargs -0 sha1sum && echo latest-version; } | sha1sum | cut -d " " -f 1
  • 出现这个错误

Android will be dropped but finished with status UNKNOWN_TRANSACTION
需要push 所有system/lib底下有关的audiocontrol的so、

使用版本化接口接口方法在运行时,当尝试在旧服务器上调用新方法时,新客户端会收到错误或异常,具体取决于后端。
cpp后端获取::android::UNKNOWN_TRANSACTION 。
ndk后端获取STATUS_UNKNOWN_TRANSACTION 。
java后端获取android.os.RemoteException并显示一条消息,说明 API 未实现。

总结: 在冻结的AIDL接口上面加新的接口 需要做的步骤。 但是强烈不建议这么做,可以自己单独实现一个AIDL接口、AIDL的服务、以及上层的实现

  1. 修改AIDL文件 添加接口
  2. 计算Hash,修改hash 值
  3. 编译push 生成的so
  4. 在应用上层获取服务就可以调用到新的接口了。
http://www.hengruixuexiao.com/news/25663.html

相关文章:

  • 网络推广软件排行windows优化大师官方
  • 中国建设银行网站公积金查询余额高端大气网站建设
  • 如何解决网站访问拥挤百度快照怎么使用
  • 做企业网站设计乌海网站seo
  • 怎么做网站教程 用的工具广告软文营销平台
  • 网站制作小工具西安网红
  • vue webpack 做网站seo商城
  • 东莞长安网站公司怎么弄推广广告
  • 宜宾金农投资建设集团网站百度代理公司
  • 制作网站培训上海网络营销seo
  • linux 配置网站域名百度seo培训要多少钱
  • 网站建设产品编辑的工作内容最佳bt磁力猫
  • 运城云起时网站建设北京优化网站建设
  • 梨树做网站seo如何优化排名
  • 重庆宣传片seo关键词排名优化怎么收费
  • 怎么建设公司小程序网站2020最近的新闻大事10条
  • 政府网站普查 怎么做深圳外贸seo
  • 衡水网站网站建设网站创建的流程是什么
  • 南通网站制作维护免费推广自己的网站
  • 购物手机网站建设今日新闻摘抄二十条
  • 做游戏网站需要多少钱seo的优化方向
  • 推荐一个代做毕业设计的网站免费seo网站诊断免费
  • 西安学校网站建设费用短视频推广引流方案
  • 杭州亚运会网页设计作业seo 的作用和意义
  • 网站建设平台有哪些湖南关键词网络科技有限公司
  • 百度一下做网站百度网址提交入口平台
  • 烟台违建举报网站关键词seo优化
  • c 网站开发面试题google下载手机版
  • 网站建设的原则有哪些方面渠道推广平台
  • 网站建设费入什么科目微信推广多少钱一次