前言
公司的投屏项目几年前由三方开发,现公司因业务需要进行二次开发,从仓库拉下来后准备开干,结果项目已经无法正常编译了。项目用的还是gradle5.1
,build:gradle:3.4.2
,组件库用的都是老的support
库,看到这里,就明了了,把项目迁移到高版本了,不然后续工作将进行不下去,整个过程是十分痛苦的,问题百出,下面将记录下迁移的过程,遇到的问题以及解决的方法。
说明
总结下迁移的大致步骤和遇到的问题:
support
组件库迁移到AndroidX
library
中aar
库在主module
中引用- app运行过程
主module
中无法加载library
中的so
库
迁移步骤
一、新建项目、修改布局文件
新建项目,将老项目的主类、资源文件、依赖库等迁移到新建项目中,项目报错,这个问题平时开发中也会遇到,布局文件有异常,先查看下布局文件。
报错信息:
cvc-complex-type.2.4.a: Invalid content was found starting with element ‘base-extension’. One of ‘{layoutlib}’ is expected.
上面介绍过项目还是用的support
组件库,高版本全部迁移使用androidx
,如下图中ConstraintLayout
使用的是support
包下的组件,项目里类似的还有RecyclerView
、TableLayout
等等。
1、在gradle.properties
中添加AndroidX
支持。
android.useAndroidX=true //启用androidx
android.enableJetifier=true //启用 Jetifier 工具。Jetifier 是一个工具,可以自动将第三方库中使用的旧支持库引用转换为 AndroidX 引用。这样可以确保即使某些库还没有迁移到 AndroidX,Jetifier 也能帮助自动转换
2、如下图,AS打开项目 >> 菜单栏 Refactor >> Migrate to AndroidX…
按照提示的步骤进行操作即可,当然项目中还是会有迁移不成功的地方,以及导包问题,项目比较大还是比较痛苦的,需要一个个修改直至全部迁移至AndroidX
。
二、Library库中依赖的aar包
报错信息:
Direct local .aar file dependencies are not supported when building an AAR.
构建 AAR 时不支持直接本地 .aar 文件依赖。
在Debug模式下运行和打包没有问题,打Release包的时候会提示这个错,主Module >> 依赖module << aar库
,怀疑是高版本不支持这种套娃式的依赖模式。
那就把serenegiant-1.19.aar
独立出来,所有的地方都可以引用就可以解决此问题。步骤如下:
1、项目根目录下新建serenegiant-library文件夹,新建build.gradle,把serenegiant-1.1.9.aar放到文件夹下
2、新建的build.gradle中添加配置依赖
3、项目settings.gradle中添加此依赖库
4、用到这个aar包的module中引入
至此,顺利了解决依赖嵌套所带来的问题。
三、主module无法加载依赖module中的so库
报错信息:
com.xxx.screensync.xxxxx … couldn’t find “libstreamer.so”
提示主类(上面是主类包名)无法加载libstream.so
,so库是在screensync
中加载的,主module
无法加载so,确认so库有没有生成以及被打包到apk中,如果有,那就是引入的问题。
解压apk后可以看到在lib/armeabi-v7a
中是有libstream.so
的,那就是主module
没有正确引入so库。
查看screensync
的build.gradle
中已经正确引入。
app
的build.gradle
中没有此配置,在低版本的Gradle
中不引入是能够正常使用,升级后猜测是加载so库的策略发生了改变,故将app
的build.gradle
也添加此配置即可。