Android应用-开发框架设计

article/2025/9/24 11:32:02

目录

1. 📂 简介

1.1 背景

1.2 专业术语

2. 🔱 总体设计思想

2.1 分层:组件化设计框架

2.2 分类:应用开发架构图

3. ⚛️ 框架详细设计

3.1 组件化框架外形

3.2 业务模块化

3.3 代码编程框架

4. 💠 框架其他设计

4.1 版本统一控制

4.2 引入部分第三方框架

4.3 封装网络请求框架

4.4 统一应用签名


1. 📂 简介

1.1 背景

        为减少应用开发重复造轮子,于是希望有一套统一的应用框架,可以让应用开发者快速上手开发需求,而无需过多关注应用框架相关内容。

        而且,基于同一套应用框架,有利于同事互相之间的代码Review与维护,也方便后期项目交接。不仅减少开发人员繁复的工作,而且提升整个团队的产研效率。

1.2 专业术语

术语名称

描述

AndroidStudio

简称AS,是Android开发者用来开发应用的一个工具

Retrofit/okhttp3

知名的网络请求框架

Glide

知名的图片加载框架

LiveEventBus

基于LiveData的应用开发事件总线,方便业务间消息通信,有取代EventBus的趋势

MVVM

基于MVC、MVP的一套代码开发框架

Kotlin

Android开发官方推荐语言

2. 🔱 总体设计思想

2.1 分层:组件化设计框架

        我们知道常见的应用开发框架主要有:模块化、组件化、插件化,那么随着各个应用不断的迭代升级,应用的开发框架也从最开始的单App模块到多模块化,再到组件化与插件化。那么对于一般的应用开发框架,应该遵循什么样的设计原则呢?

        首先,我想到的是不能过度设计,一口不能吃一个大胖子,一来就嚷着要做插件化是不太现实的,框架应该跟随应用需求一步步迭代或重构。其次,直接使用AS创建一个新项目,会缺少应用迭代升级的一些常见元素(如常见的Retrofit、Glide、LiveEventBus等三方开源SDK和一些工具类),在后期慢慢引入时很可能会没有必要的重复踩前人走过的坑。于是,依赖于组件化设计思想——无惧应用后期扩展迭代,再结合应用基本所需元素——搭一个轮子减少重复劳动,就设计出本文将要阐述的应用开发框架,具体思想请继续往下看。

2.2 分类:应用开发架构图

        总体方向是:首先建立一个组件化框架的外形架构,然后实现业务模块化,再搭建一套MVVM+Kotlin代码编程框架。

3. ⚛️ 框架详细设计

3.1 组件化框架外形

        以app模块为总入口,作为组件化中提到的壳工程。app模块不应包含相关业务代码,它的主要工作应该是进行Application初始化、依赖各个模块,和声明各模块manifest相关配置。

3.2 业务模块化

        app模块依赖portal业务模块,暂且我们可将所有业务写在portal模块,后期业务壮大后可朝组件化方向再拆分业务模块。

        middleware模块作为中间件层,放置一些模块间共用的元素,那么项目中除middleware模块之外的其他所有模块,如:app模块和portal模块,都应依赖middleware模块。但需注意,随着业务的增长middleware模块可预料的会不断膨胀,所以写业务时需注意解耦,切勿将非模块间公用的元素放进middleware模块。

        portal模块包括主要的业务代码,采用组件化分包方式搭建各业务模块,比如下面这样的包名结构:

  • com.xxx.xxx.portal.feature.home

  • com.xxx.xxx.portal.feature.bt

  • com.xxx.xxx.portal.feature.wifi

3.3 代码编程框架

        各业务模块采用MVVM框架,包结构为:data-model-view-viewmodel

        使用Kotlin语言,依赖于下沉到middleware模块的BaseActivity、BaseFragment,以及ViewBinding,建立起一套如下的代码编程框架:

4. 💠 框架其他设计

4.1 版本统一控制

        根目录新建version.gradle文件,将各类版本号统一放置此处,在其他gradlle脚本通过 apply from: "${rootDir}/version.gradle" 导入使用。

4.2 引入部分第三方框架

        在middleware模块中引入一些应用开发必要的第三方库,主要包括blankj工具包合集、图片加载框架Glide、网络请求框架和相关配置Retrofit/okhttp3、动效加载工具lottie、以及应用开发事件总线LiveEventBus等。

    api "androidx.constraintlayout:constraintlayout:$CONSTRAINTLAYOUT"api "androidx.lifecycle:lifecycle-livedata-ktx:$LIVEDATA"api "androidx.lifecycle:lifecycle-viewmodel-ktx:$VIEWMODEL"api "androidx.viewpager2:viewpager2:$VIEWPAGER2"api "com.blankj:utilcodex:$COM_BLANKJ_UTILCODEX"api "com.github.bumptech.glide:glide:$GLIDE"api "com.squareup.retrofit2:retrofit:$RETROFIT"api "com.squareup.retrofit2:converter-gson:$RETROFIT_CONVERTER_GSON"api "com.squareup.retrofit2:adapter-rxjava:$RETROFIT_ADAPTER_RXJAVA"api "com.squareup.okhttp3:logging-interceptor:$OKHTTP_LOGGING_INTERCEPTOR"api "com.airbnb.android:lottie:$LOTTIE"api "io.github.jeremyliao:live-event-bus-x:$LIVE_EVENT_BUS_X"

4.3 封装网络请求框架

        基于Retrofit/okhttp3,封装出相应的ApiFactory以及BaseModel、BaseViewModel,方便基于MVVM项目访问网络,本应用开发框架中已包含整套网络请请求和处理的编程范式,具体可参考如下代码:

Model层:

interface MainApi {// 随机获取1张猫图(GET):https://api.thecatapi.com/v1/images/search?limit=1@GET("v1/images/search")suspend fun getCat(@QueryMap hashMap: HashMap<String, String>): List<CatBean>
//    suspend fun getCat(@QueryMap hashMap: HashMap<String, String>): BaseResponse<CatBean>}class MainModel : BaseModel<MainApi>() {override fun createApi(): Class<MainApi> = MainApi::class.java//    suspend fun getCat(hashMap: HashMap<String, String>): BaseResponse<CatBean> =suspend fun getCat(hashMap: HashMap<String, String>): List<CatBean> =withContext(Dispatchers.IO) {try {apiStores.getCat(hashMap)} catch (e: Exception) {mutableListOf()}}
}abstract class BaseModel<T> {protected var apiStores: Tinit {apiStores = ApiFactory.remoteService(createApi())}protected abstract fun createApi(): Class<T>}

网络请求工厂:

object ApiFactory {private val okHttpClient: OkHttpClient by lazy { setHttpClient() }private fun retrofit(): Retrofit {return Retrofit.Builder().baseUrl(Constants.BASE_URL).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).client(okHttpClient).build()}private fun setHttpClient(): OkHttpClient = OkHttpClient.Builder().apply {addInterceptor(InterceptorManager.headerInterceptor()).addInterceptor(InterceptorManager.httpLoggingInterceptor())InterceptorManager.otherInterceptors.forEach { addInterceptor(it) }}.connectTimeout(NET_TIMEOUT, TimeUnit.SECONDS).readTimeout(NET_TIMEOUT, TimeUnit.SECONDS).writeTimeout(NET_TIMEOUT, TimeUnit.SECONDS).build()@JvmStaticfun <T> remoteService(apiService: Class<T>): T {return retrofit().create(apiService)}}

 网络请求拦截器:

object InterceptorManager {/*** 返回头拦截器* @return*/fun headerInterceptor(): Interceptor = Interceptor { chain: Interceptor.Chain ->chain.proceed(chain.request().newBuilder().addHeader(HeaderNames.TOKEN.headerName, "").addHeader(HeaderNames.PLATFORM.headerName, "android").addHeader(HeaderNames.UID.headerName, "").addHeader(HeaderNames.VERSION.headerName, AppUtils.getAppVersionName()).build())}/*** 返回http拦截器*/fun httpLoggingInterceptor(): Interceptor = HttpLoggingInterceptor().apply {this.level =if (Constants.RELEASE) HttpLoggingInterceptor.Level.NONE else HttpLoggingInterceptor.Level.BODY}/*** 自定义http拦截器*/var otherInterceptors: MutableList<Interceptor> = mutableListOf()enum class HeaderNames(val headerName: String) {TOKEN("Token"), PLATFORM("Platform"), UID("UID"), VERSION("Version"),}}

4.4 统一应用签名

        在app模块中新增signing.properties文件存储签名信息,xxx.jks签名文件放在同级目录,然后在app模块build.dradle文件中增加如下签名校验信息:

Properties signingProps = new Properties()
signingProps.load(new FileInputStream(file("signing.properties")))android {signingConfigs {KeyStore {keyAlias signingProps['KEY_STORE_ALIAS']keyPassword signingProps['KEY_STORE_KEY_PASSWD']storeFile file(signingProps['KEY_STORE_FILE'])storePassword signingProps['KEY_STORE_PASSWD']v1SigningEnabled truev2SigningEnabled true}}buildTypes {release {minifyEnabled falsesigningConfig signingConfigs.KeyStoreproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}debug {minifyEnabled falsesigningConfig signingConfigs.KeyStoreproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}


http://chatgpt.dhexx.cn/article/NXDG4Soh.shtml

相关文章

Android常用框架

1.缓存框架 1.1DiskLruCache&#xff1a;Java实现基于LRU的磁盘缓存&#xff0c;DiskLruCache不是google官方所写&#xff0c;但是得到了官方推荐&#xff0c;DiskLruCache没有编写到SDK中去&#xff0c;如需使用可直接copy这个类到项目中去。使用场景&#xff1a;如“清除…

Android开发框架大全

包括各种快速开发框架、测试框架、系统框架、插件补丁框架、设计模式框架、主题切换框架。 android-tips-tricks&#xff1a; https://github.com/nisrulz/android-tips-tricks Android 开发的一些 Tips 集合 Android-Code-Style&#xff1a; https://github.com/LoranWong/And…

Android开发常用开源框架

Android开源框架系列 Android开源项目 Android开发常用开源框架2 Android开发常用开源框架3 GitHub上最火的Android开源项目,所有开源项目都有详细资料和配套视频 2017年伊始&#xff0c;你需要尝试的25个Android第三方库 Android开发常用第三方平台 免费的计算机编程类中…

Android开发框架模式(MVC、MVP、MVVM)实例解析

Android项目中&#xff0c;尤其是比较大型的项目开发中&#xff0c;模块内部的高聚合和模块间的低耦合性就显得尤为重要了。所以我们一般情况下需要为项目设计一种框架模式&#xff0c;通常情况下我们一般用到的三种MVC、MVP、MVVM。 通过框架模式设计的项目能够极大的提高开发…

LDA主题模型评估方法–Perplexity

在LDA主题模型之后,需要对模型的好坏进行评估,以此依据,判断改进的参数或者算法的建模能力。 Blei先生在论文《Latent Dirichlet Allocation》实验中用的是Perplexity值作为评判标准。 一、Perplexity定义 源于wiki:http://en.wikipedia.org/wiki/Perplexity perplexity是一…

LDA困惑度perplexity的一些个人理解

纠结这个问题很久了&#xff0c;期间主要去了gensim的google论坛&#xff0c;以及在StackOverflow、StackexChange用关键词topic number perplexity搜了下&#xff0c;得到这些很模糊的认识&#xff1a; 1. gensim的log_perplexity()解读&#xff1a; 根据gensim3.8.3的源码&…

NLP基础知识点:困惑度(Perplexity)

本篇内容翻译自Speech and Language Processing. Daniel Jurafsky & James H. Martin. 链接&#xff1a;https://web.stanford.edu/~jurafsky/slp3/ 不愧是自然语言处理领域的圣经&#xff0c;读起来流畅自然&#xff0c;以后还是要多读经典。 困惑度&#xff08;Perplexit…

Python LDA gensim 计算 perplexity

转载自 https://blog.csdn.net/qq_23926575/article/details/79472742 1.LDA主题模型困惑度 这部分参照&#xff1a;LDA主题模型评估方法–Perplexity&#xff0c;不过后面发现这篇文章Perplexity(困惑度)感觉写的更好一点&#xff0c;两篇都是翻译的维基百科。 perplexity是一…

困惑度 (perplexity)

困惑度 (perplexity) 在自然语言处理中,对于一个语言模型,一般用困惑度来衡量它的好坏,困惑度越低,说明语言模型面对一句话感到困惑的程度越低,语言模型就越好。 对于LDA模型,最常用的两个评价方法困惑度(Perplexity)、相似度(Corre)。 其中困惑度可以理解为对于一篇…

Metric评价指标-Perplexity语言模型

欢迎关注知乎&#xff1a; 世界是我改变的 知乎上的原文链接 一. 原理介绍 在研究生实习时候就做过语言模型的任务&#xff0c;当时让求PPL值&#xff0c;当时只是调包&#xff0c;不求甚解&#xff0c;哈哈哈&#xff0c;当时也没想到现在会开发这个评价指标&#xff0c;那现…

perplexity和预训练时用的loss的区别

Perplexity和预训练时用的loss都是用来评估语言模型的性能的指标&#xff0c;但是它们的计算方式和意义有所不同。 Perplexity是一种用来衡量语言模型对一个测试集的预测能力的指标。它的计算方式是将测试集中的所有句子输入到语言模型中&#xff0c;计算每个句子的困惑度&…

技术干货 | 基于MindSpore详解Perplexity语言模型评价指标

01 原理介绍 在研究生实习时候就做过语言模型的任务&#xff0c;当时让求PPL值&#xff0c;当时只是调包&#xff0c;不求甚解&#xff0c;哈哈哈&#xff0c;当时也没想到现在会开发这个评价指标&#xff0c;那现在我来讲一下我对这个指标的了解&#xff0c;望各位大佬多多指…

Perplexity定义

Refer from http://blog.csdn.net/pipisorry/article/details/42460023 http://blog.csdn.net/pipisorry/article/details/42460023 熵/信息熵 Perplexity定义 perplexity是一种信息理论的测量方法&#xff0c;b的perplexity值定义为基于b的熵的能量&#xff08;b可以是一个概…

gensim---LDA---perplexity

以下内容来源于https://blog.csdn.net/qq_25073545/article/details/79773807 使用gensim实现lda&#xff0c;并计算perplexity&#xff08; gensim Perplexity Estimates in LDA Model&#xff09; Neither. The values coming out of bound() depend on the number of topi…

世界上第一个会话搜索引擎——Perplexity AI使用测评

引言 比起传统的列表式搜索&#xff0c;Perplexity AI把艳惊四座的ChatGPT和必应搜索结合起来&#xff0c;既有ChatGPT式的问答&#xff0c;又像普通搜索引擎那样列出链接&#xff0c;就连马斯克也亲自称赞&#xff1a;它不仅总结出了推文的由来&#xff0c;还将推文的内容解释…

主题模型TopicModel:LDA主题模型的评估

http://blog.csdn.net/pipisorry/article/details/42460023 基础知识&#xff1a;熵 [熵与互信息] 皮皮blog Perplexity定义 perplexity是一种信息理论的测量方法&#xff0c;b的perplexity值定义为基于b的熵的能量&#xff08;b可以是一个概率分布&#xff0c;或者概率模型…

语言模型常用评价方法:perplexity、bleu

目录 1. perplexity&#xff08;困惑度、复杂度&#xff09; 2. BLEU 代码实现 1. perplexity&#xff08;困惑度、复杂度&#xff09; 更多详细&#xff0c;参考&#xff1a;详解语言模型NGram及困惑度Perplexity 语言模型&#xff1a;语言模型可以表示为一个计算 的模型&a…

LDA主题模型绘制困惑度(perplexity)-主题数曲线——python

主题建模作为一种基于机器学习的文本内容分析技术&#xff0c;一般用于推断文本文档中隐藏主题的技术。很多研究使用了基于Latent Dirichlet Allocation (LDA)的主题建模算法来处理大规模文档并识别潜在主题。LDA主题模型已经在多个研究领域得到应用&#xff0c;且都有着不俗表…

Android keystore

1.keystore是一个密钥库&#xff0c;密钥库中可以放很多对密钥对&#xff08;私钥证书(证书中包含公钥&#xff0c;数字签名,证书有效期&#xff0c;组织机构名称&#xff0c;申请时间&#xff0c;算法等。)&#xff09;kestore中有两种密码&#xff0c;一个密码是访问密钥库的…

查看KeyStore的信息,(本地的和线上的)

本地的&#xff1a; 1.找到jdk路径、如图 输入cmd 2.输入&#xff1a;keytool -list -v -keystore C:\Users\j\Desktop\app-android-v1.6-1caec749d84e708f91fd90ab383e42d7b417a47e\你的名.keystore 注意&#xff1a;C:\Users\j\Desktop\app-android-v1.6-1caec749d84e708f9…