疫情这一年,上半年在做小程序,下半年开始做了一个vue项目,然后我就不记得安卓是啥了...
开玩笑,最近又要更新App功能,于是又把Android捡起来。把Android studio升级到4.1之后,发现Butterknife的注解全部都有warning提示。

搜索了一下发现。

竟然不维护了呀。

大神自己也说了,最好移步至view binding

竟然这样,就迁移到view binding吧。其实view binding之前看过一些介绍,但是没在项目中使用。项目中都是老代码,一直在修修补补。
那么首先看看view binding具体是怎么用的。
百度了一下,需要先在build中添加
android{
viewBinding {
enabled = true
}
}
然后用这种方式使用布局和控件
mInflate = ActivityCentersettingBinding.inflate(getLayoutInflater());
setContentView(mInflate.getRoot());
mInflate.tvVersion.setText(currVerion);
as会自动把项目中的xml生成一个相应的***Binding.java文件,这些文件也是以驼峰形式命名的。同时xml中设置了id的控件,也会以变量的形式包含在文件中,id名称也是以驼峰形式出现的,在使用时直接调用就可以了。
修改完了之后build一下项目,然后竟然报错。

全是乱码,根据报错的文件名称定位到对应的xml文件,发现文件中有未定义的标签,应该是以前项目重重构是删除的自定义控件。

再次rebuild,还是报错。
这次是因为有两个名称相似的布局,这样在生成对应Binding文件是会有冲突。

由于view binding会扫描一遍整个项目的xml文件,在这个过程中,我发现项目里竟然还存在以下这样的错误

这他么写的是啥,这些老代码里究竟多少这样不知所以的地方。
我陷入了漫长沉思...

然后我思考完了。我决定把这个项目做个大范围的优化,正好最近不怎么忙。
对了,补充一下,我发现使用view binding后,就不要随便给xml重命名了,不然调用的时候还要重新修改文件名。
既然决定要优化了,首先看一下项目里有多少遗留的无效文件,不知道以前从那看的,说as打包的时候会自动忽略那些未被调用的文件。所以项目里有很多重构时遗弃的文件未被删除。
我这次想彻底清理一下。可以在as中的analyze - run inspection by name 查看无效的文件。
出现结果后,直接删除,然后控制台又报错了。

然后定位到一段有tabLayout的代码

这里的view_indicator文件刚已经删除了,仔细看了一下,是tab的customview其实一直为null,因为就没设置过,可能之前想用自定义的样式,结果后来还是没用,这都检查出来了...老代码啊...
然后发现一处警告
DSL element 'android.viewBinding.enabled' is obsolete and has been replaced with 'android.buildFeatures.viewBinding'.
刚在网上搜到view binding的配置方式竟然也过期了
buildFeatures {
// dataBinding = true
viewBinding = true
}
换一下,这样就可以了。
重新打了个包,发现大小小了3M,看来as打包的时候并不会忽略未使用的资源,好吧。
刚才rebuild的过程中,build控制台总是出现乱码,这当然不能忍受,继续处理。
根据搜索到的方法在Edit Custom VM Options中添加-Dfile.encoding=UTF-8,测试一番之后,重启as后无效,重启电脑后才生效。于是之前乱码的地方变为

然后再全局build中加入
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
}
}
再次build可以显示具体信息,那些api过期了。
接下来的时间,就从过期的api开始,逐步修改和优化吧。
网友评论