问题标签 [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 回答
414 浏览

android - 经过数小时测试后的Android TransactionTooLargeException

我在三星的设备上遇到了问题。
经过数小时的压力测试,两个小部件显示异常,并且这两个小部件(cmaweather 和 storyalbumwidget)发生了 ANR。

这是跟踪:

02-11 08:38:00.219 W/ActivityManager(728):解除绑定服务 com.sec.android.widgetapp.ap.hero.cmaweather/.SurfaceWidgetWeather 时出现异常 02-11 08:38:00.219 W/ActivityManager(728): android.os.TransactionTooLargeException 02-11 08:38:00.219 W/ActivityManager(728):在 android.os.BinderProxy.transact(本机方法)02-11 08:38:00.219 W/ActivityManager(728):在 android。 app.ApplicationThreadProxy.scheduleUnbindService(ApplicationThreadNative.java:880) 02-11 08:38:00.219 W/ActivityManager(728): at com.android.server.am.ActiveServices.removeConnectionLocked(ActiveServices.java:1365) 02-11 08 :38:00.219 W/ActivityManager(728): 在 com.android.server.am.ActiveServices.unbindServiceLocked(ActiveServices.java:639) 02-11 08:38:00.219 W/ActivityManager(728): 在 com.android。 server.am.ActivityManagerService。unbindService(ActivityManagerService.java:13374) 02-11 08:38:00.219 W/ActivityManager(728): 在 android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:824) 02-11 08:38:00.219 W/ActivityManager( 728): 在 com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2136) 02-11 08:38:00.219 W/ActivityManager(728): 在 android.os.Binder.execTransact(Binder.java: 388)02-11 08:38:00.219 W/ActivityManager(728):在 dalvik.system.NativeStart.run(本机方法)02-11 08:38:00.239 W/ActivityManager(728):启动服务 com 时出现异常。 sec.android.widgetapp.ap.hero.cmaweather/.SurfaceWidgetWeather 02-11 08:38:00.239 W/ActivityManager(728):android.os.TransactionTooLargeException 02-11 08:38:00.239 W/ActivityManager(728):在android.os.BinderProxy。交易(本机方法)02-11 08:38:00.239 W/ActivityManager(728):在 android.app.ApplicationThreadProxy.scheduleCreateService(ApplicationThreadNative.java:857)02-11 08:38:00.239 W/ActivityManager(728):在 com.android.server.am.ActiveServices.realStartServiceLocked(ActiveServices.java:1111) 02-11 08:38:00.239 W/ActivityManager(728): 在 com.android.server.am.ActiveServices.bringUpServiceLocked(ActiveServices.java :1034) 02-11 08:38:00.239 W/ActivityManager(728): 在 com.android.server.am.ActiveServices.bindServiceLocked(ActiveServices.java:534) 02-11 08:38:00.239 W/ActivityManager(728 ): 在 com.android.server.am.ActivityManagerService.bindService(ActivityManagerService.java:13367) 02-11 08:38:00.239 W/ActivityManager(728): 在 android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:814)02-11 08:38:00.239 W/ActivityManager(728):在 com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2136)02-11 08:38:00.239 W/ActivityManager(728) : 在 android.os.Binder.execTransact(Binder.java:388) 02-11 08:38:00.239 W/ActivityManager(728): 在 dalvik.system.NativeStart.run(Native Method) 02-11 08:38: 00.249 W/ActivityManager(728):解除绑定服务 com.samsung.android.app.storyalbumwidget/.StoryAlbumWidget 时出现异常 02-11 08:38:00.249 W/ActivityManager(728):android.os.TransactionTooLargeException 02-11 08:38 :00.249 W/ActivityManager(728): 在 android.os.BinderProxy.transact(Native Method) 02-11 08:38:00.249 W/ActivityManager(728): 在 android.app.ApplicationThreadProxy.scheduleUnbindService(ApplicationThreadNative.java:880 ) 02-11 08:38:00。249 W/ActivityManager(728):在 com.android.server.am.ActiveServices.removeConnectionLocked(ActiveServices.java:1365)02-11 08:38:00.249 W/ActivityManager(728):在 com.android.server.am .ActiveServices.unbindServiceLocked(ActiveServices.java:639) 02-11 08:38:00.249 W/ActivityManager(728): 在 com.android.server.am.ActivityManagerService.unbindService(ActivityManagerService.java:13374) 02-11 08: 38:00.249 W/ActivityManager(728): 在 android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:824) 02-11 08:38:00.249 W/ActivityManager(728): 在 com.android.server.am.ActivityManagerService .onTransact(ActivityManagerService.java:2136) 02-11 08:38:00.249 W/ActivityManager(728): 在 android.os.Binder.execTransact(Binder.java:388) 02-11 08:38:00.249 W/ActivityManager (728):在 dalvik.system.NativeStart。运行(本机方法)

我知道 TransactionTooLargeException 是因为事务的数据太大。
但我不知道为什么这个异常只是在经过数小时的压力测试后才发生。
在压力测试中,我们只是一次又一次地打开一些应用程序。

有人有什么主意吗?
我该如何检查这个问题?

0 投票
1 回答
1070 浏览

android - 为什么我的线程组列表中有这么多的活页夹和异步任务?它们是如何管理的?

设置: 我有服务类和绑定到它的两个活动。第一个是调用的主要 UI 活动

第二个活动只调用 bindService(intent, mConnection, Context.BIND_AUTO_CREATE)。

两者都在 onStop() 中调用 unbindService(mConnection)。

主 UI 上有一个名为“按钮 A”的按钮,按下该按钮时会将 arrayList 传递给服务上的方法。然后服务中的方法启动一个新的静态线程来处理这个arrayList。新线程还有一个静态消息处理程序来与服务中的方法进行通信。第二个活动调用服务执行计算,然后将结果保存在数据库中。

我只在服务中明确声明了一个线程。所以我希望总共有 2 个线程,包括主线程,我只希望有两个绑定器,因为我只有两个绑定到服务的活动。但是,当我在主 UI 的 onCreate 中执行 Thread.activeCount() 时,我最初得到 3 个线程。后来我得到 4 个线程,然后是 9 个线程和 11 个线程,我按照下面描述的方式进行操作。

这是问题。
如何将活页夹和异步任务添加到我的线程组列表中? 他们为什么不断扩张?我担心电池消耗,更多线程是否意味着更多电池消耗?或者它只是工作更快,这些自动生成的线程会自己收集垃圾?我有任何内存泄漏吗?我可以控制这些线程是如何产生的吗?

我没有找到太多关于此的文档。任何人都了解这个问题,请告诉我。

应用程序的首次运行,在主 UI 的 onCreate 中:

ThreadGroup ctg = Thread.currentThread().getThreadGroup(); ctg.list();

该列表显示:

我知道 main、Binder_1、Binder_2 是 3 个活动线程。 我重新定位我的手机,logcat 显示:

然后我在主 UI 上按下“按钮 A”,通过创建一个新线程来处理 arraylist,然后我得到 11 个线程。 Logcat 显示:

0 投票
1 回答
454 浏览

android - vmalloc.c 中的标志 VM_IOREMAP 是什么意思?

http://lxr.free-electrons.com/source/include/linux/vmalloc.h?v=3.4;a=arm#L11

vm_structin有一堆标志vmalloc.c。我可以理解VM_ALLOC,这意味着vm_struct是由vmalloc()调用构造的。

但是其他标志是什么意思?特别是VM_IOREMAP. 它用于Android binder 驱动程序。

http://lxr.free-electrons.com/source/drivers/staging/android/binder.c?v=3.4;a=arm#L2819

0 投票
1 回答
1988 浏览

android - ContentProvider 和 Binder IPC

我对内容提供商有疑问.. 我们知道 binder 无法传输大量数据 (~>3MB),但即使内容提供商也使用 binder IPC 权利,这可能涉及 >3 MB 传输?或者内容提供者直接在调用者进程内存空间中读取数据库并且不涉及IPC?

请纠正我的理解。

0 投票
0 回答
630 浏览

android - 防止 LogCat 中出现“XYZ binder is null”错误消息

请先阅读并理解我的问题,因为我很乐意触发否决按钮!

这个问题实际上是一个 LogCat 化妆品。我对蓝牙没有任何崩溃或实际问题。我确实收到“蓝牙绑定器为空”LogCat 消息。关于如何在 Android 模拟器上使用蓝牙有很多帖子和问题。我知道这一切,这不是问题。我想要的只是摆脱 LogCat 错误消息。现在我有一个简单的条件来确定我在模拟器上运行:

https://groups.google.com/forum/#!topic/android-kernel/M4SjXulUeUo

boolean isEmulator = "goldfish".equals(Build.HARDWARE);

这不是很好,如果模拟器的内核(见上面的链接)要改变,否则条件将不再正确。所以我虽然可能有一种奇特的 Java 方法来确定库中是否存在库或函数,所以我没有收到关于执行此类的消息:

boolean isBluetoothAvailable = TTLBluetoothService.isBluetoothAvailable();

0 投票
0 回答
689 浏览

android - ClassCastException: android.os.Handler$MessengerImpl 无法转换为 My

我已经handler在我的service:

在实现ServiceConnection和绑定 的类中service,我执行以下操作:

我的问题是,ClassCastException当我尝试将活页夹转换为 my 时,我得到了 a handler,这实际上应该是它的一个实例,因为它设置为信使的活页夹。

我哪里错了?

我没有将我的服务声明为一个流程

0 投票
1 回答
1970 浏览

android-ndk - 没有 addService() 的 C++ Binder

是否可以使用 C++ Binder API 在两个非特权进程之间进行通信?

我发现的所有示例(例如https://github.com/mcr/Android-HelloWorldService)都依赖于注册服务ServiceManager->addService(),在非 root 手机上执行时会引发以下错误:

0 投票
0 回答
880 浏览

android - 等待 /dev/binder 响应时 __ioctl() 中的 SIGABRT

先决条件:ARMv7 设备,Android 平台 4.2.2。

有时我会在通过活页夹与系统服务(一个非常有问题的服务)交互时获得 SIGABRT。堆栈跟踪如下:

__ioctl 解析为以下汇编代码:

堆栈转储由信号 6 (SIGABRT)、代码 -6 (SI_KILL) 触发,故障地址为 0x304、0x330、0x33A(有时会有所不同,我什至不确定它是否真的是任何地址中的地址空格而不是错误代码或标志组合)。

我不知道信号可能表明什么,即它是否是

  • 驱动程序错误(但为什么它以如此奇怪的方式而不是返回值传递?)
  • 未拦截的驱动程序错误(即使没有内核恐慌也可能吗?);
  • 内核故障(在驱动程序调用之外,可能与驱动程序无关);
  • 一个损坏的中断向量(那么为什么不是 SIGSEGV 或 SIGILL?);
  • 在主管模式下收到 SIGQUIT(Dalvik 堆栈跟踪信号)的结果。

在最后一种情况下,我收回我的惊讶并继续调查阻塞调用冻结原因(被调用进程中的死锁?)。可能,我可以构建一个测试应用程序来重现这个特定的先决条件,但这需要时间。

我在网络上发现了许多看起来相似的痕迹和错误报告,表明问题不是特定于设备或供应商的(尽管可能特定于平台版本)。

与之交互的确切服务也不重要。

PS日志猫:

0 投票
2 回答
411 浏览

android - Android Widgets 允许以某种方式超过 Binder 事务限制?

AppWidgetManager的 Android 文档中,它说

但是TransactionTooLargeException的文档说:

市场上几乎每个 Android 设备的屏幕尺寸都足够大,以至于填充它的位图会超过 1Mb(例如 800 x 600 x 4 = 1,920,000 字节)。我查看了Android平台源代码,它似乎没有使用带有管道或任何深奥的ashmem,只是一个普通的AIDL文件,并且在RemoteViews中,位图对象以正常的方式是Parcelable(它确实下降到本机代码,但它似乎将所有位图像素写入常规包裹)。

那么Android怎么可能超过Binder事务限制呢?是否oneway允许发送更大的数据?

0 投票
1 回答
313 浏览

android - What's the CallingUid when AppX calls ServiceY which then calls ServiceZ?

From Android API documentation: Binder.getCallingUid() returns the Linux uid assigned to the process that sent you the current transaction that is being processed. When AppX calls ServiceY and ServiceY calls getCallingUid(), it will get UID for X.

My question is: when AppX calls ServiceY, and ServiceY in turn calls ServiceZ, what's the calling UID observed by Z?

Does it make a difference if Y and Z are in the same process?