shifujun
shifujun
PluginManagerThatSupportMultiLoader是用来在同一个进程加载多个Loader的,你可以在提交记录里看到。你只是要加载多个插件,所以你用不上的。 > 我本地集成的时候,会有多个的plugin.zip,所以也会有多个的loader和runtime 即便你打包多个plugin.zip,它也只是个zip包。你没必要发布多个loader和runtime,更不应该分配不同的uuid。 你可能太快上手复杂的场景了,没太理解sample那种简单的场景下整个系统的工作流程。
loadplugin可以分多次进行。完全就只是启动之前先加载好插件就行。所谓load/加载,就是解析一下插件的manifest信息,放到map里。启动好application oncreate入口。建议多debug sample的启动过程,不是很复杂的。 可以debug那个none-dynamic的例子,以便略过那些跨进程转调的复杂性。
> packageArchiveInfo is NullPointException 我搜不到这个代码。 这个api很稳定。特别是在旧版本的Android上更不应该有问题。 所以就算真的有问题,也没什么好办法了。非要针对性兼容,就考虑hardcode所需的信息吧。
这些系统api需要activity的,基本上都可以转调时传对应的container activity。对系统来说插件activity只是container activity持有的普通逻辑类。你可以仿照已有的transform把对NfcAdapter的调用hook下来,修改参数再调用。 至于你提到的插件自带的NfcAdapter类实现,似乎是不必要的。 如果你的NfcAdapter支持实现好了欢迎贡献代码。
插件代码就是宿主代码的一部分,对so来说不存在插件和宿主的差异和隔离。你直接load so的绝对路径就行了。
像这样的问题,对于shadow来说首先要在AOSP的系统上测试复现。因为shadow主要是立足于公开api实现的。确实有原版系统上没问题,但是到了一些oem系统上不兼容的情况。 我最近手边没有电脑适合测试这个问题。 注意到`not instance of 'Reference: android.app.Activity'`这样的报错。因为shadow处理的插件中是不会有android.app.Activity这个类型出现的。所有它出现就说明这里发生了超出Java范畴的问题。一般就是AOT相关实现造成的了。我的猜测是系统有私有的逻辑,认为我们的插件activity不可能不是android.app.Activity,所有直接把它作为android.app.Activity处理了。但我还猜不出来系统是根据什么推测的。如果只有某几个用例会复现问题,那可能是一些系统API造成的。可能是某个API我们是在Context类型上调用的,但你测试的系统上是在Activity类型上实现的,并且还是AOT实现的,所以它认为传来的this应该是个android.app.Activity。如果是这种情况,又非要兼容的话,我们就得看看改为在宿主container activity上调用可否满足需求了。 这种AOT实现的行为在debug版APP上不生效是我可以确定的,有经验的场景。应该和R8之类的没有关系。
如果你能帮忙贡献一个方便用来测试的so,我可以简单的加到sample中演示一下。其实我有过这种想法,但是把那个so发到Maven上去,还得同时支持x86架构方便虚拟机测试,整体有些繁琐,就一直没做。 如果可以的话,麻烦发一个简单的返回字符串的so就可以了。打包成aar支持全部abi,发到公开的Maven上。 如果知道现成的so就更好了,我一直没找到。 shadow里有so的解压逻辑,搜索issue和提交日志都能看到。
感谢反馈问题。 我需要复现一下问题再确定是不是bug。view构造器缓存我记得是考虑在内的。也许有考虑不全的情况,也许是另外的原因。但我倾向于classloader结构不需要修改。我也得重新看一下那个缓存逻辑,和之前的应对措施。已经记不太清了。
你贴的堆栈只能说明你用的不是这个项目的原始代码。而你又不愿意分享你修改后的代码。所以这没有开源项目的交流前提。 即便如此。你想知道在你拿了代码修改之后,上游项目改了什么。你可以简单的用git diff看出来多出来哪些提交,那些文件有差异。如果这些提交的提交日志不清晰,如果文件的改动看不懂,都可以直接引用提issue。要求改进也是合理的。直接提PR改进代码可读性也是欢迎的。 dex和oat都属于Android的私有api,shadow从原理上不考虑介入。
你要先注意你复制的是`com.tencent.shadow.sample`包中的示例代码,你不能指望这些代码是通用的。它们是演示SDK接口如何调用的。 你可能没抄明白安装插件的调用逻辑。没安装就启动了。