Tencent / Shadow

零反射全动态Android插件框架
BSD 3-Clause "New" or "Revised" License
7.46k stars 1.3k forks source link

为什么 Shadow Sample apk 做 preparePlugin() 时不用区分主进程或插件进程?而且运行也不会 crash? #1169

Closed LeonWu6 closed 1 year ago

LeonWu6 commented 1 year ago

我的apk在插件化改造中,Main进程和plugin 进程都会初始化 PluginHelper 并做 preparePlugin() 调用,当 plugin 进程在调用 preparePlugin() 时,必现 plugin 进程 crash。 日志如下:

04-09 22:26:59.556 10222 10222 I em--com.oplus.em.PluginProcessPPS: onCreate:com.oplus.em.PluginProcessPPS@ce72a93 04-09 22:26:59.556 10222 10222 I em--com.oplus.em.PluginProcessPPS: onBind:com.oplus.em.PluginProcessPPS@ce72a93 04-09 22:26:59.557 10129 10129 F libc : Fatal signal 7 (SIGBUS), code 2 (BUS_ADRERR), fault addr 0x785abff608 in tid 10129 (em), pid 10129 (em) 04-09 22:26:59.804 10248 10248 F DEBUG : Process name is com.oplus.em, not key_process 04-09 22:26:59.804 10248 10248 F DEBUG : keyProcess: 0 04-09 22:26:59.804 10248 10248 F DEBUG : 04-09 22:26:59.804 10248 10248 F DEBUG : Build fingerprint: 'OPPO/PHU110/OP564B:13/SKQ1.221119.001/T.f8311b-b9_11f1:user/release-keys' 04-09 22:26:59.804 10248 10248 F DEBUG : Revision: '0' 04-09 22:26:59.804 10248 10248 F DEBUG : ABI: 'arm64' 04-09 22:26:59.804 10248 10248 F DEBUG : Timestamp: 2023-04-09 22:26:59.607138369+0800 04-09 22:26:59.804 10248 10248 F DEBUG : Process uptime: 4s 04-09 22:26:59.804 10248 10248 F DEBUG : Cmdline: com.oplus.em 04-09 22:26:59.804 10248 10248 F DEBUG : pid: 10129, tid: 10129, name: em >>> com.oplus.em <<< 04-09 22:26:59.804 10248 10248 F DEBUG : uid: 1000 04-09 22:26:59.804 10248 10248 F DEBUG : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE) 04-09 22:26:59.804 10248 10248 F DEBUG : pac_enabled_keys: 000000000000000f (PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY, PR_PAC_APDBKEY) 04-09 22:26:59.804 10248 10248 F DEBUG : signal 7 (SIGBUS), code 2 (BUS_ADRERR), fault addr 0x000000785abff608 ... ... 04-09 22:26:59.804 10248 10248 F DEBUG : backtrace: 04-09 22:26:59.804 10248 10248 F DEBUG : #00 pc 000000000020eaf8 /apex/com.android.art/lib64/libart.so (nterp_helper+22520) (BuildId: 5b8dba7a2a0416d706a4830d563657d7) ... ... 04-09 22:26:59.804 10248 10248 F DEBUG : #31 pc 0000000000075c7c /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+100) (BuildId: e9653d1f6c173c6b86b171a5be6af6eb)

后来,我把 PluginHelper 中的 preparePlugin() 限制只在主进程做,就没有这个异常了。 修改后的代码:

fun init(context: Context) { mLogger.debug("init") if (isMainProcess(context)) { // 判断是主进程才执行准备plugin和pluginmanager mLogger.debug("init isMainProcess") pluginManagerFile = File(context.filesDir, sPluginManagerName) pluginZipFile = File(context.filesDir, sPluginZip) mContext = context.applicationContext singlePool.execute { preparePlugin() } // 执行准备plugin和pluginmanager } }

疑问: Crash 的原因是 Manager apk 运行时,plugin 进程再次对它覆盖导致的吗? 为什么 Shadow Sample apk 做 preparePlugin() 时不用区分主进程或插件进程?而且运行也不会 crash?

LeonWu6 commented 1 year ago

路过的大神,求解

shifujun commented 1 year ago

这仅仅是因为sample的插件进程启动的很晚,要等用户点“启动插件”按钮才会触发插件进程启动。所以两个进程执行preparePlugin()的时间极大概率的被错开了。

所以这是个基本测不出来的低级错误。

LeonWu6 commented 1 year ago

这仅仅是因为sample的插件进程启动的很晚,要等用户点“启动插件”按钮才会触发插件进程启动。所以两个进程执行preparePlugin()的时间极大概率的被错开了。

所以这是个基本测不出来的低级错误。

感谢您帮我解惑@shifujun