Android-此流程中的外向交易必须为FLAG_ONEWAY

zde*_*ine 8 android motorola android-intent kotlin

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

val intent = Intent(this@LoginActivity, MainActivity::class.java)
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

任何建议或帮助表示赞赏,谢谢。

min*_*nsk 7

出于功能目的,这只是一个警告,表明进程间(通过绑定器)调用正在阻塞,此警告的 AOSP 来源。

默认情况下,进程间调用是阻塞的,但当它被标记oneway(通过 AIDL)时,它会作为“fire&forget”(非阻塞)执行。对于系统进程来说,在调用其他(可能未知的用户代码)时使用非阻塞调用很重要,以避免整个系统停顿。因此,此警告旨在标记如下危险调用:请参阅有关oneway.

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

Moto G6(索尼 Xperia 上没有)

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

归根结底,这是 android 实现的监督;对于这种特殊情况可能已经得到解决,请参阅活动管理器的最新来源。

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

但是,它可能会导致系统看门狗被杀死,请搜索其他日志以了解后果,例如:

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)
Run Code Online (Sandbox Code Playgroud)

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