稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是 Android 知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!
英文原文:What 2 Years of Android Development Have Taught Me the Hard Way
我仍记得 2014 年我决定做安卓开发的那天,这是我一生中做出的最好决定之一。到现在已经有 2 年半了,
最初的时候,并没有人告诉我如何做才是正确的。我犯了很多错误,浪费了很多时间。
一年半之后,我有机会和一个真正有才而且经验丰富的安卓开发者一起工作,他指导我,教我正确的做事方式。这期间我学到了很多东西,学会了该做什么不该做什么。
我直接或者间接帮助其它开发者也有很长一段时间了。这里是我的 StackOverflow 和 Github 的简介。
本文我将分享这几年所收集的精华。也许可以帮助某人更快上手,避免重复我犯的错误。
1. 不要重复造轮子
最初,我有一种不愿使用开源库的思想。不管需要什么,我总想自己去实现。这是一种非常可怕的思想。
如果在开发 app 的时候遇到一个问题,而这个问题已经被别人很好的解决了,为什么不使用它呢?你可以节省大量时间啊。
把更多的精力花在 app 的业务逻辑上吧。如果你想在 app 中发起一个网络调用,是不需要自己去造一个 Retrofit 来的。
Bonus:Android Arsenalmaintains a database of almost all Android libraries ever made. Go check it out.
2. 别盲目的选择 library
在 Github 上有许多免费使用的开源库,但是别因太激动而盲目的使用。
检查 library 的 star 数目,越多越好。看看作者是否还创建了其它的一些受欢迎的库。查看 issues(打开和关闭的都看),这可以让你对这个 library 的健壮性和稳定性有更好的了解。
如果你时间充足,你应该深入这个库的代码看看它到底是都真的值得使用。
你只需要确保它的代码是可靠的,bug 不多的,高质量的。
小贴士:使用 Dryrun 的命令行尝试任何 library。
3. 坐下来,喝杯咖啡,阅读更多的代码
我们在阅读别人代码上花的时间比自己写代码的时间多得多,如果你不是的话,从今天就开始做吧。
不管你现在能写出什么样的代码,总是因为在某年某月你阅读和学习到了什么东西。它只是你已有知识的反映。
安卓的伟大之处就在于它是一个完全开源的平台。可以去深入研究这些代码看看他们是如何实现 framework 的。Github 中有成千上万的开源库,只需选择一个看看人家是如何实现的,
福利:这里是一些最佳 library 的列表,这里是几乎所有开源安卓 app 的列表。
4. 看在上帝的份上,维护一个恰当的编程规范吧
如果把编码比作写作,那么编程规范就是你的书法水平。
就跟你阅读别人的代码一样,别人也会阅读你的代码,我想你也不想把别人吓到是吧?如果你在一个公司,需要和同事协同工作,那么务必重视这个问题。
编写简短,干净,可读性强的代码可以让你和别人读代码的时候很享受。代码应该读起来像是读故事一样。
代码是诗。
如果你写了一段代码结果你的同事几天都不跟你说话,怨不得别人。
5. 你需要 ProGuard,是的,你真的需要!
绝对不要犯还没有使用 ProGuard 的情况下就在 Play Store 上发布 app 的错误。ProGuard 不仅仅减小了你的代码,还混淆了代码,让逆向工程师更难理解和复制。
它是 Android SDK 附带的,完全免费,因此没有理由不用。
我曾见过几个开发者没有使用 ProGuard 就把 app 发布了。对于一个技术很普通的黑客来说破解你的 app 也就是几个小时的事情。
小贴士:但是如果你需要顶尖的安全性,ProGuard 就力不从心了,你需要 DexGuard。
6. 使用一个恰当的架构
你永远都会庆幸自己从一开始就选择了一个恰当的架构。
你可以使用 MVP (Model-View-Presenter)架构,它可以把你的代码解耦成不同的层便于管理,从而提高代码的灵活性并极大的减小维护的时间成本。
可以参考一个 demo 项目。如果觉得很难掌握,可以看看这篇针对初学者的指南。
福利:务必看看这里,这里尤其是这里。它们将为你实现 MVP 提供极大的帮助。
7. 用户界面就像笑话,如果还需要解释那就糟糕了
如果你是在公司,做的是纯安卓开发,你很可能不需要关心这个问题,因为有 UI/UX 设计师管这个问题。
但是如果你是一个独立开发者,你就需要考虑它了。我曾经见过一些把 app 功能做的很好,但是用户体验很恐怖的开发者。
要设计一个干净,简单直观的界面,你不要站在开发者的角度思考问题,而要挖掘自己内心中埋藏的设计师的潜力。
尽量尝试设计一个漂亮的界面,让你的用户持续保持印象,这样用户回到你的 app 的次数就比别人多,从而产生更多的收获(也许是购买高级版本)。
你应该乐于去减少元素,而不是增加。保持简洁和小巧。
福利:你可以从 Dribble 或者 MaterialUp 的热门设计师那里获得灵感。如果你对设计感兴趣,你很可能会喜欢这本书。
8. 分析是你最好的朋友
如果你想创建一个真正令人惊叹的 app,你需要重度依赖分析工具去分析 app 不同部分的性能和用例。
对于分析,我借助于 crash reporting 和 app usage tracking。
不管你怎么做,永远无法做到完美。当真实的用户开始在各种各样的设备以及版本上使用你的 app 的时候,你会发现即时写的最好的代码也难以保证不出岔子。
一旦发生崩溃,Crash reporting 工具可以帮助你跟踪与修复它们。
你必须学会像销售那样思考问题并分析 app 不同模块的使用。这样可以帮助你减小产品和用户实际需求之间的落差。
小贴士:使用 FirebaseCrash Reporting 以及 Analytics tools。
9. 做一个营销专家
如果你是一个个人开发者,你必须超出作为开发者的思维,去理解市场。
我见过一些很好的产品因为缺乏正确的市场营销而失败,同时也见过并不怎么样的产品因为牛逼的市场营销而取得极大成功。
如果你对你的工作是认真的希望它能获得可观的用户,你必须把在市场营销上花费必要的时间和金钱。但是在营销活动开始之前,确保 app 已经完全稳定,功能已经完善。
花时间研究谁是你的竞争对手以及如何打败他们。确定一个可以立即打败的以及一个将来会打败的。
小贴士:这里是一个价钱合理的市场分析工具,我比较喜欢用。
10. 是时候优化你的 app 了
这是一个大多数人都不会去做的事情,但是你应该做。
写代码与写高性能的代码之间有很大的区别。高性能的代码是指运行速度快,内存和存储消耗更少的代码。
一个未经优化的的 app 也许在普通情况下运行良好,但是当放在各种压力情景中,它就原形毕露了。检查你 app 的内存使用情况看看有没有内存泄漏存在。记住小漏不补沉大船。花时间弄懂 Java 的内存回收机制是怎么回事,创建并分析你的活对象。
小贴士:可以使用 Leak Canary 检测你的内存泄漏。它可以节省你不少时间。
11. 每周在 Gradle 编译上最少节省 5 小时
你极有可能正在使用 Android Studio 开发 app,编译系统使用的是 Gradle。Gradle 很棒但是也很慢,当项目显著增大的时候慢得根蜗牛样。
有时候工作忙的时候我还需要在 Gradle 编译上浪费差不多一个小时。
但是,总有加速的办法。
你可以照着这篇以及这篇文章的做法显著提高编译速度。经过优化之后我的编译时间从 4 分钟降到了 30 秒钟。
12. 测试,测试,再测试!
没有什么比测试更重要的了。它应该是你的首要任务。
尽可能全面的测试你的 app。花时间写自动化测试用例,创造各种极端的条件,看看你的 app 是否能经受住考验。
我曾经犯过未经充分测试就发布 app 的错误。等用户报告 bug 然后修复。
绝对不要那样做。你可能通过砍掉测试时间而节省了一两天或者一周,但是以后你很可能会花双倍的时间。
做任何事都要不慌不忙,从容应对并长远打算。做一个有远见的人。此时播种,以后总会有收获。
13. 安卓的碎片化是魔鬼
碎片化可能是安卓最大的问题了。而谷歌似乎并不愿意修复它,你必须适应。
安卓设备种类繁多,不同屏幕尺寸,不同硬件配置以及各个厂商的自定义系统。
除此之外,谷歌在不同版本上还莫名其妙的添加或者删除 API,进一步加重了你的工作量(这里是一个例子)。
比如,几乎每个开发者都需要使用 SharedPreferences API 来完成一个 app,它是如此常见,但是在 Android 2.2 版本的 Samsung Galaxy S 上还是出问题了(bug 报告这里)。
花更多的时间为不同屏幕尺寸的设备创建不同的布局。在不同版本,不同定制,不同 OEM 厂商的设备上测试。
永远别觉得某个东西看似可行就不去测试了。
14. 从今天开始使用 git!
如果你还没有使用 Git,从现在开始吧。
当我开始安卓开发的时候,悲剧的我并不知道 git 是什么东西。我每天都拷贝整个项目,一个备份在硬盘上,一个备份在云盘上。看起来很傻是吗?是的,的确很傻。
Git 可以极大的提高你的工作效率。如果叫我说出一个我每天都要使用并且离不开的工具的名字,那就是 Git 了。
在你使用几天之后,你很可能会爱上它,并好奇 Git 的内部工作原理。建议你看看这个。
过了一段时间之后,你可能开始了一个大项目,对于如何维护一个分支模型感到困惑,那么可以看看这个。
福利:如果你刚刚开始,还付不起 GitHub 的私人仓库的月费,你可以试试 BitBucket。国内用户的选择更多,oschina 的 git 服务也不错-译者注。
15. 为黑客制造麻烦
安卓的开源特性让其易受攻击。每个安卓 app 都可以轻易的被反编译,逆向分析。
你不希望你的 app 发生这种事对吧?
你需要知道如何安全的存储 app 中的 API keys。如果你要处理用户的敏感数据,你必须知道如何加密,选择何种加密算法(安全且快速)。
你还应该安全的把密钥存储在本地或者服务器上。应该防止 app 数据被人用 ADB 备份。如果你在数据库中存储敏感数据,要考虑做适当的伪装。
如果你的 app 有高级版本,被别人破解免费发布就损失大了。
有几种方法可以避免你的 app 被人篡改。但并不是 100&安全。任何一个技术扎实,决心坚决的黑客只要有正确的资源,工具和耐心都可以破解你的 app。
你能做的就是尽量让黑客的破解变得困难,及其困难。
16. 在低端手机上开发
每个人都喜欢使用一个高端安卓手机,我也是。但是记得只作为个人使用,而不是开发的目的。
高端机会隐藏 app 的许多缺陷。假设你在 UI 线程上做了导致卡顿的事情,但是因为手机过于强大,可能导致你无法察觉。
17. 学习设计模式
这是一项终生受益的投资。
在开发大型 app 的时候,你会遇到一些已经被比你牛逼的人所解决了的问题。
从今天开始就花点时间去学习设计模式。Here 是一个演示了所有已知设计模式的的 Github 项目。
可以从最常见的开始,比如单例,适配器模式,工厂方法模式,迭代模式,依赖注入模式,事件驱动架构,建造者模式,回调,策略模式,外观模式以及生产消费者模式。
看起来很多是吧?实际上并不多。一旦深入你就会爱上它们的。
小贴士:阅读一些书籍,比如 GoF 的 Design Patterns,Martin Fowler 的重构以及 Joshua Bloch 的 Effective Java。
18. 回馈
你得承认,我们都曾从别人和互联网那得到许多帮助。
每当你遇到问题的时候,你会做的第一件事就是谷歌,发现第一条来自 StackOverflow 的链接。有时候你很忙,结果直接拷贝粘贴得分最高的答案。
你有没有想过 Github 上那些开源库其实也是别人花时间创建然后贡献给社区的。
当你被一个难以理解的概念卡住或者遇到一个新的东西时,你发现一篇让你豁然开朗的博客,这个时候记住是某人牺牲了约炮时间而写了这篇文章。
所以也该你回馈了。给予的越多,得到的也就越多。
我们都忙于自己的工作,很难找到时间为别人做什么事情。但是尽量每周找点时间做点贡献让安卓社区更丰富。
我已经分享了自己短暂的安卓生涯中所学到的一些东西。我将继续下去,学更多,分享更多。希望能为别人的生活带来微小的帮助。