问题标签 [android-binder]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
26220 浏览

c - 什么是强指针和弱指针

我对“强指针”和“弱指针”的概念感到困惑。黛安哈克伯恩自己说:

当有强指针时,对象将保留在周围;一旦最后一个被释放,它就会被销毁。使用弱指针所能做的就是比较并尝试提升为强指针;如果对象上没有其他强指针,后者将失败。

这对我来说很不清楚。强指针是否等同于 ( boost::) 共享指针?如果弱指针只是为了尝试将自己提升为强指针,那么弱指针的作用是什么?比如,我们什么时候需要弱指针和强指针?

更新:

谢谢大家,但我是专门询问android的内核spwp,它们与Java的引用完全无关。

基本上我正在尝试破解这里的代码http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html 而且不太了解和的sp使用wp

更新:

实际答案在于接受答案的评论。感谢 Gabe Sechan:

强指针和弱指针是不同的智能指针实现并且做同样的事情——当指针超出范围时,只要至少有一个强指针引用它,它就不会被释放。如果只有弱指针(或什么都没有)引用它。每当对它的强或弱引用被描述时,就会进行检查。

如果我有 10 个引用同一个对象的弱指针,而这 10 个中的一个超出范围,那么该对象会被销毁吗?而使用强指针,只有当它们全部超出范围时,对象才会被销毁?

是的,差不多。如果您只有 10 个弱指针,那么当最后一个强指针超出范围时,它可能已经超出范围。如果有空闲内存,该实现可能允许它停留一段时间,但如果您进入低内存条件,它将被切断,并且听起来他们的实现不像她引用的那样先进。而这个的使用还是主要是缓存——大致相当于一个boost shared_ptr和boostweak_ptr。所以基本上,弱指针可以让它引用的对象随时消失。

0 投票
1 回答
3060 浏览

android - 在AOSP中,ServiceManager在哪里实现

IServiceManager.cpp文件中,我看到了BnServiceManager::onTransact函数定义。

在该函数内部,有一个对“ addService”、“ listServices”等的调用。

我找不到这些函数的实现(在 IServiceManager 下声明)。

有人可以告诉我,在哪里可以找到 BnServiceManager 的实现。

0 投票
1 回答
265 浏览

android - 为什么google在android camera中选择C/S架构?

众所周知,android camera是C/S架构,包括客户端和服务。它们通过 Binder 相互通信。他们在不同的进程中运行。

所以我有一个问题:为什么android相机有客户端和服务?有什么好处?

0 投票
1 回答
5085 浏览

java - 使用 AIDL (Android) 跨进程处理错误的推荐方法

我有一个活页夹服务和一个住在不同进程中的客户端。使用 AIDL,当客户端调用我的远程 binder 服务时,有时我需要将错误(异常)转发回客户端。

但是,据我了解,这是不可能的。我尝试从我的活页夹服务中抛出一个“RemoteException”,看看会发生什么,我得到了

未捕获的远程异常!(跨进程尚不支持异常。)

在我的日志中。

既然看起来这是不可能的,那么通知客户错误的最佳方法是什么?我在想我可以将我的 AIDL 转换为使用 C 风格的接口,在其中我只返回一个错误代码(成功时返回 0),但这看起来很难看。

有更好的方法吗?

0 投票
2 回答
4495 浏览

android - Android Binder 清除调用者身份

最近看Android源码,发现做一些BinderIPC调用时总是调用一对方法。我阅读了评论,但我无法清楚地知道根本原因。配对方法如下:

有谁知道那对方法的功能是什么?这似乎与许可有关。

0 投票
1 回答
243 浏览

android - 我应该使用多个证书签署 Android 应用程序还是什么?

我有一个使用私有 Android binder api(特别是 IWindowManager)的 Android 服务。当我将其构建为 Android 平台源代码的一部分并将其安装在设备上(我有 Uboot 访问权限等)时,它工作正常。
我不喜欢 GIT,所以我将 GIT 之外的服务移到了不同​​的版本控制中,我无法访问 android 源,但我可以使用 Android sdk 构建工具来构建它。
由于 IWindowManager 是隐藏的 api,sdk 构建系统使我的构建失败。我创建了一个单独的 android.jar,其中包含来自 sdk 的 android.jar 以及来自平台构建的 framework.jar。我为此使用了 dj-dex2jar。
我使用了一个自定义的 Ant 任务(即支持 Java ant 代码的 Ant taskdef)来更改 sdk 构建系统使用的引导类路径。现在我的服务使用 Android 构建工具构建,但使用的是我创建的自定义 android.jar。
当我在我们的设备上安装这个 apk 时,我在 IWindowManager 服务上调用 injectKeyEvent() 时发现它失败了。该服务拒绝来电,说我的应用没有 INJECT_INPUT 权限。这是预期的行为,因为我的应用不再是平台应用。
我可以访问平台密钥。一种选择是使用平台密钥对应用程序进行签名并开始执行。但这里有一个警告。我的应用程序还需要从一个内部应用程序访问 Binder 服务,该应用程序需要我们的发布密钥签名的应用程序。

我该如何解决这个问题?我喜欢我的服务能够调用要求它由平台密钥签名的绑定器调用,并且能够调用需要它由我们自己的发布密钥签名的绑定器调用。

有任何想法吗?

谢谢

0 投票
2 回答
192 浏览

android - putExtra:我应该如何处理大型数组?数据库或拆分为更小的阵列?

我想知道以下想法中的哪些内容会产生更多的句子:

我有三个超过 5'000 个条目的数组。当我尝试将它们放入 Extra 时,我变成了 FAILED BINDER TRANSACTION:

  1. 将这些大数组拆分成更小的数组,并通过 putExtra 将它们提供给下一个活动

  2. 将这些条目保存到数据库并使用 sqllite 和游标?

提前致谢!

0 投票
3 回答
6484 浏览

android - 通过 AIDL 在服务之间传递活动对象

我正在尝试为不同包中的多个服务共享一个公共对象。每个服务必须调用相同的对象。

例如,服务 A(来自 APK A)实例化了一个自定义对象,我希望服务 B 和 C(来自 APK B 和 C)检索该对象的引用并调用它的某些方法。

我在 Android 参考中发现使用Parcel应该是可能的:

活动对象

Parcel 的一个不同寻常的功能是能够读取和写入活动对象。对于这些对象,不会写入对象的实际内容,而是写入引用该对象的特殊标记。从 Parcel 中读回对象时,您不会获得该对象的新实例,而是获得一个句柄,该句柄对最初写入的完全相同的对象进行操作。有两种形式的活动对象可用。

Binder 对象是 Android 通用跨进程通信系统的核心设施。IBinder 接口描述了一个带有 Binder 对象的抽象协议。任何此类接口都可以写入 Parcel,并且在阅读时,您将收到实现该接口的原始对象或将回调通信回原始对象的特殊代理实现。使用的方法有 writeStrongBinder(IBinder)、writeStrongInterface(IInterface)、readStrongBinder()、writeBinderArray(IBinder[])、readBinderArray(IBinder[])、createBinderArray()、writeBinderList(List)、readBinderList(List)、createBinderArrayList() .

我试图通过 AIDL 传递我的对象(扩展活页夹)来做到这一点,但没有任何效果,当我试图从方法 createFromParcel(Parcel in) 检索引用时,我总是得到一个 ClassCastException。

我的代码示例:

有人已经这样做了吗?

提前致谢 !

0 投票
1 回答
2606 浏览

java - Android中如何正确升级AIDL接口?

我有两个应用程序:一个名为my-app.apk,另一个名为 my -service.apk。服务应用只定义了一个Android Service,它可以被主应用绑定以执行一些方法。这是使用 Android的 AIDL接口完成的,并且效果很好 - 到目前为止。

现在我想更改服务的界面,我想知道我需要注意什么。我将my-service.apk的文件 IRemote.aidl 更改为以下内容:

出于好奇,我将my-app.apk的 IRemote.aidl更改为以下内容(注意差异!):

现在我得到了一个完全出乎意料的结果:调用

从我的应用程序导致日志输出“11”。为什么??

  1. 我不会期望在 bindService() 调用中出现SecurityException,尽管这在具有完全不同接口的情况下就足够了。
  2. 在执行调用时,我所期望的是RemoteException,告诉我该方法不可用。
  3. 完全没想到的是,它只会以不同的数据作为参数调用不同的方法。虽然我可以从底层的角度理解。也许他们这样做是为了确保这个界面是高性能的......

所以这是我的问题:

  1. 最好的升级策略是什么?根本不删除/更改旧方法和顺序?
  2. 我注意到当my-service.apk升级(重新安装)时,该服务会丢失my-app.apk。通常,系统会重新安排服务,这通常会在崩溃时执行。如何确保my-app.apk再次获取服务?注意新安装的软件包?

预先感谢您的帮助!:-)

干杯,马克

0 投票
1 回答
186 浏览

java - 从活动通信到服务

我正在尝试与服务进行通信。我找到了这个Android 指南

我确实喜欢第一个示例,但我有一个错误:

“java.lang.RuntimeException:无法使用 Intent { cmp=com.example.internetcall/.MyService } 绑定到服务 com.example.internetcall.MyService@41763970:java.lang.NullPointerException:println 需要一条消息”。

这是活动:

这是我的服务:

有人知道这个问题的解决方案吗?

如果我犯了一些语法错误,我很抱歉,但我不太懂英语。