微信号:programmer_club

介绍:程序员第一自媒体,与你探讨码农人生路上遇到的各类泛技术话题,定期为你推荐码农人生思考、感悟以及启迪!

一个 2 年 Android 开发者的 18 条忠告

2017-04-18 22:01 程序员之家

原文:What 2 Years of Android Development Have Taught Me the Hard Way 

译文:http://www.jcodecraeer.com/a/

anzhuokaifa/androidkaifa/2016/1006/6659.html

译者:泡在网上的日子

点击文末阅读原文即可前往) 



我仍记得2014年我决定做安卓开发的那天,这是我一生中做出的最好决定之一。到现在已经有2年半了,最初的时候,并没有人告诉我如何做才是正确的。我犯了很多错误,浪费了很多时间。 



一年半之后,我有机会和一个真正有才而且经验丰富的安卓开发者一起工作,他指导我,教我正确的做事方式。这期间我学到了很多东西,学会了该做什么不该做什么。


我直接或者间接帮助其它开发者也有很长一段时间了。这里是我的StackOverflow注1)和Github注2)的简介。


本文我将分享这几年所收集的精华。也许可以帮助某人更快上手,避免重复我犯的错误。


注1:https://github.com/aritraroy

注2:http://stackoverflow.com/users/2858654/aritra-roy



1. 不要重复造轮子


最初,我有一种不愿使用开源库的思想。不管需要什么,我总想自己去实现。这是一种非常可怕的思想。


如果在开发app的时候遇到一个问题,而这个问题已经被别人很好的解决了,为什么不使用它呢?你可以节省大量时间啊。


把更多的精力花在app的业务逻辑上吧。如果你想在app中发起一个网络调用,是不需要自己去造一个Retrofit注3)来的。


福利:Android Arsenal注4)网站维护了一个几乎包含所有Android library的数据库,可以去看看。


注3:https://github.com/square/retrofit

注4:https://android-arsenal.com/



2. 别盲目的选择library


在Github上有许多免费使用的开源库,但是别因太激动而盲目的使用。


检查library的star数目,越多越好。看看作者是否还创建了其它的一些受欢迎的库。查看issues(打开和关闭的都看),这可以让你对这个library的健壮性和稳定性有更好的了解。


如果你时间充足,你应该深入这个库的代码看看它到底是都真的值得使用。


你只需要确保它的代码是可靠的,bug不多的,高质量的。


小贴士:使用Dryrun注5)的命令行尝试任何library。


注5:https://github.com/cesarferreira/dryrun




3. 坐下来,喝杯咖啡,阅读更多的代码


我们在阅读别人代码上花的时间比自己写代码的时间多得多,如果你不是的话,从今天就开始做吧。


不管你现在能写出什么样的代码,总是因为在某年某月你阅读和学习到了什么东西。它只是你已有知识的反映。


安卓的伟大之处就在于它是一个完全开源的平台。可以去深入研究这些代码看看他们是如何实现framework的。Github中有成千上万的开源库,只需选择一个看看人家是如何实现的。


福利:这里注6)是一些最佳library的列表,这里注7)是几乎所有开源安卓app的列表。


注6:https://snowdream.github.io/awesome-android/

注7:https://github.com/pcqpcq/open-source-android-apps



4. 看在上帝的份上,维护一个恰当的编程规范吧


如果把编码比作写作,那么编程规范就是你的书法水平。


就跟你阅读别人的代码一样,别人也会阅读你的代码,我想你也不想把别人吓到是吧?如果你在一个公司,需要和同事协同工作,那么务必重视这个问题。


编写简短,干净,可读性强的代码可以让你和别人读代码的时候很享受。代码应该读起来像是读故事一样。


代码是诗。


如果你写了一段代码结果你的同事几天都不跟你说话,怨不得别人。


福利:你应该从通读这个注8)和这个注9)开始。


注8:https://source.android.com/source/code-style.html

注9:https://github.com/ribot/android-guidelines/blob/master/project_and_code_guidelines.md



5. 你需要ProGuard,是的,你真的需要!


绝对不要犯还没有使用ProGuard的情况下就在Play Store上发布app的错误。ProGuard不仅仅减小了你的代码,还混淆了代码,让逆向工程师更难理解和复制。


它是Android SDK附带的,完全免费,因此没有理由不用。


我曾见过几个开发者没有使用ProGuard就把app发布了。对于一个技术很普通的黑客来说破解你的app也就是几个小时的事情。


小贴士:但是如果你需要顶尖的安全性,ProGuard就力不从心了,你需要DexGuard注10)。


注10:https://www.guardsquare.com/dexguard



6. 使用一个恰当的架构


你永远都会庆幸自己从一开始就选择了一个恰当的架构。


你可以使用MVP (Model-View-Presenter)架构,它可以把你的代码解耦成不同的层便于管理,从而提高代码的灵活性并极大的减小维护的时间成本。


可以参考一个demo项目注11)。如果觉得很难掌握,可以看看这篇针对初学者的指南注12)。


福利:务必看看这里注13),这里注14)尤其是这里注15)。它们将为你实现MVP提供极大的帮助。


注11:https://github.com/android10/Android-CleanArchitecture

注12:https://medium.com/@dmilicic/a-detailed-guide-on-developing-android-apps-using-the-clean-architecture-pattern-d38d71e94029#.plhx8vhi3

注13:https://github.com/antoniolg/androidmvp

注14:https://github.com/sockeqwe/mosby

注15:https://github.com/googlesamples/android-architecture





7.用户界面就像笑话,如果还需要解释那就糟糕了


如果你是在公司,做的是纯安卓开发,你很可能不需要关心这个问题,因为有UI/UX设计师管这个问题。


但是如果你是一个独立开发者,你就需要考虑它了。我曾经见过一些把app功能做的很好,但是用户体验很恐怖的开发者。


要设计一个干净,简单直观的界面,你不要站在开发者的角度思考问题,而要挖掘自己内心中埋藏的设计师的潜力。


尽量尝试设计一个漂亮的界面,让你的用户持续保持印象,这样用户回到你的app的次数就比别人多,从而产生更多的收获(也许是购买高级版本)。


你应该乐于去减少元素,而不是增加。保持简洁和小巧。


福利:你可以从Dribble或者MaterialUp注16)的热门设计师那里获得灵感。如果你对设计感兴趣,你很可能会喜欢这本书注17)。


注16:http://materialup.com/

注17:https://www.amazon.com/Design-Everyday-Things-Revised-Expanded/dp/0465050654



8. 分析是你最好的朋友


如果你想创建一个真正令人惊叹的app,你需要重度依赖分析工具去分析app不同部分的性能和用例。


对于分析,我借助于crash reporting和app usage tracking。


不管你怎么做,永远无法做到完美。当真实的用户开始在各种各样的设备以及版本上使用你的app的时候,你会发现即时写的最好的代码也难以保证不出岔子。


一旦发生崩溃,Crash reporting工具可以帮助你跟踪与修复它们。

你必须学会像销售那样思考问题并分析app不同模块的使用。这样可以帮助你减小产品和用户实际需求之间的落差。


小贴士:使用FirebaseCrash Reporting注18)以及Analytics tools。


注18:https://firebase.google.com/



9. 做一个营销专家


如果你是一个个人开发者,你必须超出作为开发者的思维,去理解市场。


我见过一些很好的产品因为缺乏正确的市场营销而失败,同时也见过并不怎么样的产品因为牛逼的市场营销而取得极大成功。


如果你对你的工作是认真的希望它能获得可观的用户,你必须把在市场营销上花费必要的时间和金钱。但是在营销活动开始之前,确保app已经完全稳定,功能已经完善。


花时间研究谁是你的竞争对手以及如何打败他们。确定一个可以立即打败的以及一个将来会打败的。


小贴士:这里注19)是一个价钱合理的市场分析工具,我比较喜欢用。


注19:https://sensortower.com/



10. 是时候优化你的app了


这是一个大多数人都不会去做的事情,但是你应该做。


写代码与写高性能的代码之间有很大的区别。高性能的代码是指运行速度快,内存和存储消耗更少的代码。


一个未经优化的的app也许在普通情况下运行良好,但是当放在各种压力情景中,它就原形毕露了。检查你app的内存使用情况看看有没有内存泄漏存在。记住小漏不补沉大船。花时间弄懂Java的内存回收机制是怎么回事,创建并分析你的活对象。


小贴士:可以使用Leak Canary注20检测你的内存泄漏。它可以节省你不少时间。


注20:https://github.com/square/leakcanary



11. 每周在Gradle编译上最少节省5小时


你极有可能正在使用Android Studio开发app,编译系统使用的是Gradle。Gradle很棒但是也很慢,当项目显著增大的时候慢得根蜗牛样。

有时候工作忙的时候我还需要在Gradle编译上浪费差不多一个小时。

但是,总有加速的办法。


你可以照着这篇注21)以及这篇注22)文章的做法显著提高编译速度。经过优化之后我的编译时间从4分钟降到了30秒钟。


注21:https://medium.com/@cesarmcferreira/speeding-up-gradle-builds-619c442113cb#.thj9h2pqd

注22:http://zeroturnaround.com/rebellabs/making-gradle-builds-faster/



12.测试,测试,再测试!


没有什么比测试更重要的了。它应该是你的首要任务。


尽可能全面的测试你的app。花时间写自动化测试用例,创造各种极端的条件,看看你的app是否能经受住考验。


我曾经犯过未经充分测试就发布app的错误。等用户报告bug然后修复。


绝对不要那样做。你可能通过砍掉测试时间而节省了一两天或者一周,但是以后你很可能会花双倍的时间。


做任何事都要不慌不忙,从容应对并长远打算。做一个有远见的人。此时播种,以后总会有收获。



13. 安卓的碎片化是魔鬼


碎片化可能是安卓最大的问题了。而谷歌似乎并不愿意修复它,你必须适应。


安卓设备种类繁多,不同屏幕尺寸,不同硬件配置以及各个厂商的自定义系统。


除此之外,谷歌在不同版本上还莫名其妙的添加或者删除API,进一步加重了你的工作量(这里(注23)是一个例子)。


比如,几乎每个开发者都需要使用SharedPreferences API来完成一个app,它是如此常见,但是在Android 2.2版本的Samsung Galaxy S 上还是出问题了(bug报告这里(注24))。


花更多的时间为不同屏幕尺寸的设备创建不同的布局。在不同版本,不同定制,不同OEM厂商的设备上测试。


永远别觉得某个东西看似可行就不去测试了。


注23:https://plus.google.com/+TodLiebeck/posts/gjnmuaDM8sn

注24:https://code.google.com/p/android/issues/detail?id=14359



14. 从今天开始使用git!


如果你还没有使用Git,从现在开始吧。


当我开始安卓开发的时候,悲剧的我并不知道git是什么东西。我每天都拷贝整个项目,一个备份在硬盘上,一个备份在云盘上。看起来很傻是吗?是的,的确很傻。


Git可以极大的提高你的工作效率。如果叫我说出一个我每天都要使用并且离不开的工具的名字,那就是Git了。


在你使用几天之后,你很可能会爱上它,并好奇Git的内部工作原理。建议你看看这个注25)。


过了一段时间之后,你可能开始了一个大项目,对于如何维护一个分支模型感到困惑,那么可以看看这个注26)。


福利:如果你刚刚开始,还付不起GitHub的私人仓库的月费,你可以试试BitBucket注27)。国内用户的选择更多,oschina的git服务也不错-译者注。


注25:http://www.gitguys.com/

注26:http://nvie.com/posts/a-successful-git-branching-model/

注27:https://bitbucket.org/



15.为黑客制造麻烦


安卓的开源特性让其易受攻击。每个安卓app都可以轻易的被反编译,逆向分析。


你不希望你的app发生这种事对吧?


你需要知道如何安全的存储app中的API keys。如果你要处理用户的敏感数据,你必须知道如何加密,选择何种加密算法(安全且快速)。


你还应该安全的把密钥存储在本地或者服务器上。应该防止app数据被人用ADB备份。如果你在数据库中存储敏感数据,要考虑做适当的伪装。


如果你的app有高级版本,被别人破解免费发布就损失大了。


有几种方法可以避免你的app被人篡改。但并不是100&安全。任何一个技术扎实,决心坚决的黑客只要有正确的资源,工具和耐心都可以破解你的app。


你能做的就是尽量让黑客的破解变得困难,及其困难。


福利:可以从阅读这个注28)和这个注29)开始。


注28:https://www.airpair.com/android/posts/adding-tampering-detection-to-your-android-app

注29:https://rammic.github.io/2015/07/28/hiding-secrets-in-android-apps/



16. 在低端手机上开发


每个人都喜欢使用一个高端安卓手机,我也是。但是记得只作为个人使用,而不是开发的目的。


高端机会隐藏app的许多缺陷。假设你在UI线程上做了导致卡顿的事情,但是因为手机过于强大,可能导致你无法察觉。





17. 学习设计模式


这是一项终生受益的投资。


在开发大型app的时候,你会遇到一些已经被比你牛逼的人所解决了的问题。


从今天开始就花点时间去学习设计模式。Here注30)是一个演示了所有已知设计模式的的Github项目。


可以从最常见的开始,比如单例,适配器模式,工厂方法模式,迭代模式,依赖注入模式,事件驱动架构,建造者模式,回调,策略模式,外观模式以及生产消费者模式。


看起来很多是吧?实际上并不多。一旦深入你就会爱上它们的。


小贴士:阅读一些书籍,比如GoF的 Design Patterns,Martin Fowler的重构注31) 以及Joshua BlochEffective Java注32)。


注30:https://github.com/iluwatar/java-design-patterns

注31:http://www.goodreads.com/book/show/44936.Refactoring

注32:https://github.com/HackathonHackers/programming-ebooks/blob/master/Java/Effective%20Java%20%282nd%20Edition%29.pdf



18. 回馈


你得承认,我们都曾从别人和互联网那得到许多帮助。


每当你遇到问题的时候,你会做的第一件事就是谷歌,发现第一条来自StackOverflow的链接。有时候你很忙,结果直接拷贝粘贴得分最高的答案。


你有没有想过Github上那些开源库其实也是别人花时间创建然后贡献给社区的。


当你被一个难以理解的概念卡住或者遇到一个新的东西时,你发现一篇让你豁然开朗的博客,这个时候记住是某人牺牲了约炮时间而写了这篇文章。


所以也该你回馈了。给予的越多,得到的也就越多。


我们都忙于自己的工作,很难找到时间为别人做什么事情。但是尽量每周找点时间做点贡献让安卓社区更丰富。


我已经分享了自己短暂的安卓生涯中所学到的一些东西。我将继续下去,学更多,分享更多。希望能为别人的生活带来微小的帮助。





微信公众号内回复数字“1”

小编拉你进粉丝微信群

不是在文章评论里回复哦

 
程序员之家 更多文章 程序员,才是世间最寂寞的情圣 自学编程的 6 个技巧总结 这是一个悲伤的程序员爱情故事 总算搞清楚了回车和换行的来历与区别 30分钟掌握 C#7
猜您喜欢 设计消息中间件时我关心什么?(解密电商数据一致性与完整性实现,含PPT) 20个争议最大的编程观点,你认可几点? epoll原理简介 React.js教程: React Properties CDH大数据平台搭建