GitHub标星9

这篇具有很好参考价值的文章主要介绍了GitHub标星9。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本解耦方案

组件化的第一步就是对要拆出去的组件进行解耦,常见解耦方式有以下几种:

(1) 公用代码处理

  1. 基础业务逻辑分别拆成基础组件

  2. 自身逻辑完整、用于完成某一特定功能、不含业务逻辑的一组代码,独立成 SDK

  3. 代码量很小不足以拆分成单独拆分的代码和资源,我们统一放在一个专门建立的 common 组件中,并且严格限制 common 组件的增长。随着组件化的逐渐进行,common 应该逐渐变小而不是增大。

  4. 碰巧被共同使用的一些代码和资源片段,通常它们被复用只是因为被开发人员搜索到而直接使用了,很多时候某个资源已经被 A 业务声明了前缀,但是由于没有隔离,仍然会不可避免的被他人在 B 业务中强行复用,这时候如果 A 业务方要进行一些修改,B 业务就会受到影响 —— 这种情况我们允许直接复制

(2) 初始化

有些组件有在应用启动时初始化服务的需求,而且很多服务还是有依赖关系的,最初我们为每个组件都添加了一个 init() 方法,但是并不能解决依赖顺序问题,需要每个组件都在 app 工程中按顺序添加初始化代码才能正常运行,这使得不熟悉整套组件业务的人很难建立起一个可以独立运行的组件 app。因此我们开发了一套多线程初始化框架,每个组件只要新建若干个启动 Task 类,并在 Task 中声明依赖关系即可:

GitHub标星9,程序员,github

App 只需知道自己依赖什么组件即可,在编译 app 时 gradle 插件会自动定位到所有的 Task,并运行时生成依赖图,按依赖顺序启动 Task:

GitHub标星9,程序员,github

这样就解决了组件在主工程中堆积初始化代码的问题,在简化了代码的同时还有加快启动速度的功效。

(3) 路由

界面间使用 Url 进行跳转,不但实现了解耦,也统一了各端的页面打开方式。我们实现了一套灵活小巧的路由框架 ZRouter,它支持多组件、路由拦截、AB Test 、参数正则匹配、降级策略、任意参数传递以及自定义跳转等功能,可以自定义路由的各个阶段,完全满足了我们的业务需求。

(4) 接口

除了页面间的跳转,不同业务之间不可避免的会有一些调用,为了避免组件的直接通信,通常都是使用接口依赖的方式。我们实现了一个 Interface Provider 来支持接口通信,它可以通过运行时在动态注册一个接口,同时也实现了对于 ServiceLoader 的支持。只要一方组件将通信接口暴露出来,使用方就可以直接使用接口进行调用。

动态注册接口

Provider.register(AbcInterface.class,new AbcInterfaceImpl())

获取实例并调用

Provider.get(AbcInterface.class).doSomething()

(5) EventBus

这个自不必说,虽然说滥用是一个问题,但是有些场景下,使用事件还是最为方便简单的方式

(6) 组件 API 模块

上面提到的接口和事件以及一些跨组件使用的 Model 放到哪里好呢?如果直接将这些类下沉到一个公共组件中,由于业务的频繁更新,这个公共组件可能会更新得十分频繁,开发也十分的不方便,所以使用公共组件是行不通的,于是我们采取了另一种方式——组件 API :为每个有对外暴露需求的组件添加一个 API 模块,API 模块中只包含对外暴露的 Model 和组件通信用的 Interface 与 Event。有需要引用这些类的组件只要依赖 API 即可。

[图片上传中…(image-a39cd0-1598345691997-6)]

GitHub标星9,程序员,github

一个典型的组件工程结构是这个样子:

GitHub标星9,程序员,github

以上图为例,它包含三个模块:

template :组件代码,它包含了这个组件所有业务代码

template-api:组件的接口模块,专门用于与其他组件通信,只包含 Model、Interface 和 Event,不存在任何业务和逻辑代码

app 模块:用于独立运行 app,它直接依赖组件模块,只要添加一些简单的配置,即可实现组件独立运行。

组件半自动拆分

有了解耦的方法,剩下的就是采取行动拆分组件了,拆组件是一个很头疼的问题,它非常考虑一个人的细心与耐心,由于无法准确知道有哪些代码要被拆走,也不能直观的知晓依赖关系,移动变得非常的困难且容易出错,一旦不能一次性拆分成功,到处都是编译错误,便只能靠人肉一点一点的挪。

工欲善其事,必先利其器。为了解决这个问题,我们开发了一个辅助工具 RefactorMan: 它可以递归的解析出工程中所有源码的引用和被引用情况,同时会根据预设规则自动分析出所有不合理的依赖,在开发人员根据提示解决了不合理依赖之后,即可将组件一键移出,大大减少了拆组件的工作量。我们在组件化初期曾经走过一些弯路,最初拆出的八个组件工程的的部分源码经历了几次的反复移动才得出最优解,而有了 RefactorMan,我们可以面对反复的拆分和组合组件有恃无恐。

Bonus :由于可以分析和移动资源,所以额外获得了清理无用资源的功能。

联合编译完整包

单独运行组件 app 并不能完整的覆盖所有的 case,尤其是在给 QA 测试的时候,还是需要编译完整的主工程包的,所以我们需要一个直接编译完整包的方案:

最初我们的实现方式只针对组件,比较简单:

首先在 setting.gradle 中动态引入组件 module:

def allComponents = [“base”, “account” … “template” …]

allComponents.forEach({ name ->

if (shouldUseSource(name)) {

// 动态引入外部模块

include “😒{name}”

project(“😒{name}”).projectDir = getComponentDir(name);

}

})

然后在 app/build.gradle 中切换依赖,需要将所有被间接依赖的组件全部 exclude 以防止同时依赖了一个组件的 module 和 aar:

allComponents.forEach({ name ->

if (shouldUseSource(name)) {

implementation(project(“😒{name}”)) { exclude group: COMPONENT_GROUP }

} else {

implementation(“ C O M P O N E N T G R O U P : {COMPONENT_GROUP}: COMPONENTGROUP:{name}😒{versions[name]}”) { exclude group: COMPONENT_GROUP }

}

})

由于所有组件的 group 都是一样的,所以这样做并没有什么问题,但是后来一些基础 SDK 也出现了这种需求,这时候就需要一种通用的源码依赖方案,因此做了一下修改,直接使用 gradle 提供的依赖替换功能,只需要修改 setting.gradle 即可:

// … 忽略读取配置代码 …

configs.forEach { artifact, prj ->

include “😒{prj.name}”

project(“😒{prj.name}”).projectDir = new File(prj.dir)

}

gradle.allprojects { project ->

if (project == project.rootProject) {

return

}

project.configurations.all {

resolutionStrategy.dependencySubstitution {

configs.forEach { artifact, prj ->

// 在这里进行替换

substitute module(artifact) with project(“😒{prj.name}”)

}

}

}

}

而 build.gradle 的依赖写法与普通的工程完全一样。

普通状态下的的主工程:

GitHub标星9,程序员,github

源码引用 template 组件后的主工程:

GitHub标星9,程序员,github

这样我们就可以像之前在单工程中一样写代码了。

得益于源码引用,我们直接在提交组件代码的时候,CI 会自动联合主工程编译出完整包,QA 会根据完整包进行测试,在测试通过后即可自动发布到公司的仓库,并通过内部的集成平台集成到主工程

小 tip :工程 .idea/vcs.xml 中定义了当前工程关联的 Git 仓库,可以在联合编译的同时通过修改 vcs.xml 来把组件目录也关联到主工程 Git 配置中,在开发过程中就可以使用 Android Studio 的内置 Git 功能了

包含子业务线的组件

我们当前的组件,绝大部分是一个组件一个仓库的,对于一般的组件来说,并没有什么问题,但是对于有的业务线,本身规模比较大,包含了若干个子业务,比如知乎大学,电子书、live 和私家课等子业务,这些子业务本身功能独立,但是共享整个业务线的基础代码,同时大业务线也有会一些汇总所有子业务的页面,它们的关系是这个样子:

GitHub标星9,程序员,github

这几个业务如果都要拆分出去独立成组件,然后抽离公共部分成为也成为一个业务线基础组件,这时候会面临一个很大的问题:由于几条业务线都属于同一个主业务线,做活动或者上新 Feature 的时候,这几个组件经常会发生联动,需要先更新 base 再更新其他业务线,提交 mr 也要同时提多个仓库,出现频繁的连锁更新;而如果不拆的话,业务线代码本身就已经很庞大,即使是单独编译组件 app 也会很慢,并且随着时间的推移,各个业务线的代码边界会像组件化之前的主工程一样逐渐劣化,耦合会越来越严重。

所以现在需求变成了这个样子:

  1. 对外保持只有一个组件:有联动需求的时候,组件仍然只发布一次更新

  2. 各个子业务仍旧保持互相独立和隔离,可以独立运行

我们曾经试图使用 sourceSets 的方式将不同的业务代码放到不同的文件夹,但是 sourceSets 的问题在于,它并不能限制各个 sourceSet 之间互相引用,base 模块甚至可以直接引用最上层的代码,虽然可以在编译期进行检查,但是总有一些后知后觉的意味,并且使用 sourceSets 想让各个模块单独跑起来配置也比较麻烦。而 Android Studio 的 module 天然具有隔离的优势。所以我们的解决方案是在组件工程中使用多 Module 结构:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

GitHub标星9,程序员,github

GitHub标星9,程序员,github

GitHub标星9,程序员,github

GitHub标星9,程序员,github

GitHub标星9,程序员,github

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

GitHub标星9,程序员,github

最后

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

以下是今天给大家分享的一些独家干货:

GitHub标星9,程序员,github

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-859803.html

索成长,不成体系的学习效果低效漫长且无助**。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

以下是今天给大家分享的一些独家干货:

[外链图片转存中…(img-sEwEkGI6-1712764569409)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

到了这里,关于GitHub标星9的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CodeGeeX、CodeWhisperer、Github Copilot三款AI辅助编程工具,程序员该如何选择?

    亚马逊今天在Re:Mars大会上宣布推出CodeWhisperer,这是一款类似于 CodeGeeX 和GitHub Copilot的AI辅助编程工具,它根据一个注释或几个按键来自动补全整个函数。目前支持Java、JavaScript和Python,和 CodeGeeX 一样,使用了数十亿行公开可用的开源代码、自己的代码库、公开可用的文档和公

    2023年04月16日
    浏览(57)
  • GitHub 推出了集成了 GPT-4 技术的 Copilot X,它对程序员有哪些积极和消极影响?

    如果 GitHub 推出了 Copilot X,它集成了 GPT-4 技术,可以自动补全代码和注释,那么这将为程序员的日常开发工作带来以下改变: 提高编写代码的效率:Copilot X 可以利用先进的人工智能技术来快速生成代码和注释,从而帮助程序员更快地完成任务,减少错误和调试时间。 提升代

    2023年04月25日
    浏览(53)
  • GitHub标星9

    基本解耦方案 组件化的第一步就是对要拆出去的组件进行解耦,常见解耦方式有以下几种: (1) 公用代码处理 基础业务逻辑分别拆成基础组件 自身逻辑完整、用于完成某一特定功能、不含业务逻辑的一组代码,独立成 SDK 代码量很小不足以拆分成单独拆分的代码和资源,我们

    2024年04月27日
    浏览(76)
  • 涨薪7K,GitHub标星3.2K

    前言 最近两部剧爆火,30而已,20不惑,其实刚刚开始看这个 点击领取完整开源项目《安卓学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》 2个电视剧我在想是不是说反了。不是应该29而已,30不惑吗?后面想想其实他应该是想告诉我们这个残酷的现实

    2024年03月11日
    浏览(72)
  • Github 标星 4w+,如何用 Python 实现所有算法

    点击蓝色“五分钟学算法”关注我哟 加个“星标”,一起学算法 编译 | 周素云、蒋宝尚 来源 | 大数据文摘出品 几位印度小哥在 GitHub 上建了一个各种 Python 算法的新手入门大全。从原理到代码,全都给你交代清楚了。为了让新手更加直观的理解,有的部分还配了动图。 标

    2023年04月08日
    浏览(42)
  • kotlinui封装,GitHub标星1w的Android架构师必备技能

    推荐两个刷题网站: 牛客网 LeetCode 推荐几本Android进阶的书籍: 《Android开发进阶 从小工到专家 》何红辉 著 《Android开发艺术探索》 任玉刚 著 《疯狂Android讲义 》李刚 著 技术类 1.Java类类加载原理 2.界面卡顿的原因以及解决方法 3.自定义Handler时如何避免内存泄漏,内存泄漏

    2024年03月17日
    浏览(77)
  • 李沐大模型公司细节曝光,项目GitHub空仓标星超500

    衡宇 发自 凹非寺 量子位 | 公众号 QbitAI AI大神李沐大模型创业方向,终于“水落石出”: 利用大模型能力, 做游戏引擎,且是面向4A游戏 。 关于4A游戏这个概念,目前业内没有统一的“名词解释”,但通常理解为比3A游戏更强大一点的游戏(doge)。 被曝从亚马逊首席科学家

    2024年02月05日
    浏览(155)
  • GitHub标星75k,阿里15W字的Spring高级文档(全彩版),太全了

    最近看了下身边朋友们的面试情况,发现很多人知道自己的问题和短板在哪里,对自己的技术水平和能力认知也很清晰,都很迫切想要学习提高,奈何自己盲目学习的过程很费力,效果也不佳,遇到好些困难和阻碍。 比如大部分正在学Spring的程序员兄弟们就反馈: 虽然Spri

    2024年04月15日
    浏览(43)
  • GitHub上超火!标星6-2K的开源项目:高仿今日头条视频列表功能

    2. 在Module的build.gradle添加依赖 compile ‘com.github.open-android:JieCaoVideoPlayer:0.1.0’ 3.添加权限 4.在Activity中添加如下代码 listView = (ListView) findViewById(R.id.listview); adapterVideoList = new VideoListAdapter(this); listView.setAdapter(adapterVideoList); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); senso

    2024年04月28日
    浏览(35)
  • GitHub标星17K,超火的SpringBoot +Vue实战项目,文档视频贼全

    技术选型 ==== 核心框架:SpringBoot2.1.8 安全管理:Spring Security 持久层框架:MyBatis 缓存:Redis 数据库:MySQL8 消息队列:RabbitMQ 即时通信:WebSocket 文件存储:FastDFS 前端框架:Vue+ElementUI+Vuex 前端网络请求:axios 技术要点 ==== 基于 Spring Security 搭建动态权限管理系统。 前端 Vue 采

    2024年04月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包