问题标签 [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 投票
0 回答
808 浏览

android - 如何启动较新版本的 AIDL 服务并停止当前正在运行的旧版本

我需要的与如何在 Android 中正确升级 AIDL 接口非常相似?问题,但我还希望在安装后启动新版本的 AIDL 服务并停止旧版本。简单地说:我需要最新版本始终是正在运行的版本。(当然,将保持新版本的向后兼容性。)

详细地说,让我们说我们的:

  • Android 应用 A 在其代码中包含旧版本的 AIDL 服务(并且在清单中也表示为特殊的远程进程)。
  • 应用 B 是用户刚刚安装的具有较新版本 AIDL 服务的应用。

安装应用程序 B 后,我以编程方式终止两个应用程序的进程以及 AIDL 服务的远程进程。在那之后,无论我如何尝试启动新应用程序 B 中包含的 AIDL 服务都没有用,旧版本总是会重新启动(除非我卸载旧应用程序 A)。

有趣的是,如果仅安装了两个应用程序,并且以前从未启动过旧版本的 AIDL 服务,我可以专门针对较新的 AIDL 服务启动(从较新的应用程序绑定到服务)。我的意思是我启动了旧的应用程序 A 并且我能够让它在应用程序 B 中启动新版本的 AIDL 服务。如果旧版本的 AIDL 过去至少运行过一次,那么无论如何(即使在重新启动设备后),它将是 Android 将永远启动的那个!

0 投票
0 回答
267 浏览

java - 使用图书馆项目中的服务和活页夹

我目前正在开发一个无线电流应用程序。为了完成这项工作,我决定创建一个库项目来进行一些代码重构

所以在我的图书馆项目中,我有:

  • 流服务.java
  • StreamingPlayerMP.java
  • StreamingPlayerAAC.java
  • StreamingCallback.java
  • StreamingNotification.java
  • StreamingState.java
  • StreamingStation.java

我需要在库清单应用程序清单中定义服务吗?

我是否也需要在库清单应用程序清单中都设置权限?

目前 Service/players/callback 已经可以使用了。我想使用ServiceConnection和主要活动的活页夹来管理服务:

以及活页夹方法(位于服务中):

该服务是前台服务:

如果您有完整的解决方案,欢迎您!也欢迎建议

0 投票
2 回答
1381 浏览

android - Intents中binder驱动的参与(IPC的一种形式)

我计划对 Android 应用程序进行开箱即用的分析。也就是说,我将在 Android QEMU 模拟器中运行应用程序并执行虚拟机自省 (VMI) 以监控应用程序的行为。为此,我使用 QEMU 模拟器来监控应用程序的 Linux 系统调用和 Binder IPC。

但是,我不确定在监视低级操作时是否能够监视使用意图执行的进程间通信。意图是否与活页夹驱动程序或意图在 Java API 级别运行。

0 投票
1 回答
9743 浏览

android - 使用 ParcelFileDescriptor.createPipe() 将 InputStream 传输到另一个服务(跨进程边界)失败并显示“EBADF(错误文件号)”

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

发送代码(过程 A)

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

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

接收服务代码(过程 B)

接收服务的.aidl

进程 A 调用的接收服务:

in.read()总是inputStream()抛出一个IOException

似乎 EBADF errno 是由read()文件描述符关闭时设置的。但我不知道是什么原因造成的以及如何解决它。

是的,我知道 ConentProvider 也是一种可能性。但它不应该也适用于我的方法吗?有没有其他方法可以将 InputStream 流传递给 Android 中的不同服务?

附带说明:CommonsWare使用 ContentProvider创建了一个类似的项目(相关的 SO 问题12)。我从这里获得了我的方法的大部分想法

0 投票
0 回答
206 浏览

android - Facebook API 在设备上失败,但在模拟器上失败

我有一个 Facebook 2.0 应用程序,我正在尝试升级到 3.0。我下载了新的 SDK,但是当我尝试在我的三星 S3 或 Note 设备上运行示例应用程序时,它会失败并出现以下错误,具体取决于应用程序:

奇怪的是,如果我尝试通过模拟器运行测试应用程序,它们就可以工作。我读到一些帖子说一些制造商修改了设备附带的 Facebook 应用程序,所以我认为这可能是问题所在。有没有人有任何想法或这发生在你们中的任何人身上?

0 投票
1 回答
446 浏览

android - 广播接收器是否依赖binder或intent,Android

broadcast reciever当我在Android中设置一个 。这是否在最低级别依赖Binder?或者你能Binder以任何方式绕过吗?

0 投票
1 回答
1331 浏览

android - 启动活动时失败的 BINDER TRAACTION

我认为我的问题可能与this stack post(Android远程方法数据限制)有关-仅返回的数据大小为661KB,并且文章说binder可以支持1MB。

情况如下:我有一个异步任务,它接受一个参数并调用一个 Web 服务,该服务返回一个由管道分隔的字符串和整数值组成的数组列表。然后我将这些值插入到 JAVA 数组列表中。在较小的数据集中,这很好用。在较大的数据集(即,这个 661KB 的数据集)中,我收到以下错误。

日志猫:

这是正在执行的代码:

一旦意图开始,它就不会到达新的活动。我在 onCreate 中有一个 LOG.i,它永远不会被击中。过程调用没有超时。当我尝试返回较少数据的相同代码时,我没有收到错误消息。即,当我在将数据返回到异步任务的语句上放置一个 SELECT TOP 100 时,它完全没问题。

我想我的问题是——如果返回的数据小于 1MB,为什么会出错?如果是因为 1MB 的限制,我还能做些什么来绕过这个限制或以某种方式压缩返回的数据?

预期的设计是这个初始调用带回名称和与这些名称相关的约会(管道分隔)。我显示了一个仅包含微调器中名称的不同列表(取自数组列表)。当用户单击微调器中的名称时,它将启动一个新活动,该活动将显示与该名称关联的所有约会(同样,所有数据都来自初始数组列表)。所有数据都在第一个异步任务中收集并进行操作。这样做是为了减少网络调用的数量。这个任务在 2 个 Web 服务调用中是可行的,所以如果这是一个很好的答案 - 我只是希望有一种不同/更好的方法来做到这一点,这样我就可以限制 Web 服务调用并减少用户等待时间。

0 投票
3 回答
2121 浏览

android - AIDL“单向”远程调用的顺序保证是什么?

带有“ oneway ”关键字的AIDL方法和接口是对远程进程的异步Binder调用,据说不保证调用的顺序。另一方面,Dianne Hackborn(Binder 的作者)在此线程( https://groups.google.com/forum/#!topic/android-developers/FFY-hg2Jx0M)中的最后一条评论说:

“交付顺序与目标对象相关联(因此您可以在不同的接口上无序地接收调用)”

这似乎表明,对同一接口的调用保持了它们的顺序。

任何人都可以澄清这一点吗?

0 投票
1 回答
162 浏览

android - Android IPC 和 service_manager

所有Android IPC都通过service_manager吗?应用程序如何与服务和意图交互?

所有消息都通过 service_manager 作为代理传递吗?还是应用程序可以直接“对话”?

0 投票
1 回答
1932 浏览

android - Android 阻止意图

我的应用程序可以阻止来自其他应用程序的意图吗?我想阻止来自特定应用程序的请求,

怎么做到呢 ?我可以访问 AOSP,所以我想了解我可以在代码中的哪个位置添加阻塞机制?

例如,我想拒绝与指定的应用程序共享来自浏览器的内容(例如 URL 的副本)。

我看到意图转到活动管理器,活动管理器将其传递给相关应用程序,我如何在较低层知道请求的来源是什么?

例如:am start -a android.intent.action.SEND -d "some message" -t text/plain 我在 shell 中看到: 开始: Intent { act=android.intent.action.SEND dat=some message typ= text/plain } I/ActivityManager(309): START u0 {act=android.intent.action.SEND dat=some message typ=text/plain flg=0x10000000 cmp=android/com.android.internal.app.ResolverActivity} PID 1149

我如何在较低层中知道源进程是 1149?我在活页夹中看到请求来自活动管理器 309,我想阻止进程 1149 我可以更改 AOSP,但我不知道在哪里可以做到。