从零开始的Android新项目1 - 架构搭建篇

记录一下新项目的搭建。

试想一下,如果没有历史负担,没有KPI压力,去新搭建一个项目,你会怎么设计和实现呢?

本系列文章不是教你怎么从0开始学Android,从0开始怎么建一个项目,而定位于零负担的情况下,在2016年怎么去创建一个好的Android项目,其中一部分技术并不太适合刚入门的初学者。

Application specific

类似clean architecture,分为三层 presentation - data - domain。

关于Clean Architecture由于国内的一些文章和项目都多少有偏离和错误,建议直接看

两篇文章。

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/

时间: 2024-10-29 19:10:35

从零开始的Android新项目1 - 架构搭建篇的相关文章

从零开始的Android新项目11 - 组件化实践(1)

最近更新不太频繁,一方面工作上比较忙,除了 Android 也在负责前端,另外周末和深夜也在帮人做 Go 后台.设计技术方案.管进度的事情(因为报酬不错没忍心拒绝,而且确实对个人成长还有帮助),所以实在对不住. 另外,文章最底下有捐款啊,最近真是都没钱吃饭了... 前言 这里的组件化,指的是 MDCC 2016 上冯森林提出的<回归初心,从容器化到组件化>. 我个人一直是比较反感黑科技的,其中首当其冲的就是 插件化 以及 保活.作为一个开发者,除了研究技术,提高自己以外,是否应该考虑些其他东西

从零开始的Android新项目10 - React Native &amp; Redux

本篇来讲讲 React Native 和 Redux,和其他一上来就啪啪啪丢上来一堆翻译的东西不同,本文会从简单的例子入手,让大家能快速地明白 React Native 是什么,Redux 和常见的 MVC.MVP 等有什么区别,怎么去组织一个 Redux 架构的 React Native 项目. 为避免大家还没入门就放弃,预计下一篇才会从我们项目中的实践出发,讲讲更复杂的应用场景. 什么是React Native React Native 使你能够基于 JavaScript 和 React 在

Android新项目:第2篇 数据库设计

今晚设计了一晚上的数据库,用了一下MyEclipse workbench,感觉小屏幕电脑用的太不爽了,一堆的窗口挤在一起. 整理一下遇到的零碎的东西: 字段约束: PK:belongs to primary key:主键 NN:not null:不能为空 UQ:unique index:唯一 BIN:is binary column:此列为二进制数据 UN:unsigned data type:无符号数据类型 ZF:fill up values for that column with 0's

还是关于新项目的 架构问题

1.为了开发与项目的 代码结构,使用maven的聚合. 2.commans类,过滤器,监听器. 3.维护hq-utils的jar包. 4.web 总的 ,各配置文件 如spring  struts2的配置文件,都在自己的各项目下,创建一个配置文件, 在web总的项目下进行引用.spring_*类似这样的写法. 5.类与jsp有冲突,jsp如何调用类,类与jsp不在一个项目中,如何进行调用. 6.快照版本与正式版本的 区别? 7.war与jar的区别? 8.web总的 与另外一个总 的编译打包的区

新项目的架构(杂记)

虽然开发快两年了,但是对于架构理解的还不够深刻.网上也看了VIPER.MVVM,还有一些人根据MVC演变的架构等.自己的项目用的是MVVM,我自身感觉VM承载的代码还不算很多.多数还是在VC中完成的,自己框架中VM还是比较轻的. 由于新项目长远打算,以后每个模块任意组合都能形成一个应用,且以后我们会找代理商,于是就把每个模块打包成一个Framework.首先,亲身体会是打包成framework,文件之间切换太累了,尤其一个人负责这些模块. 新项目引用了cocospod管理第三方库,这个真是太方便

Android新项目GBSS:第3篇 Tomcat连接数据库[天坑,耗了1天才过关]

搭建好了开发环境,设计好了数据库,接下来该连接数据库了,这一块细节也基本上忘光,只能求助于Google了,大天朝最近围墙建的越来越高,Google基本处于不可用状态,SBBD又只能用来搜广告,谁能拯救我等屌丝码农. 步骤1:将mysql-connector-java-5.1.34-bin.jar复制到$CATALINA_HOME/lib文件夹下.下表列出了MySQL JDBC官方驱动和MySQL Server的版本对应关系[突然发现:有时候上QQ只是为了截图] 步骤2:配置JNDI数据源和连接池

新项目开发环境搭建遇到的问题排查(cannot assign requested address)

背景 搭建新的开发环境,机器是pe准备的一虚4 问题 在给机器安装ConfigServer,启动的时候抛异常. 一眼看出来肯定不是端口占用(有同事说是端口占用),心里估摸着应该是ip:port,其中一个的问题. 自然的,先问问"古哥",大多数人触发以上异常是因为短时间内大量的连接到是端口全部被占用. 我遇到的问题,netstat了一下,端口都没有被占用. 又开始郁闷了,到底什么原因导致的? 无意中想到了之前在项目实施过程中,遇到的host配置不对,导致的一系列的问题. 果断的看了看ho

创建一个ArcGIS for Android 新项目并显示出本地的地图

1,我的Android版本是:Android4.4.2. 2,我的ArcgisAndroidSDK是:arcgis-android-sdk-v10.2.3. 一,地图发布 首先需要在ArcCatalog(或Arcgis Server Manager,这个貌似需要将文件夹共享)中,发布地图服务.如何发布就不用说了,需要注意的是: 1)坐标系统选择'Projected Coordinate System'->'World'下的'WGS_1984_Web_Mercator'; 2)需要选择'Servi

从零开始学android开发-项目打包发布

右键项目 选择[android tools]-[export signed application package] 点击[next] 如果没有keystore可以选择[create new keystore],填写location(填写location的时候需要填写到后缀这一层),然后输入password,点击next 填写基本信息,点击next 点击[finish]就可以了,打包完成之后的apk文件就在项目的根目录下找到.