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