跟面试官讲Binder(二)之关于AIDL的认识

android AIDL服务,2021网易Android高级面试题总结 92.static final int TRANSACTION_getQuote = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); 93.} 94.public double getQuote(java.lang.String ticker) throws android.os.RemoteException; 95.} 对于所生成的类,请注意以下几点。 在 AIDL 文件中定义的接口在生成的代码中实现为接口 (也就是说,有一个名为IStockQuoteS 阅读详情

面试官开口说:“听你刚才所说,在Android系统中,都是利用Binder来进行进程间通信的,那我怎么听说,还有利用AIDL来实现进程间通信的呢?”。

其实,AIDL只是一种描述性语言,其全称是Android Interface Definition Language,即接口定义语言,利用ADT,我们可将自定义的AIDL文件转化成Java代码,而这些代码就能够来进行进程间通信(IPC)。为什么这些代码就能够进行IPC呢?那是因为,这些代码就是定义了Binder机制中作为服务端的Binder对象和客户端中用的Proxy对象。

在前面的文章中,我们讲过,作为服务端的服务,会在本线程中创建一个Binder对象,并将其引用传递给Binder驱动,而客户端通过Binder驱动获得对应的Binder对象的引用时,其获得的其实是一个Proxy对象,然后其通过这个Proxy对象去跟驱动,再由驱动去跟服务端的Binder对象进行通信。

而通过AIDL生成的代码,我们就可以从代码的层面来帮助我们更好地理解关于Binder机制的作用了。

看来,面试变成了上机操作。。。

我们还是先写一份AIDL文件,定义一个接口和对应的方法。

首先,我为什么是定义接口呢?仔细想想,其实在不同的进程中进行通信,无非就是想使用彼此的服务,而服务的一个非常好的表现形式就是对接口编程,也就是说,我们只需要知道服务提供的名称是什么,需要什么参数,而具体服务端怎么实现,我们并不关心。当服务端改变了实现,它也只需要保持接口的一致性,就不会影响客户端的使用。

package com.lms.aidl;

import java.util.List;
import com.lms.aidl.Bean;

interface ITestService {

	List<Bean> getBean();
	
	void addBean(in Bean bean);
}

看起来很像Java中的接口嘛。

利用ADT插件,在Eclipse中会生成如下的java代码

/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: ...\\AidlServer\\src\\com\\lms\\aidl\\ITestService.aidl
 */
package com.lms.aidl;

public interface ITestService extends android.os.IInterface {
	/** Local-side IPC implementation stub class. */
	public static abstract class Stub extends android.os.Binder implements
			com.lms.aidl.ITestService {
		private static final java.lang.String DESCRIPTOR = "com.lms.aidl.ITestService";

		/** Construct the stub at attach it to the interface. */
		public Stub() {
			this.attachInterface(this, DESCRIPTOR);
		}

		/**
		 * Cast an IBinder object into an com.lms.aidl.ITestService interface,
		 * generating a proxy if needed.
		 */
		public static com.lms.aidl.IT
征服面试官:Binder 原理篇 掌握这篇面试题汇总,吊打面试官! Binder 是 Android 中的一种跨进程通信方式。从 Android Framework 角度来说 Binder 是 ServiceManager 连接各种 Manager(ActivityManager、WindowManager 等等)和相应 ManagerService 的桥梁;从 Android 应用层来说 Binder 是客服端与服务端进行通信的媒介。 1、什么是 Binder? 直观来说,Binder 是 Android 中的一个类,它继承了 IBinder 接口 从 IPC 角度来说 阅读详情

相关推荐

谈谈 Android 中对 Binder 的理解与小结

从面试角度理解 Binder

小羊子的技术专栏 821

征服面试官系列: Binder 核心机制和进程间通信,你都理解了吗?

说起Android的进程间通信,想必大家都会不约而同的想起Android中的Binder机制。而提起Binder,想必也有不少同学会想起初学Android时被Binder和AIDL支配的恐惧感。但是作为一个Android开发者,Binder是我们必须掌握的知识。因为它是构架整个Android大厦的钢筋和混凝土,连接了Android各个系统服务和上层应用。 只有了解了Binder机制才能更加深入的理解Android开发和Android Framework。这也是为什么无论是《Android开发艺术探索》还

A_pyf的博客 505

AIDL中oneway的三大陷阱:从Binder驱动看串行化处理的边界条件

本文从Binder驱动底层视角,深入剖析了Android AIDL中oneway关键字的三大陷阱。重点揭示了oneway调用在相同接口间的串行化处理机制、不同接口实例的并发边界,以及高频调用下可能触发的缓冲区限制与调用失败风险,为开发者设计健壮的跨进程通信提供了关键见解。

weixin_29266749的博客 66

Android资料!谈谈Android-Binder机制及AIDL使用,挥泪整理面经

一. 开发背景 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样。 面试部门 + 岗位:商业化 - 高级 Android 开发工程师 面试感想:整体面得比较累,基础面、交叉面、Boss面,前前后后对接了 6 个面试官 (离当初给我说的 3面+HR面 貌似差得有点远¬_¬) 。算法到 Boss 面都还在写,不过庆幸的是面试官没有为难我 (老实交代了算法没怎么准备,哎…),算法都不太难。整体项目比基础问得多。 面试建议:算法、基础是敲门砖,项目是试金石

fanzhang_vip0723的博客 454

Binder常见面试题

Binder是一种通用的进程间通信机制,而AIDL更像是一种对Binder的封装,提供了更方便的开发方式。Binder的线程池由Binder驱动维护,用于处理不同进程间通信的请求。:Binder通信中的事务合并指的是将多个小的事务合并成一个大的事务一起发送,从而减少通信次数,提高效率。服务端通过Binder注册自己的对象(Binder对象),客户端通过Binder获取服务端的引用。:Binder驱动在处理通信时会引入一定的开销,通过优化Binder驱动的相关参数,如增大缓冲区大小等,可以减小通信开销。

呆木弱鸡 1037

阿里面试必问:带你读懂Binder通信机制;拿捏面试官

阿里面试必问:带你读懂Binder通信机制;拿捏面试官

初一十五的博客 388

Android校招笔试题解析:从Handler到Binder,掌握核心机制与性能优化

在Android应用开发中,消息循环、跨进程通信和视图分发是构建稳定应用的基础。理解Handler与Looper的工作机制,掌握Binder的IPC原理,以及熟悉Activity启动流程和View事件分发,是校招笔试的高频考点。同时,内存泄漏、GC回收、线程池并发和Bitmap图片加载等性能优化问题,直接体现了工程师的工程实践能力。本文围绕一套Android校招笔试题,梳理其背后的知识体系与答题思路,帮助读者从原理层面系统复习,并应对实际开发中的复杂场景。

weixin_34314962的博客 300

Android-Binder机制及AIDL使用,终局之战

没有稳定的工作,只有稳定的能力。 又到了万物复苏的季节,在程序猿这个行当里,作为 Android 开发出生的,在经历了八年的脱发生涯后,有了越来越多的想法和感触 趋势 随着各类移动跨平台的兴起,在 ReactNative 、Flutter 、Weex 等框架的加持下,Android 开发的能力已不再局限于 Android 领域,而各大厂商近些年也针对跨平台的不足进行逐步完善: ReactNaitve 底层重构的新架构 Fabric,将管理器等往 C++ 迁移实现同步操作和性能优化; Flutter 1.

m0_56130999的博客 305

掌握 binder 机制?别想绕开 binder 驱动源码分析

作者:Android面试官 binder 是 Android 系统的进程间通信机制,是了解 Android 运行机制必须要掌握的一个知识点,更是一线企业面试必问的知识点!比如: binder 有什么优势?(字节) binder 一次拷贝原理?(腾讯) Intent 传递大数据限制?(阿里) AIDL 原理?(字节) 谈谈你对 binder 驱动的了解?(字节) 你都能回答上来吗!? 到底怎样才能彻底掌握 binder 机制、游刃有余的应对 binder 面试问题,让面试官对你刮目相看,斩获高薪 .

鸿蒙开发知识记录 438

Android校招笔试复盘:Handler、Binder与性能优化核心考点解析

在Android开发的知识体系中,系统底层机制始终是衡量工程师功底的试金石。Handler消息循环、Binder跨进程通信、View事件分发等概念,构成了应用与系统交互的基石,也决定了App在日常运行中的稳定性与流畅度。理解这些原理,不仅能帮助开发者写出更健壮的代码,还能在性能优化、多进程协作、复杂UI交互等场景中做出更合理的技术选型。从内存泄漏定位到ANR排查,从ContentProvider的URI解析到播放器架构设计,每一项能力都源于对基础机制的透彻掌握。对于准备校招或进阶的Android开发者而言,

weixin_34268169的博客 285

Android Framework面试核心:Binder机制与系统级问题排查

Binder机制作为Android系统进程间通信(IPC)的核心组件,其设计原理与性能优化是Framework工程师必须掌握的底层知识。从内核空间的Binder驱动实现到应用层的接口定义,理解线程池管理、数据传输优化等关键技术点,能够有效解决跨进程通信中的ANR、死锁等稳定性问题。在系统服务架构设计中,ActivityManagerService、WindowManagerService等核心模块的交互机制,以及Native崩溃分析、锁竞争检测等实战技能,都是大厂面试的高频考察方向。通过源码级深度剖析和真实

weixin_30522095的博客 410

安卓面经_安卓基础面全解析_Android面经(14/30)之AIDL全解析

如果需要实现跨进程通讯,AIDL是非常好的选择,在日常开发中接触到AIDL的机会非常多,个人在面试中暂时没被问过,但实际开发中无论是在应用程序中还是系统服务中,都使用过AIDL。我们看看面试官可能会问什么吧

a763450633的博客 780

大厂必考 Binder 底层:in/out/inout/oneway 关键字、IPC 性能差异满分解析

只要做 Android 开发,Binder 就是绕不开的底层核心:AMS、WMS、PMS、定位、推送、跨进程 SDK 全部依靠 Binder 完成进程通信。但绝大多数开发者只会简单写 AIDL 接口,被面试官追问三层源码、mmap 一次拷贝、oneway 异步、in/out 参数流向时频繁卡壳;线上出现 Binder 线程阻塞、DeadObject 崩溃、跨进程大数据卡顿也无法定位底层根源。市面上绝大多数 Binder 教程只停留在 Java 层 AIDL Demo 演示,极少完整串联。

郑伟强dev的专栏 145

中国移动中级Android面经:AIDL生成的Stub和Proxy、App启动优化与Binder机制为什么只需要一次拷贝

中国移动中级Android面试:在初级基础之上更看重原理深度与实战调优。咪咕视频的起播速度、掌厅的包体积、和包的支付安全都是能聊出深度的点。面试官喜欢从一道题往下挖到Framework。

郑伟强dev的专栏 46

微信小程序协同工作和发布

微信小程序协同工作和发布

qq_53114527的博客 1620

BIOS/UEFI完全指南:从开机自检到超频魔改的底层硬件控制

计算机启动过程始于固件层,其核心是负责硬件初始化与引导的系统软件。传统BIOS基于16位实模式,寻址能力有限,而现代UEFI采用保护模式,支持图形界面与安全启动,实现了从概念到架构的革新。这一演进带来了显著的技术价值:更快的启动速度、更强的安全性以及对大容量存储设备的原生支持。在工程实践中,无论是解决“虚拟化技术禁用”问题、调整内存XMP配置以提升性能,还是为老主板“魔改”添加NVMe支持,都需要深入理解并操作BIOS/UEFI设置。掌握这些底层交互能力,是进行硬件调试、系统优化与故障排查的关键,也是连接抽

weixin_34236869的博客 457

保姆级教程:在Zynq UltraScale+ EV系列FPGA上,用VCU IP核搞定4K60帧H265视频解码与HDMI2.0输出

本文提供在Zynq UltraScale+ EV系列FPGA上使用VCU IP核实现4K60帧H265视频解码与HDMI2.0输出的全流程指南。从开发环境准备、Vivado工程配置到PetaLinux系统定制,详细解析硬件选型、IP核参数设置及性能优化技巧,帮助开发者快速构建高效视频处理系统。

weixin_30800987的博客 432

【5G NB-IoT NTN】3GPP R17 NB-IoT NTN介绍_nbiot ntn

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!” />你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!

2401_83703866的博客 3165

关于 MCU 芯片外围电路的快速入门介绍

MCU 外围电路的核心是“围绕 MCU 需求,搭建稳定、匹配的外部支撑”,入门阶段无需掌握复杂设计,只需先吃透供电、复位、时钟、IO 驱动、基础通信这五大模块,再逐步扩展存储、显示、传感器等进阶功能。实践中多调试、多参考成熟方案,是快速掌握外围电路设计的关键。码字不易,若觉得本文对你有用,欢迎,相关技术热点时时看🔥🔥🔥​​​…

JiaWen的博客 1644

QT里获取UUID当做唯一文件名称

QT里获取UUID当做唯一文件名称

542

K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

🔴 K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2万+

【漏洞复现】Apache Tomcat远程代码执行漏洞(CVE-2024-56337)

CVE-2024-56337是一个存在于Apache Tomcat中的TOCTOU(Time-of-Check Time-of-Use)竞争条件漏洞。此漏洞源于对先前漏洞(CVE-2024-50379)的不完整修复。若默认servlet是可写的(参数readonly设置值为false,该设置为非默认设置)表示不区分大小写文件系统,在负载下并发读取和上传同一文件可以绕过Tomcat的大小写检查。攻击者可以通过构造恶意请求上传含恶意JSP代码的文件,使其触发解析并执行这些文件,从而导致远程代码执行。

李同學AI安全 3195

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: Android学习小Demo(22)带删除按钮的TextView
下一篇: Android学习小Demo(23)Aidl实现进程间通信
linmiansheng
博客等级 码龄20年 507粉丝 111原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值