- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在做一个项目,我们向 android 系统添加了一些非标准的安全功能,但我在调整 Binder 时遇到了一些严重的问题。
有没有人对Binder系统有很深的了解,知道Binder为什么会“阻塞”一个传递Parcel的进程,接收进程又是如何解阻塞的?
最佳答案
这是 Android 文档中所说的预期行为: http://developer.android.com/reference/android/os/IBinder.html
The key IBinder API is transact() matched by Binder.onTransact(). These methods allow you to send a call to an IBinder object and receive a call coming in to a Binder object, respectively. This transaction API is synchronous, such that a call to transact() does not return until the target has returned from Binder.onTransact(); this is the expected behavior when calling an object that exists in the local process, and the underlying inter-process communication (IPC) mechanism ensures that these same semantics apply when going across processes.
观察通知 API。我们进行一些调用,以便最终获得对 NotificationManager 对象的引用。有了这个对象,我们调用 notify(...);
117 public void notify(String tag, int id, Notification notification)
118 {
119 int[] idOut = new int[1];
120 INotificationManager service = getService();
121 String pkg = mContext.getPackageName();
122 if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")");
123 try {
124 service.enqueueNotificationWithTag(pkg, tag, id, notification, idOut);
125 if (id != idOut[0]) {
126 Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]);
127 }
128 } catch (RemoteException e) {
129 }
130 }
此调用与您的流程同步,并将在以下调用中产生结果:
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
38 {
39 switch (code)
40 {
...
46 case TRANSACTION_enqueueNotification:
47 {
48 data.enforceInterface(DESCRIPTOR);
49 java.lang.String _arg0;
50 _arg0 = data.readString();
51 int _arg1;
52 _arg1 = data.readInt();
53 android.app.Notification _arg2;
54 if ((0!=data.readInt())) {
55 _arg2 = android.app.Notification.CREATOR.createFromParcel(data);
56 }
57 else {
58 _arg2 = null;
59 }
60 int[] _arg3;
61 _arg3 = data.createIntArray();
62 this.enqueueNotification(_arg0, _arg1, _arg2, _arg3);
63 reply.writeNoException();
64 reply.writeIntArray(_arg3);
65 return true;
66 }
67 case TRANSACTION_cancelNotification:
68 {
...
169return super.onTransact(code, data, reply, flags);
170}
看到对 this.enqueueNotification 的调用了吗?
public void enqueueNotification(java.lang.String pkg, int id, android.app.Notification notification, int[] idReceived) throws android.os.RemoteException
188{
189android.os.Parcel _data = android.os.Parcel.obtain();
190android.os.Parcel _reply = android.os.Parcel.obtain();
191try {
192_data.writeInterfaceToken(DESCRIPTOR);
193_data.writeString(pkg);
194_data.writeInt(id);
195if ((notification!=null)) {
196_data.writeInt(1);
197notification.writeToParcel(_data, 0);
198}
199else {
200_data.writeInt(0);
201}
202_data.writeIntArray(idReceived);
203mRemote.transact(Stub.TRANSACTION_enqueueNotification, _data, _reply, 0);
204_reply.readException();
205_reply.readIntArray(idReceived);
206}
207finally {
208_reply.recycle();
209_data.recycle();
210}
211}
现在方法(来自 IBinder)mRemote.transact(Stub.TRANSACTION_enqueueNotification, _data, _reply, 0);会做魔术。根据 Parcel 类的文档:
A Parcel can contain both flattened data that will be unflattened on the other side of the IPC (using the various methods here for writing specific types, or the general Parcelable interface), and references to live IBinder objects that will result in the other side receiving a proxy IBinder connected with the original IBinder in the Parcel.
所以一旦对方收到序列化后的数据,就会做出相应的响应。因此,由于系统设计,它阻止了调用过程,让开发更加连续,不增加应用程序开发的复杂性和一致性。接收进程未被阻塞,它是一个 Activity 的 IBinder 对象,其线程之一将响应请求。现在,如果该对象在繁重的开销下工作,它可能会在回答之前阻塞很长时间。因此,如果您打算与忙碌的人交谈,请确保您有一个助手可以一直等待回复(也许是另一个线程)。
\o/
关于Android Binder 内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12509418/
我有一个自定义模型绑定(bind)器,它会为进入操作方法的特定参数调用: public override ActionResult MyAction(int someData, [ModelBinde
我正在尝试从服务下载图像并将其显示在 Activity 中,但我不断收到 java binder FAILED BINDER TRANSACTION 这是我的服务代码 public class Do
我有下一个问题,我正在创建自定义适配器的 ListView ,我正在使用异步任务从 JSON url(文本和图像 url)下载适配器的数据,然后我将适配器设置为列表,我使用毕加索库下载图像,现在我的应
我正在尝试将一个 UI 活页夹小部件包含到另一个小部件中:我正在使用 UI 活页夹构建一个表单,并希望包含一个也使用 UI 活页夹完成的精美按钮。有谁知道如何做到这一点? 谢谢! 最佳答案 是的,这是
我收到这个错误: Attempt to invoke interface method 'android.os.IBinder com.mediatek.anrappmanager.IFramewor
我想问一下有什么区别 bindConstant().annotatedWith(Names.named("keepAliveInterval")).to(60); 和 bind(Integer.TYP
我的应用程序已编译,然后在我的手机中安装 apk 时弹出窗口询问我新安装将卸载以前的版本,然后安装新版本。我点击了确定,但过了一会儿它显示了这个错误:- 01/14 10:43:22: Launchi
谁能告诉我这是什么意思? 一切都很好,我没有改变任何东西,只是发生了,这是 Binder 565 中的代码: try { res = onTransact(code, data, reply,
我的项目 application.properties 发出警告。说 'spring.cloud.stream.kafka.binder.jaas.loginModule' is an unknown
我读了一篇关于 android 的 Binder 的文章。文章说进程交换共享内存中的对象引用并且它比编码和解码更有效......但实际上IPC机制中是否存在编码和解码?我有点困惑... 谁能解释绑定(
在与 Oleg 讨论期间对问题进行了大量编辑 我正在尝试在 Spring Cloud Stream 中实现 BigQuery 的绑定(bind)器。 完整的应用程序代码可在GitHub上获取. 到目前
我有一个 Android Java 服务,它通过 Binder (AIDL) 与 native 进程交互。 我看到该服务列在“adb shell 服务列表”下。我也可以使用“adb shell ser
我创建了一个在单独进程中运行的服务 我读过,当服务作为单独的进程进行时,它是在一个单独的线程上而不是在主线程上。当我在服务中执行 HTTP 请求时,出现异常:Thread forbids Http
Android ContentProvider 使用“绑定(bind)线程”池来处理 RPC,例如 query、insert 和 call。在我的 ContentProvider 实现中,我正在执行一
我正在尝试阅读Android源代码来了解binder,但我无法找到Android系统架构中描述的binder驱动程序部分。知道 Binder 代码位于 Android 源代码中的什么位置吗? 最佳答案
08-27 22:17:20.980: INFO/AndroidRuntime(299): 注意:线程 'Binder Thread #3' 的附加失败这是 LogCat 信息,请帮助我。 最佳答案
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我已经用我的界面定义了一个 AIDL 文件。像这样: interface IResPlugin { int discoverType(); Map onClick( in int id
我正在做一个项目,我们向 android 系统添加了一些非标准的安全功能,但我在调整 Binder 时遇到了一些严重的问题。 有没有人对Binder系统有很深的了解,知道Binder为什么会“阻塞”一
我想我追踪到了内存泄漏,并想确认我认为 Android 的 Binder 是如何实现的。在这种情况下,我有一个服务和一个 Activity ,每个都在自己的进程中。我创建了一个 AIDL,它允许我通过
我是一名优秀的程序员,十分优秀!