没有IPC的Android进程是不是默认有Binder线程池?

Posted

技术标签:

【中文标题】没有IPC的Android进程是不是默认有Binder线程池?【英文标题】:Does an Android process without IPC have a Binder thread-pool by default?没有IPC的Android进程是否默认有Binder线程池? 【发布时间】:2018-01-18 10:24:57 【问题描述】:

我知道 Binder 线程用于 IPC 和 Intent 等高级机制。但是如果一个应用程序不使用 IPC、Intents 或任何形式的 Binder 使用,那么它在创建进程时是否仍然默认拥有一个 Binder 线程池?

换句话说:绑定线程池在进程生命周期的哪个时间点被实例化? (默认在创建时或第一次 IPC 调用之前)

【问题讨论】:

你总是使用意图,即使你没有明确地创建它们。这是您的活动、服务或其他组件的启动方式。 IOW,请提供minimal reproducible example 展示“不使用 IPC、Intents 或任何形式的 Binder 使用”的应用程序。 【参考方案1】:

您的活页夹线程池是作为 libBinder 初始化的一部分自动创建的。具体来说,应用程序从 Zygote 派生并在 ActivityManager 上启动活动生命周期调用——这就是一个活页夹调用。低级调用使用 ProcessState 对象,这是一个单例,它在构造时调用 open_driver 并在此后不久设置线程池。从技术上讲,这更接近于第一次 IPC 调用 - 但需要强调的一点是,对于 App 组件(活动/服务/接收器/提供者),即使您没有显式调用 context.getSystemService(),也总会有这样的调用。

您可以自己查看(如果您的设备已植根):

试试 ls -l /proc/$pid/fd

对于任何应用程序 $pid,您将看到其中一个数字(描述符)指向 /dev/binder

然后做

cd /proc/$pid/task grep 名称 */状态

你会看到Binder_..线程(线程池被命名)。

在没有 binder 的情况下启动进程的唯一方法是纯原生进程(即 NDK C 项目,与 Bionic 链接)。然后,如果您确实需要 binder,您可以使用 ProcessState(和 IPCThreadState),或者手动编码 ioctl(2) 调用。

【讨论】:

以上是关于没有IPC的Android进程是不是默认有Binder线程池?的主要内容,如果未能解决你的问题,请参考以下文章

Android应用IPC机制

Android中的IPC进程通信方式第一篇

Android里的多进程和跨进程通讯方式

转 理解Android系统Binder机制

Android(IPC)进程间通讯1:详解Binder由来?

Android Java 和原生进程之间有啥快速简单的 IPC 机制吗?