项目背景:项目主要是由flutter开发的,并且已经集成了展示互动,打算再集成保利威。目前保利威最新版本是V0.13.1
坑1:当前demo支持targetSdkVersion 27版本及以下,而主项目中用到的版本是29,所以初步考虑是降低版本,也就是将项目中的androidx降为support v7包,经过一系列的尝试,发现展示互动module中用到的androidx是集成到jar包中的,无法降低。
坑2:尝试升级demo,demo的导入需要将demo转成module,这一步骤包括:
1、polyvapp/build.gradle文件,更改如下代码:
apply plugin: 'com.android.application' -> apply plugin: 'com.android.library'
defaultConfig {
consumerProguardFiles 'proguard-rules.pro' -> 添加这行代码
applicationId "com.easefun.polyv.cloudclassdemo" -> 注释/删除这行代码
}
//注释掉打包app用到的配置,例如: 需要将项项目中所有打包用到的配置都注释掉,包括signingConfigs之类的
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.name}_${variant.versionName}_${currentTime()}.apk"
}
}
2、polyvapp/src/main/AndroidManifest.xml文件,更改如下代码:
<!--删除application的属性配置,并注释程序入口-->
<application>
<activity
android:name=".login.PolyvCloudClassLoginActivity"
android:windowSoftInputMode="stateHidden|adjustResize">
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
</activity>
...
</application>
3、该模块中的PolyvCloudClassApp.java文件中,将oncreate中的代码提取出来,封装成一个静态方法。供后续主项目初始化调用。
4、依赖模块修改:要将所有的v7包相关的库都改为androidx对应的库,详细参照:https://www.jianshu.com/p/5ff650460161
这一步还是遇到了问题:
- 展示互动module中和保利威module中都使用了B站的弹幕,一直提示冲突,将展示互动中的弹幕引用注释掉,放开保利威的引用:
//展示互动 注释掉
// implementation files('libs/gensee_danmu.jar')
//保利威 api放开
api 'com.easefun.polyv:polyvSDKCloudClass:0.14.0'
- 将保利威的两个module合二为一,commonUI部分主要就是UI、工具类,合并起来也方便,将commonUI部分的代码,拷贝到保利威的app module中,将依赖库合并到一起,这样引起的冲突会少一些,最终依赖中的引用部分代码如下:
dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.viewpager:viewpager:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' // implementation ("com.android.support:multidex:1.0.3") { // exclude group: 'com.android.support' // } api 'com.easefun.polyv:polyvSDKCloudClass:0.14.0' implementation 'androidx.recyclerview:recyclerview:1.0.0' implementation 'androidx.multidex:multidex:2.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' implementation 'com.google.android.material:material:1.0.0' annotationProcessor 'androidx.annotation:annotation:1.0.0' implementation 'androidx.test.espresso:espresso-core:3.1.0' //glide implementation ('jp.wasabeef:glide-transformations:3.3.0'){ // exclude group:'com.github.bumptech.glide',module:'glide' } implementation ("com.github.bumptech.glide:okhttp3-integration:4.7.1"){ // exclude group:'com.github.bumptech.glide',module:'glide' } annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' }
在这过程中要不断地clean项目,flutter总项目目录下删除buid并刷新重启。历经千辛万苦终于集成成功。
坑3: 集成完成后,需要初始化并且使用module,具体有以下几个问题:
- 保利威文档中要求在application中加入初始化代码,而flutter如何在原生中加入初始化代码,这个问题困扰了很久发现没法重写flutterApplication(作为菜鸟,目前还没有找到合适的方法),就把代码写到继承FlutterActivity()的子类的oncreate中,该类主要用来注册flutter和原生交互的方法,运行程序,进入直播页面,黑屏,打印的log显示内存溢出,这种情况一般是考虑是否初始化失败,于是,通过打断点发现,并没有走oncreate的方法,初始化失败,只能把代码放到了调用直播方法的实现类中,当然目前体验特别差,每次进入直播都要初始化一次,需要进一步优化。
- 再次运行程序,发现找不到module中的PolyvCloudClassHomeActivity类,该步需要将AndroidManifest.xml中引用的activity路径写完整,并且每个activity都要加上theme,最好是加载activity里 ,而不是application标签下,否则容易出现冲突的问题,具体代码如下:
<activity android:name="com.easefun.polyv.cloudclassdemo.watch.PolyvCloudClassHomeActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:theme="@style/Theme.AppCompat.Light.NoActionBar" android:windowSoftInputMode="stateHidden|adjustResize"> </activity>
- 再次运行程序,提示无法启动PolyvCloudClassHomeActivity,仔细阅读log发现是布局中用的recycleView是v7包里的,通过快捷键command+shift+f(window是:ctrl+shift+f)搜索哪一个文件中用到v7包里的recycleView,都转成androidx包中的。再次运行程序,通过。
该项目经过几个回合,由于百利威官方还没有适配androidx,一直没有自信能集成成功,中途遇到bug多次想要放弃升级,在同事的耐心帮助下,最终集成完毕,所以说,没有解决不了的bug,只有不努力的程序员。未来的码农生涯中,需要多多修行,多改bug,做一个合格的码农。