android项目重构
声明:里面的一些图片来自网络,如果有版权问题,我可以删掉
最近在公司主导android项目重构,一下是这次重构中的一些总结,里面包括android项目如何架构,采用什么样的开发模式,都有简略的阐述,分享出来,希望对那些从事android开发的同学有一定的帮助。
当然里面有写的不正确的地方,希望大家可以给我留言,技术是需要探讨,不断学习的过程,没有所谓的最好,只有更好,根据不同的android项目,项目架构也需要做调整,没有一个统一的架构可以适合所有的项目,架构只有是否适合你的项目,没有所谓的对与错。
目前大部分android项目,网络访问和图片显示比较平凡,所以数据访问和图片加载是重点,也是容易导致app oom的地方。
目前大部分公司采用的是组件化开发和插件化开发
组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Module),开发的过程中我们可以让这些组件相互依赖或者单独调试部分组件等,但是最终发布的时候是将这些组件合并统一成一个apk,这就是组件化开发。
插件化开发和组件化开发略有不用,插件化开发时将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk(组件化的每个模块是个lib),最终打包的时候将宿主apk和插件apk分开或者联合打包。
插件化开发,增加了主应用程序的逻辑难度,技术有难度,目前一些成熟的框架都是闭源的,插件中资源的加载问题,不能很好的解决。里面坑也非常多。
综上所述我认为我们还是采用组件化开发。
大部分android项目是一个数据,业务,显示非常清晰的项目,项目架构,我们采用三层架构,三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer),项目采用MVP模式。、
三层架构和mvp模式整个项目可以分成以下几个部分:
Presentation:负责展示图形界面,并填充数据,该层囊括了View和Presenter。
Domain:负责实现app的业务逻辑,该层中由普通的Java对象组成。
Data:负责提供数据,Android开发中常见的数据来源有,RestAPI、SQLite数据库、本地缓存等。
Library:负责提供各种工具和管理第三方库,现在的开发一般离不开第三方库,这里建议在统一的地方管理(那就是建一个单独的module),尽量保证和Presentation层分开。
各个library的关系Androidstudio project结构如图(主体module,根据项目可以扩充):
主体module包结构图如下:
主要包结构组件化开发比较难解决的问题是页面导航和各个组件之间的通信问题。
页面导航问题,一般要解决一下几方面的需求
1.从外部URL映射到内部页面,以及参数传递与解析
2.跨模块页面跳转,模块间解耦
3.跨模块API调用,通过控制反转来做组件解耦
引用ARouter页面路由框架或者自己写NavigationManager(主要原理Activity的显示调用,隐式调用,uri相结合来进行匹配跳转页面)
组件间通信方式:
1、intentactivity之间的通信
2、Binder activity绑定service
3、Broadcast通信
4、application,sharepreence,文件存储,数据库,contentprovider
5、使用接口,观察者模式,耦合性比较高,接口越来越多,维护比较麻烦
6、socket通信
7、EventBus
前面6种如果用到组件间通信,或多或少都有一定的局限性,自己比较建议使用EventBus来做组件之间的通信,并且目前项目中也在使用,不过使用要有一定的规则,不然导致项目混乱。
因为现在项目中一般会大量引用第三方库,所以挑选第三方库的一些建议
1.项目中确实需要
2.使用的人要多
3.效率和体量的权衡
第三方库尽量二次封装
为了方便更换,有很多原因可能需要你替换项目中的第三方库,这时候如果你是经过二次封装的,那么很简单,只需要在封装类中修改一下就可以了,完全不需要去全局检索代码。
我曾经的项目就有过替换第三方库的经历:
1.替换项目中的统计埋点工具
2.替换网络框架
3.替换日志工具
网络框架使用的是:retrofit+RXjava+okhttp3,这个相对性能,稳定性还是比较高的,建议做优化和二次封装。
图片加载框架使用的是:andriod-universal-image-loader,presco,picasso等做二次封装。
等等还有很多优秀第三方框架,你可以按需引用。
关于整体项目代码,因为涉及公司的机密,不能放出来请大家见谅。
下面是我平时积累的github上star比较多的,项目中也大量使用的,现在放出来给大家分享,架构师需要大量阅读别人的架构思想。如果有需要的可以去github上直接搜索下载。
框架总结
网络框架
Retrofitokhttpdroid-async-httpvolley
图片框架
Glideandriod-universal-image-loaderpicassopresco
数据库框架
Realm-java
图标框架
Mpandroidchart
内存框架
Leakcnary
事件消息框架
eventBus
条码扫描框架
zxing
动画框架
Lottie-androidMaterial-animationsandroidviewanimationsrecyclerview-animatorslistviewanimationstransitions-everywhere
异步框架
Rxjavaagera
UI框架
Material-dialogsviewpagerindicatorflexbox-layoutandroidswipelayout
BaseRecyclerviewadapterhelperandroid-observablescrollviewandroidslidinguppanel
appintroandroid-bootstarp
菜单框架
slidingMenuMaterialDrawerbottmbar
注解框架
Androidannotations
json框架
Fastjson
热修复框架
Tinkerdexposed
架构框架
Android-cleanarchitecture
刷新框架
android-pulltorefresh
数据框架
greenDAO
调试框架
StethologgerAndroidWiFiADBAndroid-Debug-Database
字体框架
Calligraphy
依赖注入框架
Dagger
响应式框架
RxBindingOtto
用例框架
RxJava-Android-Samplesu2020androidmvp
适配框架
AndroidAutoLayout
性能框架
EffectiveAndroidUILitho
插件化框架
DroidPlugindynamic-load-apkatlasSmall
构建框架
buck
权限框架
PermissionsDispatcherRxPermissions
GIF框架
android-gif-drawable
反编译框架
Apktoolclassyshark
手势框架
SwipeBackLayout
测试框架
Android-testingrobolectric
下载框架
FileDownloader
多媒体框架
JieCaoVideoPlayer
编译框架
Freeline
生命周期框架
RxLifecycle
崩溃日志框架
acraCustomActivityOnCrash
文件框架
DiskLruCache
MVP框架
Mosby
混淆框架
AndResGuard
状态栏框架
StatusBarUtil
嵌套框架
Fragmentation
hybrid(混合开发)框架
JsBridge
勋章框架
android-viewbadger
表情包框架
emojicon
多渠道框架
Packer-ng-plugin
多线程框架
Android-priority-jobqueue
加密框架
conceal
页面路由框架
ARouter
多主体框架
MagicaSakura
键盘框架
XhsEmoticonsKeyboard