在 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/