没有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线程池?的主要内容,如果未能解决你的问题,请参考以下文章