标签: android-binder

在AOSP中,ServiceManager实现在哪里

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

在该功能内部,有一个" addService"," listServices"等的调用.

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

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

android android-source android-binder

7
推荐指数
1
解决办法
2488
查看次数

如何检查两个Android绑定代理对象是否相等?

我对Android的活页夹有疑问.如果我理解正确,可以在进程之间传递Binder.在服务端,有一个Binder对象(原始对象).在客户端(在单独的过程中),有一个处理AIDL数据编组的BinderProxy对象.

我的问题是 - 如何检查两个BinderProxy对象是否相等?我的意思是,它们在服务过程中引用相同的Binder对象.我们可以使用equals()方法吗?BinderProxy对象与原始Binder对象具有相同的内存地址吗?

谢谢!

编辑:

回应David Wasser的评论:

我需要这样做的原因很难解释,但让我看看我是否可以清楚地解释它 -

远程服务提供AIDL API(客户端通过在onServiceConnected中接收IBinder获得).除其他外,AIDL API包含两种方法 -

IBinder getInterface(String interfaceName);

void releaseInterface(IBinder binder);

这个想法是客户端应用程序可以为不同接口的绑定器请求远程服务.接口实现的dex代码及其绑定器动态加载到服务中,并且事先不知道.该服务为客户端应用程序提供这两种AIDL方法,以根据接口名称访问这些动态加载的接口绑定器.

所以说有App1和App2.每个都做'binder1 = getInterface("SomeInterface1");' 并获取动态加载的接口'SomeInterface1'的绑定器.使用它之后,应用程序通过说'releaseInterface(binder1);'来释放界面活页夹.这样服务就可以卸载接口的dex代码并进行一些清理.

然而,接口DEX代码不能被卸载,除非这两个应用1和应用2已经发布了接口粘合剂.因此,在服务中,我为每个动态加载的绑定器维护引用计数.(说一个Map键{Binder} ==> value {reference count}).当App执行getInterface()时,我会增加引用计数.当它确实是releaseInterface(binder1)时,我应该减少引用计数.但是,为此,我需要检查binder1是否等于Map中的binder键.

请注意,绑定程序已从服务(原始绑定程序对象)传递到客户端应用程序(由getInterface()返回的绑定程序代理)并再次返回到服务(作为releaseInterface()的参数 - 它是否仍然是代理,或者原本的??).

App1和App2可以为相同的接口名称获取不同的绑定器对象(接口的不同实现).这就是为什么我用粘合剂释放的原因.

希望这不是太混乱!谢谢您的帮助.

卡尔蒂克

android android-binder

6
推荐指数
1
解决办法
2239
查看次数

确定BroadcastReceiver中Intent的来源

我正在寻找一种方法来确定发送的应用程序Intent.目前,我已经注册了BroadcastReceiver并且一直在尝试使用Binder.getCallingPid,但它通常会返回我的应用程序的PID.我觉得奇怪的是通常的部分,我的应用程序偶尔得到发送的应用程序的PID Intent,但它不常见,我似乎无法确定这是真的条件.

有没有办法准确确定哪个应用程序发起了呼叫BroadcastReceiver.onReceive

@Override
public void onReceive(Context context, Intent intent) {
    Log.d("Receiver", "Sender's PID: " + Binder.getCallingPid());
}
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-intent android-binder

6
推荐指数
0
解决办法
493
查看次数

带信使或AIDL的快速IPC

我正在尝试在Android中创建一个程序,它与远程服务(约40,000 /秒)快速通信,但是所有Android IPC似乎都无法完成此任务.我的第一次尝试涉及一个标准的Messenger系统,它不能超过~2,000 /秒,同样糟糕的是它似乎间断延迟.

MainActivity(使用信使测试)

public class MainActivity extends Activity implements ServiceConnection{

    Messenger mServiceMessenger;
    Messenger mClientMessenger = new Messenger(new ClientHandler());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this,TestService.class);
        bindService(intent,this, Context.BIND_AUTO_CREATE);
    }


    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mServiceMessenger = new Messenger(service);
        Message m = Message.obtain();
        m.replyTo = mClientMessenger;
        try {
            mServiceMessenger.send(m);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {}

    public class ClientHandler extends Handler {
        @Override
        public …
Run Code Online (Sandbox Code Playgroud)

performance android ipc android-service android-binder

6
推荐指数
1
解决办法
949
查看次数

通过 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。

我的代码示例:

public class CustomObject extends Binder implements Parcelable {

  public CustomObject() {
    super();
  }

  public static final Parcelable.Creator<CustomObject> CREATOR = new Parcelable.Creator<CustomObject>() {
  public CustomObject createFromParcel(Parcel in) {
    IBinder i = in.readStrongBinder(); …
Run Code Online (Sandbox Code Playgroud)

android aidl android-service android-binder

5
推荐指数
1
解决办法
6338
查看次数

在Android中是否可以强制binder死亡?

我有一个 Binder,我将其发送到远程进程,该远程进程用于linkToDeath监视 Binder 何时终止。现在,当进程崩溃时,远程进程会收到回调,但是有没有办法可以在拥有 Binder 的一侧以编程方式触发 Binder 死亡而不崩溃?

android android-binder

5
推荐指数
0
解决办法
276
查看次数

Android系统对Binder Tokens的使用

我正在阅读这篇博文中有关在 Android 系统中使用 Binder 令牌的信息。我看到了与唤醒锁相关的示例,其中令牌用于识别来自同一应用程序的后续请求。

我想问一下为什么在Android系统UID中调用的应用程序不足以跟踪来自应用程序的后续请求?在识别应用程序方面,是否需要 Binder 令牌满足 UID 无法满足的需求?

android android-binder

5
推荐指数
1
解决办法
1034
查看次数

如何共享 Jupyter Notebook?

我正在使用 Julia,但不太喜欢 IDE(更像是笔记本电脑)。所以我第一次使用了 Jupyter(实验室和笔记本)。

我从 Anaconda 启动了 Jupyter 并制作了我的笔记本。问题是我想分享它。就像其他人一样可以访问链接并运行我的代码。

我真的不知道 GitHub 是如何工作的,但我设法将笔记本上传到那里。我看到了一个叫做“Binder”的东西,它可以在另一台计算机上运行我的代码。但我尝试将我的 Github 链接放在那里,却收到错误。

用过 Jupyter 的人可以给我解释一下吗?

啊,我差点忘了,当我用 google 搜索 Jupyter Notebook 并使用 Julia 启动一个时,我可以使用这个 Binder Thing。但当我自己做的时候,我却做不到。

这里我把我在 Jupyter+binder 的 Demo 上做的截图贴出来,大家可以看到上面写着发送活页夹链接

在此输入图像描述

julia ijulia-notebook jupyter-notebook android-binder

5
推荐指数
1
解决办法
3358
查看次数

Flutter:无法获取服务“vendor.vpsservice”的活页夹

Flutter 虚拟应用程序会产生问题。

我创建了一个新应用程序并在 Android 真实设备上运行它。它在终端上不断地向我展示一个问题,例如

Performing hot restart...                                               
Restarted application in 1,415ms.
E/VpsExtension( 3820): Failed to get binder for service "vendor.vpsservice"
E/VpsExtension( 3820): Failed to get binder for service "vendor.vpsservice"
E/VpsExtension( 3820): Failed to get binder for service "vendor.vpsservice"
E/VpsExtension( 3820): Failed to get binder for service "vendor.vpsservice"
E/VpsExtension( 3820): Failed to get binder for service "vendor.vpsservice"
E/VpsExtension( 3820): Failed to get binder for service "vendor.vpsservice"
E/VpsExtension( 3820): Failed to get binder for service "vendor.vpsservice"
E/VpsExtension( 3820): Failed to get …
Run Code Online (Sandbox Code Playgroud)

terminal performance vendor flutter android-binder

5
推荐指数
0
解决办法
938
查看次数

何时调用 Parcel.recycle()?

我必须和IBinders 和Parcels 一起工作。我已经浏览了所有IBinderBinderParcel文档,但找不到任何关于何时调用的内容Parcel.recycle(我也从未读过任何说 aparcel必须被回收的内容)。我见过类似下面的例子:

void someMethod(IBinder binder) {
  final int code = // ...
  final Parcel data = Parcel.obtain()
  final Parcel reply = Parcel.obtain()

  try {
    binder.transact(code, data, reply, 0);
  } finally {
    data.recycle();
    reply.recycle();
  }
}
Run Code Online (Sandbox Code Playgroud)

但令我困惑的是,在每个例子中,我都没有看到这一点:

class MyBinder extends Binder {
  @Override
  public boolean onTransact(int code, Parcel data, Parcel reply, int flags) {

    try {
      // do things...
    } finally {
      data.recycle(); …
Run Code Online (Sandbox Code Playgroud)

java android parcel android-binder

5
推荐指数
1
解决办法
294
查看次数