相信不少关注谷歌开发者官方公众号的小伙伴们最近应该都知道了一个消息。
随着Jetpack Compose首个Beta版的发布,Google在上周四的时候发起了一个Android开发挑战赛的活动。在接下来的四周时间里,Google每周都将发起一个挑战项目,以帮助开发者能够更加熟练地使用Jetpack Compose来构建出色的应用。参与挑战还有机会赢取包括Pixel 5在内的1000多份奖品。完整的活动内容可以参考谷歌开发者公众号发布的原文,点击这里查看。本周挑战项目的内容是,编写一个小狗领养应用。我看了一下项目的要求,其实非常简单,就是包含一个小狗列表的概览页面,以及显示每只小狗具体情况的详细信息页面即可。而这个挑战项目的奖品是,由乐高积木组成的限量版Jetpack Compose超级英雄奖杯。成功完成这项挑战并提交参赛作品的前500人可以将此奖杯收入囊中。
虽说这个项目看上去很简单,但是Google有个要求,就是你必须使用Jetpack Compose来编写界面,用传统的界面写法来完成这个项目是无效的。因为这是Google在全球范围举办的一次开发挑战赛,想要成为前500名难度还是不小的,所以一开始我也在犹豫到底要不要参加。不过后来想了想,即使没有拿到奖品也没关系,我可以把这个挑战当成是一次学习的机会,通过完成这个项目来熟悉Jetpack Compose也是不错的。Jetpack Compose这个库虽然我在之前也算是有些了解,但现在几乎约等于完全不懂。因为我在学习Jetpack Compose的时候,它还属于非常非常早期的版本,API极其不稳定。在网上找的一些学习资料想跟着敲一下,结果发现,一会这个函数没了,一会那个函数改名了,一会参数又变动了,让人完全无法进行下去。后来我就暂时放弃了学习,想等API稳定了之后再学。而现在,Jetpack Compose终于发布了首个Beta版,这也就意味着它的API已经基本稳定,不会再发生什么特别大的变动了。因此,我决定参加这个挑战赛,既当成是挑战,也当成是学习的过程。不过本篇文章不会涉及Jetpack Compose的知识讲解,我在做这个项目的时候基本也是一边查一边写的,了解的内容还非常表面。等以后对Jetpack Compose熟悉了之后,我可能会专门写一系列的文章来讲解这个库。刚才已经说了,项目要求非常简单,只要包含一个小狗列表界面,以及每只小狗的详细信息界面即可。首周的挑战项目必须在3月3日下午3:59前完成并提交,因此如果你也有兴趣的话,现在动手可能还来得及(我是用了周六一天时间完成的)。不管是使用Jetpack Compose,还是使用传统的写法去实现,首先你必须要拥有用于展示的数据才行。于是我在Google上找了一个专门介绍小狗的网站:在这个网站上面搜集了一些小狗的信息和图片,这样数据就算是准备好了。另外,你是不可以自己随便创建一个项目就开始写代码的,Google给我们提供了一个模板,必须在它的模板下编写代码才行。模板地址是:https://github.com/android/android-dev-challenge-compose
打开这个地址,并点击Use this template按钮,就会将这个模板复制一份到你自己的GitHub仓库。接下来在你自己的GitHub仓库中将项目clone到本地,然后在这里编写代码即可。
至于具体的代码我就不贴出来了,因为基本都是Jetpack Compose相关的代码,而我在本篇文章中是不准备讲解Jetpack Compose的。尽管很多东西我都还不会,就这样边查边写,我还是在一天时间内把这个项目给做出来了。效果非常简单,不过最基本的项目要求都满足了,如下图所示:
可以看到,一个小狗列表界面,以及每只小狗的详细信息界面都有了,另外我们还可以通过点击按钮来领养小狗。虽然代码已经写完了,但是我在提交代码时才意识到,Google的挑战赛项目并没有那么容易。因为Google设置了一套严格的代码检查机制,你的代码必须是完全符合规范的才能编译通过。我自认为自己平时的编程风格是非常规范的,并且微软也有这种类似的代码审核机制,但完全没有Google的这套严格。在Google的这套规则中,每个类的头部都要按照固定的格式声明版权。代码中import的包不能使用*通配符,得一个个手动引入,而且引入的包必须按照字符表的顺序排列。所有代码的换行,空格等等都有严格的规范,少写一个空格,少加一个换行都会导致编译失败。我基本是按照报错的提示一个个进行修改,但是改了一处,提交代码,又会有其他地方报错。改了老半天,我竟然没有一次代码是可以编译通过的,简直快把我搞崩溃了。
后来重新打开了这个挑战项目的GitHub主页,发现主页上有这样一段描述:
原来项目中会使用Spotless来检查我们的代码是否规范。虽然我并不知道Spotless是个什么工具,但是这个名字听起来就感觉很变态,因为它是完美无暇的意思。也就是说,Google会用这个工具来检查我们的代码是否完美无暇,一个空格都不会放过。不过好在它还是给了我们一个简单的解决方案,运行gradlew app:spotlessApply命令可以自动将所有代码按照Spotless的规范进行格式化,这样就能够通过检查了。最后我是通过这种方式来让项目编译通过的。但是在正式项目当中,并不推荐大家这样使用,这就好像我从不建议大家使用Ctrl + Shift + L来格式化代码一样。因为用这种快捷的方式可能会导致许多并非你自己编写的代码发生变动,从而对以后追查代码的变动历史造成很大的困扰。项目编译通过之后,构建任务会转变成绿色,如下图所示:
最后,我们还需要按照Google给出的模板修改README.md文件。这个倒是挺简单的,模板都是给好的,往里面填内容就行了。随便写点项目描述,以及这个项目有什么优势即可。然后刷新仓库页面,你会发现这个模板已经自动帮你生成一个比较漂亮的项目主页了。
注意,这个主页的顶部有个Check passing的图标,只有你的项目编译通过了才会显示这个图标。因此从这里就可以迅速看出你提交的代码有没有通过Google的检查。所有工作都完成了之后,接下来就可以去提交比赛作品了,提交地址是:http://goo.gle/dev-challenge-week-1-submission
令我没想到的是,在提交作品时,Google竟然还要求参赛者必须发条推文:
于是我又去找回了多年没有使用过的Twitter账号,发了一条久违的推文。
希望本文的整理也能对其他有意愿参赛的选手有所帮助,即使首周的比赛可能已经有些来不及了,但是接下来还有3周的比赛,并且后面奖品只会更加丰富。不过我不知道我自己是否会继续参加后面的比赛,一是未必每周都有时间,二是如果后面挑战项目的难度升级,我可能就做不出来了。所以走一步看一步吧。如果是想要借助这个项目来学习Jetpack Compose的朋友,也可以参考一下我的实现,源码地址是:https://github.com/guolindev/android-dev-challenge-compose