Tencent / Shadow

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

修改gradle为7.1.1,AGP为7.2之后报错 #1160

Closed unoptimism closed 1 year ago

unoptimism commented 1 year ago

AS是2021.3.1,这是我fork的项目,只改动了gradle和AGP版本: https://github.com/unoptimism/Shadow

微信截图_20230331111814

shifujun commented 1 year ago

你如果不是要开发shadow的话没必要改shadow工程自身的依赖版本。

升级这种依赖肯定要有新的开发量的。

unoptimism commented 1 year ago

@shifujun 大佬回复的好快啊,还是占用的休息时间回复的,真的很用心在维护了,非常感谢。

背景: 跑直接下载下来的demo很好用,我在demo中新建插件也能正常加载,然后我就开始把自己的项目迁进shadow中,原本项目使用了Androidx、适配了Android13,基于这两点,然后我在修改项目的过程中遇到了挺多坎坷。

因此,想问一下就是如果二次开发需要插件APP支持Androidx和Android13,正确姿势开发姿势是什么,下面是我的一些尝试方向,不知道方向对了没有:

方案一,我尝试过把全局compileSDK设置为33,然后报错,提示我在gradle.properties添加android.suppressUnsupportedCompileSdk = 33,我Invalidate Caches后重启,依旧提示这个错误,并且伴随着一个“Issue registerd after handler locked”异常,触及到盲区,忙活半天我没解决。然后我决定换个思路,执行第2个方案。

方案二,我把插件APP相关的模块的compileSDK设置为33,然后构建正常,紧接着我让sample-app依赖Androidx,也没问题,然后运行的时候提示Androidx和Support包冲突,紧接着我把sample-app和sample-base/base-lib中的依赖都替换成了Androidx依赖,并把使用Support包的类中的import全改成了import androidx,sample-base-lib中清单文件的provider也改成了androidx的provider,然后报了一个错: Class com.tencent.shadow.core.runtime.ShadowActivity中缺少方法: getOnBackInvokedDispatcher:()Landroid/window/OnBackInvokedDispatcher;被这些类调用了: androidx.appcompat.app.AppCompatDelegateImpl$Api33Impl androidx.activity.ComponentActivity$Api33Impl 这个我查了issues,但是是不知道应该怎么改。

最后我想提问的有两点: 1,方案二种的报错应该如何处理,如何在ShadowActivity中实现那个所缺方法。 2,如果我的插件需要Androidx和适配Android13,我上面的方案二是否正确(改了蛮多类的导包,以及sample-base-lib中清单文件声明的provider,我觉得改动有点大,不知道有没有更好的办法)

项目地址: https://github.com/unoptimism/Shadow/ (PS:方案二目前在分支dev-all-to-androidx中,我将出现的报错的截图放在了pics文件夹中)

shifujun commented 1 year ago

你那个fork的仓库好像没公开,我访问不了。所以没看到你是不是在source sample上修改的。如果是的话,你可以换到maven sample里测试,或者test目录中有个androidx的项目里测试。

不让你在source sample里测试androidx是因为要改的东西太多,这个sample本身的业务代码太多。而且它是源码依赖的sdk,这会使一些android sdk的设置,比如target sdk版本等等同时应用到shadow和插件工程,这是没必要的。

shadow对androidx或者更高的系统api不用特别再开发什么。你提到的方法缺失的情况,是因为androidx依赖了新版本api,而我们的shadow activity等中间层没有对应实现。实现这些api一般比较简单,转调就行,但也有实现不了的情况。需要对API具体功能分析来看。但一般这种新增的API你不见得真的有用上,只是androidx这个包是个兼容层,所以它肯定会都依赖。所以你如果不用这个缺失的API,给个空实现也行。这个检测只是为了及早发现问题而存在的。你可以参考类似的提交历史来二次开发。

再或者如果确实不需要target到那么高的api,你用低版本的androidx包就行了。

unoptimism commented 1 year ago

谢谢大佬的回复,看了你的回答,给了我三个方向: 1,在maven sample里测试。 2,我确实用不到这个缺失的API,我尝试给个空实现。 3,降低api版本,如果我这边实在处理不了,我再尝试这个方案。

最后,周末愉快。

8492ll commented 1 year ago

你好,你的第二点确实的API处理成功了吗,这个方法是Android高版本当中的一个获取回调方法,能否请教一下是如何实现的?我尝试过空实现没有处理成功

我尝试了降低API版本到32就可以了,但是这样不兼容更高的版本