Android - 此进程的传出事务必须是 FLAG_ONEWAY

标签 android android-intent kotlin motorola

在 Moto G6 设备上运行我的 Android 应用程序时,我遇到了两个问题(在其他设备或模拟器上没有这样的问题)。在我的应用中,有一个简单的 LoginActivity,在成功登录后启动 MainActivity(在 AsyncTask 的 onPostExecute 中):

val intent = Intent(this@LoginActivity, MainActivity::class.java)
startActivity(intent)

但是在 Moto G6 上(在 Sony Xperia 上没有发生),交易应该是 ONEWAY 的错误:

10-17 07:50:45.058 1878-2153/? W/Binder: Outgoing transactions from this process must be FLAG_ONEWAY
java.lang.Throwable
    at android.os.BinderProxy.transact(Binder.java:736)
    at android.app.assist.AssistStructure$ParcelTransferReader.fetchData(AssistStructure.java:407)
    at android.app.assist.AssistStructure$ParcelTransferReader.go(AssistStructure.java:343)
    at android.app.assist.AssistStructure.ensureData(AssistStructure.java:2110)
    at com.android.server.autofill.Session$1.send(Session.java:200)
    at com.android.server.am.ActivityManagerService.reportAssistContextExtras(ActivityManagerService.java:13475)
    at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2467)
    at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3082)
    at android.os.Binder.execTransact(Binder.java:674)

任何建议或帮助,谢谢。

最佳答案

出于功能目的,这只是一个警告,即进程间(通过 Binder )调用被阻塞,AOSP source for this warning .

默认情况下,进程间调用是阻塞的,但是当它被标记为 oneway(通过 AIDL)时,它会被执行为 fire & forget(非阻塞)。系统进程在调用其他(可能未知的用户代码)时使用非阻塞调用非常重要,以避免整个系统停滞。所以这个警告是为了标记这样的危险调用:见 android developer AIDL documentation关于oneway

在这个例子中,有一个对 ActivityManagerService reportAssistContextExtras 的调用(AM 在主系统进程中运行),它又调用另一个 IPC(进程间)调用 AssistStructure$ParcelTransferReader.fetchData,而后者没有标记oneway(会触发这个警告)。

on Moto G6 (not happening on Sony Xperia)

它们可能有不同的实现/android 版本或不同的调用顺序(所以它不会被调用)..

归根结底,这是对 android 实现的监督;对于这种特殊情况可能已经解决,请参阅最新的 source of activity manager .

如果不会产生功能问题,如果警告与您的代码无关,请忽略该警告。如果此类调用(本例中为 fetchData)解析为您的代码,请确保不要阻塞(快速返回)。

但是可能会导致系统看门狗kill,搜索其他日志了解后果,比如:

W Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS: Blocked in handler on main thread (main)
W Watchdog: main annotated stack trace:
W Watchdog:     at android.os.BinderProxy.transactNative(Native Method)

如果不是您的代码,最终可能需要向 Google 提交。

关于Android - 此进程的传出事务必须是 FLAG_ONEWAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52848415/

相关文章:

java - 通过低功耗蓝牙(即通过信标)向附近的移动设备发送通知,且设备上未安装任何应用程序

java - ObservableBoolean 数据绑定(bind)在设置时不会更新 View

Android:是否可以仅针对联系人同步阻止谷歌同步服务?

java - Android:如何将空的 EditText 字段排除在随机计数之外?

Android ActivityResult API Unresolved 引用错误 registerForActivityResult

android - 将扩展函数包装到另一个函数中

Android setRepeating() 和 setInexactRepeating() 不触发

java - Android Firebase 使用地理定位来过滤数据

android - 如何检查android中是否安装了日历应用程序?

c# - 无法从异步函数启动新的 Intent Activity