从零开始的Android新项目1 - 架构搭建篇
记录一下新项目的搭建。
试想一下,如果没有历史负担,没有KPI压力,去新搭建一个项目,你会怎么设计和实现呢?
本系列文章不是教你怎么从0开始学Android,从0开始怎么建一个项目,而定位于零负担的情况下,在2016年怎么去创建一个好的Android项目,其中一部分技术并不太适合刚入门的初学者。
Application specific
类似clean architecture,分为三层 presentation - data - domain。
关于Clean Architecture由于国内的一些文章和项目都多少有偏离和错误,建议直接看
- http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/
- http://fernandocejas.com/2015/07/18/architecting-android-the-evolution/
两篇文章。
domain为纯领域模型,是Java library,包含了use case(Interactor)、DO、repository接口等domain package,目标是在任何Java语言的平台上都能直接使用,所以必须是平台无关,对平台没有任何依赖,能使用Java的方法(JUnit + Mockito)来直接进行测试。
data为domain的实现,是Android library,从MVP的角度来说,即是M层,内部隐藏所有数据细节,cache、数据库、网络、PO、exception(根据业务特点自定义的exception)、repository的具体实现(内部屏蔽数据细节,可能来自网络、数据库、缓存等)。使用Robolectric 3 + JUnit + Mockito进行集成测试。
presentation即展示层,是Android application module,对data不存在实际感知,依赖仅仅是Dagger注入的实例化,所有访问都通过接口进行,可见的是domain里的接口。包含了error message factory(所有exception都会被factory生成对应的message)、DI、mapper(vo转换)、VO(data binding进行MVVM)、navigation、presenter(不强制,仅在一些特别复杂的场景引入)、usersystem、utils(业务相关)、view(activity、fragment、adapter等)、application实现、业务常量等。可以使用Espresso和Android Instrumentation进行UI测试。
整个项目类似MVP+MVVM的混合(谁跟你说的MVP和MVVM是互斥的?),不过P层不一定存在,以避免为了模式而模式所导致的开发压力。
Common libraries
aar依赖以避免对编译速度造成影响,不过这里比较巧妙的是依赖作为module引入,所以当需要源码依赖的时候在build.gradle里进行注释/反注释就能迅速切换,十分方便。
lib_uiframework: UI framework,包含了各种Base类,如BaseActivity、BaseFragment、Navigator(应用中的一切通过scheme跳转)、ActivityManager、FragmentBackHelper等。
lib_uikit: 各种自定义view、第三方view的gradle或者源码依赖。
lib_im: 即时通讯库。
lib_component: 组件库,如cache、gif、ClassLoaderInjecter、Log、SP、Web等。
lib_authorize: 第三方认证(登陆),目前包括QQ、微信、微博、LinkedIn。
lib_share: 第三方分享,目前包括QQ、微信、微博。
…等等
Third party libraries
Dagger, jsr250: 依赖注入框架让我们省了很多代码,jsr250则是Dagger注入时的一个annotation根据,我们的domain依赖了jsr250。
Rx大家族: RxJava, RxAndroid, RxBinding。新时代Android开发必备,还用说吗?
Retrofit: 装逼,喔,不对,高效率开发必备的网络框架。使用注解生成API,方便极了。我这里的实践是根据业务划分多个API接口,然后通过Dagger module进行实例化注入。
EventBus: 有了RxJava还要EventBus?当然,事件并不总是一对一的,也不总是流式的(可能是持续被动的)。举个简单的例子,feed详情信息更新后(比如点赞数据),外部可能有2个timeline页面也需要更新这个数据,这个时候EventBus就可以优雅地进行事件广播。
Realm:一个不依赖于SqlLite的ORM库,特点就是…快。还有同时有多个平台的方案: ReactNative, OC, Swift, Java…
Google Support库, data binding: Google家的,不用说了吧。
LeakCanary, BlockCanary: 开发阶段必备工具,前者是square家检测内存泄露的,后者是我自己做的卡顿检测工具。
Glide, Glide Transformation: 不折腾fresco,乖乖用Glide。
转载:http://blog.zhaiyifan.cn/2016/03/14/android-new-project-from-0-p1/
从零开始的Android新项目1 - 架构搭建篇的更多相关文章
- fir.im Weekly - 从零开始创建 Android 新项目
今年的 Google I/O 大会上,人工智能和虚拟现实的产品发布让我们对未来多了几分惊喜.对于开发者部分,Google 发布了 Android N 系统,感受最深的是全新的 Android Stud ...
- Android新项目GBSS:第1篇 搭建开发环境
最近接手一个Android新项目,之前也没做过这方面的开发,算是边学边干,这两天看了一下Android开发的书,大致入门了一点,今天把所需要的软件都下了下来,准备开工,先列一下开发环境: 所有的软件都 ...
- <正则吃饺子> :关于新项目的环境搭建(一)
来到新的公司,需要使用myeclipse.maven.svn.tomcat.mysql: 对于先前一直只用 netbeans 的我,在这里把环境搭建 的情况记录下来.来加深自己的学习和帮助后来者. 第 ...
- 从零開始的Android新项目7 - Data Binding入门篇
Data Binding自从去年的Google I/O公布到至今,也有近一年的时间了.这一年来,从Beta到如今比較完好的版本号.从Android Studio 1.3到如今2.1.2的支持,能够说D ...
- 创建一个ArcGIS for Android 新项目并显示出本地的地图
1.准备工作:首先要配置好android的开发环境,然后在Eclipse中安装ArcGIS for Android的开发控件:在ArcCatalog中发布好本地的地图服务. 2.安装完ArcGIS f ...
- 从零开始学android开发-项目打包发布
右键项目 选择[android tools]-[export signed application package] 点击[next] 如果没有keystore可以选择[create new keys ...
- 从零开始学android开发-项目重命名
--修改项目名称 选中项目-[refactor]-[rename] --修改package名称 选中需要重命名的包-[refactor]-[rename] --修改gen下面的名称 打开Android ...
- 从零开始学android开发-项目debug
在红框处能看到变量值
- Android开源项目发现---TextView,Button篇(持续更新)
android-flowtextview 文字自动环绕其他View的Layout 项目地址:https://code.google.com/p/android-flowtextview/ 效果图:ht ...
随机推荐
- yum安装高版本mysql(5.5)
1.导入第三方源webtatic rpm -Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm 2.如果已安装低版本的mysql就删除 yum r ...
- NOIp 2014 #5 解方程 Label:数论?
题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .i ...
- 洛谷 P1074 靶形数独 Label:search 不会
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- [题解+总结]NOI2015
// 此博文为迁移而来,写于2015年7月20日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6u7.html 1.总 ...
- JSP 基础概念归纳 5分钟看完
1. 符合 j2ee 标准的 web-app 的目录结构 WEB-INF classes web.xml lib servlet 开发过程 从 httpservlet 继承, 重写 doget / d ...
- Android -- ProgressBar(进度条的使用)
我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其他的需求,今天这一讲就是如何控制Android应用程序的窗体显示. requestWindowFeature可以设置的值有:(具 ...
- Android -- 重设字符并统计原字符以及修改字符的长度以及位置
1. 效果图
- Linux分区练习(1)
1.作业描述: 4个主分区. 具体实现过程: 打开Linux,在终端中输入:fdisk -uc /dev/sda 可以查看到 :Command (m for hel ...
- upload控件上传json文件合并的两种方法
方法一: byte[] byte1 = FileUpload1.FileBytes; byte[] byte2 = FileUpload2.FileBytes; byte[] a1 = Encodin ...
- Spring中@Async用法总结
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3. ...