标签: android-binder

使用ParcelFileDescriptor.createPipe()将InputStream传输到另一个服务(跨进程边界),并使用"EBADF(错误的文件编号)"

我想通过使用ParcelFileDescriptor.createPipe()一个流到流的复制线程和一个ParcelFileDescriptor,将一个Android服务从一个Android服务"发送"到一个不同进程中运行的另一个服务,该表示管道的读取端,它被提供给另一个服务借助Binder IPC.

发送代码(流程A)

我想将一个给定的InputStream发送到接收服务:

public sendInputStream() {
    InputStream is = ...; // that's the stream for process/service B
    ParcelFileDescriptor pdf = ParcelFileDescriptorUtil.pipeFrom(is);
    inputStreamService.inputStream(pdf);
}
Run Code Online (Sandbox Code Playgroud)

ParcelFileDescriptorUtil是一个帮助器类,具有经典的java.io.流到流复制线程:

public class ParcelFileDescriptorUtil {

    public static ParcelFileDescriptor pipeFrom(InputStream inputStream) throws IOException {
        ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
        ParcelFileDescriptor readSide = pipe[0];
        ParcelFileDescriptor writeSide = pipe[1];

        // start the transfer thread
        new TransferThread(inputStream, new ParcelFileDescriptor.AutoCloseOutputStream(writeSide)).start();

        return readSide;
    }

    static class TransferThread extends Thread {
        final InputStream mIn;
        final OutputStream mOut;

        TransferThread(InputStream in, OutputStream …
Run Code Online (Sandbox Code Playgroud)

android ipc pipe android-service android-binder

12
推荐指数
1
解决办法
8031
查看次数

使用Binder从Native cpp应用程序中捆绑Intent

我试图从本机cpp代码调用一个intent.基本上,根据我的理解,我必须编写一个Parcel以匹配frameworks/base/core/java/android/app/ActivityManagerNative.java中的确切反序列化序列; 案例BROADCAST_INTENT_TRANSACTION.

到目前为止的进展是我已经在Java应用程序中收到了意图,但我对bundle有效负载有一些问题.我已经调试了Java应用程序,似乎它将int作为int读取而不是读取包含bundle的键的类型的int.

W/System.err( 1386): java.lang.RuntimeException: Parcel android.os.Parcel@71aa5c5: Unmarshalling unknown type code 6815843 at offset 12
W/System.err( 1386):    at android.os.Parcel.readValue(Parcel.java:2228)
W/System.err( 1386):    at android.os.Parcel.readArrayMapInternal(Parcel.java:2485)
W/System.err( 1386):    at android.os.BaseBundle.unparcel(BaseBundle.java:221
Run Code Online (Sandbox Code Playgroud)

这是使用的本机代码

#include <unistd.h>
#include <binder/IBinder.h>
#include <binder/IServiceManager.h>
#include <binder/Parcel.h>
#include <utils/String8.h>
#include <assert.h>

namespace android {

static const int BROADCAST_INTENT_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION + 13;

int send_intent()
{
    int NULL_TYPE_ID = 0;

    sp<IServiceManager> sm = defaultServiceManager();
    sp<IBinder> am = sm->checkService(String16("activity"));
    assert(am != NULL);

    Parcel data, reply;
    data.writeInterfaceToken(String16("android.app.IActivityManager"));
    data.writeStrongBinder(NULL);

    /*intent*/

    data.writeString16(String16("com.etc.etc.receiver")); /* action */ …
Run Code Online (Sandbox Code Playgroud)

c++ android android-intent android-binder

10
推荐指数
1
解决办法
722
查看次数

如何收听开发/粘合剂?

Androiddev/binder也是为层层沟通负责.是否可以收听消息?我知道它们必须被解码,但我怎么能得到这些消息.例如,如果应用程序发送消息成为地理位置.我也在我的Android设备上root.

android android-source android-binder

9
推荐指数
1
解决办法
4030
查看次数

Android服务可以提供两个与之通信的接口吗?

我有一个通过AIDL与其他服务进行通信的服务.我希望该服务受我的应用程序中的活动约束.该服务可以定义两个绑定器\接口吗?我已经尝试过使用信使与活动进行通信,重写"onBind"方法,以便根据获取的意图返回不同的绑定器(一个用于其他服务,一个用于活动).

但是当活动(使用相同的绑定器)从服务解除绑定时,我有一个错误"myService已泄漏ServiceConnection ...最初绑定在这里",我相信这是关于服务用来与其他人通信的绑定服务.
如果服务不能使用两个接口,我如何实现活动与该服务之间的通信?

谢谢你,-Liron

android aidl android-service messenger android-binder

9
推荐指数
1
解决办法
1936
查看次数

远程服务如何将消息发送到绑定的Activity?

我已经阅读了有关绑定服务文档,其中显示您可以轻松地通过消息从活动传递到远程(即不在相同的上下文中)服务但是有没有办法将消息从服务发送到绑定活动?例如,我的活动绑定到同一个应用程序的正在运行的后台服务,向它发送一条消息,一旦收到此消息,服务就会向活动回复一条消息.我该如何实现?你能指点我一些解释这个主题的文档吗?

android ipc android-service android-binder

8
推荐指数
2
解决办法
9600
查看次数

在AOSP中,ServiceManager实现在哪里

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

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

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

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

android android-source android-binder

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

Android ipc LocalSocket 与 Binder (AIDL)

我希望每个应用程序都能够向我的服务发送数据。因此我需要进程间通信。我能找到的每个页面都建议使用 Messenger、AIDL 或 Intents (BroadcastReceiver)。到目前为止,我通过构建一些测试应用程序可以发现,BroadcastReceiver 非常慢,如果在while(true)循环内使用多个线程发送消息,消息可能会在没有通知的情况下丢失。AIDL 和 Messenger 不仅实现起来很复杂(需要服务,活页夹,...)而且可以提供奇怪的行为,例如当使用多线程发送时导致 RemoteException(!!!失败的 BINDER TRANSACTION !!!)与 AIDL 就在使用 oneway 关键字。我想确保交货有保障。oneway在应该保证交货的情况下甚至有理由使用吗?

尽管如此,LocalSocket 似乎非常易于使用(不需要服务,就像 java socket 一样工作)。客户端应用程序只需打开一个 LocalSocket,连接到提供的地址,然后while(true) outputstream.writeObject();

使用 LocalSocket 时是否有任何缺点,因为 android 开发人员页面说“某些应用程序尝试使用传统的 Linux 技术(例如网络套接字和共享文件)来实现 IPC。我们强烈建议您改用 Android 系统功能进行 IPC”,但没有进一步评论在这

multithreading android ipc aidl android-binder

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

Binder课程做什么?Binding是什么意思?在Android有界服务?

我完全与Bounded Services混淆.我的问题是: - Binding是什么意思?Binder课程做什么?从服务返回iBinder对象是什么意思?什么是IBinder对象?onBind方法的工作原理是什么?这些是关于有界服务的几个问题.请详细解释我.我已经阅读了这些文件.目前还不清楚.

android android-service android-binder

7
推荐指数
2
解决办法
4360
查看次数

Android throw DeadObjectException:小包裹交易失败;远程进程可能只是在华为 Android 8.0.0 中死亡

1804-11 09:43:24.482 22968 22968 E CrashHandler: In thread: Thread[main,5,main]
1904-11 09:43:24.482 22968 22968 E CrashHandler: UncaughtException detected: java.lang.IllegalStateException: Failure reading AssistStructure data: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died
2004-11 09:43:24.482 22968 22968 E CrashHandler: at android.os.Parcel.readException(Parcel.java:1953)
2104-11 09:43:24.482 22968 22968 E CrashHandler: at android.os.Parcel.readException(Parcel.java:1891)
2204-11 09:43:24.482 22968 22968 E CrashHandler: at android.app.IActivityManager$Stub$Proxy.reportAssistContextExtras(IActivityManager.java:7637)
2304-11 09:43:24.482 22968 22968 E CrashHandler: at android.app.ActivityThread.handleRequestAssistContextExtras(ActivityThread.java:3483)
2404-11 09:43:24.482 22968 22968 E CrashHandler: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2125)
2504-11 09:43:24.482 22968 22968 E CrashHandler: at android.os.Handler.dispatchMessage(Handler.java:108) …
Run Code Online (Sandbox Code Playgroud)

java android exception android-binder deadobjectexception

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

如何将Binder(mybinder.org)与私有Github存储库一起使用?

在检查了这个确切的问题(https://github.com/jupyterhub/binderhub/issues/237)之后,似乎已经通过合并的合并请求(https://github.com/jupyterhub/binderhub/)实现了此功能。拉/ 671)。

但是我似乎在文档或其他地方找不到指导来解释应该在secrets.yml文件中输入的内容,或者是否需要其他步骤才能将Binder与私有Github存储库结合使用(如果我错过了显而易见的-完整的Binder noobie,我们深表歉意)这里)

链接到原始问题中的同一个问题:https : //github.com/jupyterhub/binderhub/issues/237#issuecomment-462711995

github reproducible-research jupyter jupyter-notebook android-binder

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