• Stars
    star
    3,172
  • Rank 14,162 (Top 0.3 %)
  • Language
    Java
  • Created about 7 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🔥🔥🔥 组件化综合案例,组件分层为:基础公共组件,功能组件,业务组件,主工程。每一层组件的建设,很详细的工程案例,很全面的一个组件化实践案例。一个超级综合案例!

组件化项目实践

目录介绍

  • 01.项目整体概述介绍
  • 02.组件化演变架构图
  • 03.组件化实践的步骤
  • 04.组件化是如何交互
  • 05.组件化避坑的指南
  • 06.公共基础库的介绍
  • 07.功能组件库的介绍
  • 08.服务组件库的介绍
  • 09.项目稳定性的实践
  • 10.项目诊断工具开发
  • 11.遇到的问题点记录

01.项目整体概述

1.1 项目背景说明

  • APP迭代维护成本增高
    • APP版本不断迭代:新功能,业务模块数量不断增加;业务上的处理逻辑越变越复杂;同时每个模块代码也变得越来越多。这就引发问题,所维护代码成本越来越高,稍微一改动可能就牵一发而动全身,改个小的功能点就需要回归整个APP测试,这就对开发和维护带来很大的挑战。
  • 多人组合需要组件化
    • APP架构方式是单一工程模式,业务规模扩大,随之带来的是团队规模扩大,每个移动端软件开发人员势必要熟悉如此之多代码,如果不按照一定的模块组件机制去划分,将很难进行多人协作开发。随着单一项目变大,在单一工程代码耦合严重,每修改一处代码后都需要重新编译打包测试,导致非常耗时。

1.2 遇到问题记录

  • 代码量膨胀,不利于维护和功能迭代
    • 项目工程构建速度慢,在一些电脑上写两句代码,重新编译整个项目,有的甚至更长。
  • 不同模块之间代码耦合严重,有时候修改一处代码而牵动许多模块
    • 每个模块之间都有引用第三方库,但有些第三方库版本不一致,导致打包APP时候代码冗余,容易引起版本冲突。
  • 代码历史遗留问题
    • 现有项目基于以前其他人项目基础上开发,经手的人次过多,存在着不同的代码风格,项目中代码规范乱,类似的功能写法却不一样,导致不统一。
  • 公司有多个app项目,需要沉淀一套通用组件
    • 公司有多个app,比如都会有支付,登陆,视频播放等业务逻辑,那么组件化改造项目,刚好可以沉淀一套技术库。新开发的app也可以快速用组件搭建。

1.3 基础概念介绍

  • 什么是组件化呢?
    • 组件化是基于组件可重用的目的上,将一个大的软件系统按照分离关注点的形式,拆分成多个独立的组件,做到更少的耦合和更高的内聚。
  • 模块化和组件化区别
    • 简单来说,组件化相比模块化粒度更小,两者的本质思想都是一致的,都是把大往小的方向拆分,都是为了复用和解耦,只不过模块化更加侧重于业务功能的划分,偏向于复用,组件化更加侧重于单一功能的内聚,偏向于解耦。

1.4 开发设计目标

  • 组件化的目标
    • 组件化的目标之一就是降低整体工程(app)与组件的依赖关系,缺少任何一个组件都是可以存在并正常运行的。
  • 对组件化层次划分
    • 需要结构清晰,拆分粒度符合设计规范。方便迁移,按需加载。针对业务庞大,每个人员可以负责自己独立的业务组件……
  • 可以做到技术沉淀
    • 比如针对功能组件,服务组件,还有基础组件,可以沉淀出来做成中台公共库。方便维护,在多个APP中可以复用组件。

1.5 组件化改造阻力

  • 商业化项目稳定性保证
    • 商业化项目,很强调稳定性。有些项目做了很多年,不敢轻易改动,害怕组件化改造会带来不可估量的影响和线上bug。
  • 不同层人看待技术角度不同
    • 公司领导层和一线程序员存在对技术不同想法。开发想着如何用一些新技术去改造项目提升自己技术能力;领导想着技术是偏下游,确保稳定性,如何提升业务收益。
  • 改造收益比较难衡量
    • 改造项目对程序员来说,提高了架构设计能力,能够有一些技术上沉淀。但是对于公司,考虑好具体的收益再做改造决定吧,

1.6 组件化收益分析

  • 提高效率,代码解耦
    • 通过组件化的解耦,降低各个组件之间的相互依赖,使每个组件都是高内聚低耦合的状态。各个程序员负责维护自己模块,单独某个组件的修改不会对其它组件有重大影响,提高维护性!
  • 功能库下沉快速复用
    • 每个单独的组件就是一个单一功能,对于业务线的开发团队来说,通过直接使用组件快速完成功能开发,同时减少了重复的开发工作量。

02.组件化演变架构图

2.1 以前App说明

  • 传统APP架构图
    • image
  • 存在的问题
    • 单一工程模型下的业务关系,总的来说就是:你中有我,我中有你,相互依赖,无法分离,多个开发代码越维护越臃肿,耦合严重。如下图:
    • image

2.2 现在App架构图

  • 按照不同层级架构图
    • image

03.组件化实践的步骤

3.1 组件化考虑问题

  • 考虑的问题:分而治之,并行开发,一切皆组件。要实现组件化,无论采用什么样的技术方式,需要考虑以下方面问题:
  • 代码解耦:对已存在的项目进行模块拆分,模块分为两种类型,一种是作为依赖库对外提供;另一种是业务组件模块,专门处理业务逻辑等功能,这些业务组件模块最终负责组装APP。
  • 组件间通信:页面跳转可以使用路由;业务组件业务调用可以采用SPI或者接口反射
  • 组件生命周期:组件是否可以做到按需、动态使用、因此就会涉及到组件加载、卸载等管理问题。
  • 集成调试:在开发阶段如何做到按需编译组件?一次调试中可能有一两个组件参与集成,这样编译时间就会大大降低,提高开发效率。
  • 告别结构臃肿:让各个业务变得相对独立,业务组件在组件模式下可以独立开发,而在集成模式下又可以变为AAR包集成到“APP壳工程”中,组成一个完整功能的 APP。

3.2 组件化架构拆分

  • 主工程(壳工程代码,多favor,debug助手等):
    • 除了一些全局配置和主 Activity 之外,不要包含太多的业务代码。有的也叫做空壳app,主要是依赖业务组件进行运行。
  • 业务组件(主要是业务层拆分的组件):
    • 最上层的业务,每个组件表示一条完整的业务线,彼此之间互相独立。原则上来说:各个业务组件之间不能有直接依赖!对于测试的时候,需要依赖多个业务组件的功能进行集成测试的时候。可以使用app壳进行多组件依赖管理运行。
  • 功能组件(分为服务组件和中台组件):
    • 该案例中分为,登录注册组件,分享组件,支付组件,Hybrid组件等等。同时注意,可能会涉及多个业务组件对某个功能组件进行依赖!
  • 基础组件(分为工具组件和视图组件,这部分完全和业务无关):
    • 支撑上层业务组件运行的基础业务服务。此部分组件为上层业务组件提供基本的功能支持。基础组件库中主要有,网络请求,图片加载,通信机制,工具类,自定义控件等等。
  • 这样拆分的目的
    • 架构分层将模块化带来的网状依赖结构改造成树状依赖结构(上层依赖下层),降低了依赖的复杂度,保障各层之间的依赖不劣化。

3.3 架构设计的出发点

  • 思考一下为何要做架构,做架构目的是什么
    • 举个例子,MVP特别流行,MVP的好处就是降低耦合,降低后续维护成本,但事实上,用了MVP后,代码极度膨胀,新增了很多类,代码可读性也差,读代码在一大堆presenter中迷失,想想,这样做维护成本是否真的降低了?
  • 移动端架构 = 业务架构(模块化/组件化) + 技术架构(分层)
    • 提高程序性能和可扩展性,降低后续的维护成本;架构设计的目标是解决当前项目的痛点,如果当前项目没有痛点,那就先别进行架构设计了。
  • 架构设计要以实用为目的,架构设计有一些基本原则
    • 1、合适优于领先。适合自己当前业务的就好,不要总想搞领先的架构;2、简单优于复杂。架构设计也是一样,越简单的架构越牛逼;3、演进优于一步到位,架构设计优先解决当下的问题。
    • 这三个原则也是有优先级的,具体是:合适优于先进 > 演化优于一步到位 > 简单优于复杂。合适也就是适应当前需要是首位的,连当前需求都满足不了谈不到其他,然后不断演进,最后精简代码。

04.组件化是如何交互

4.1 组件初始化功能

  • 有些组件有在应用启动时初始化服务的需求时,通过自定义生命周期框架进行实现初始化任务依赖和先后顺序的管理。

4.2 组件间页面跳转

  • 这是组件化工程模型下的业务关系,业务之间将不再直接引用和依赖,而是通过“路由”这样一个中转站间接产生联系。推荐使用的阿里开源的路由框架。

4.3 组件间业务通信

  • 不同模块业务调用场景【针对平级组件而言】
    • A 首页模块,B 设备模块需要调用 C 个人中心模块某一个功能(比如选择用户功能);C 模块又要调用A 模块中版本更新业务
  • 有哪些方式可以实现业务通信
    • 方案1:A 模块直接依赖 C 模块,然后直接调用即可,这样不友好,破坏了组件的隔离。
    • 方案2:接口 + 实现类 + 反射。在A,B,C都依赖的接口层定义接口,在各自自己模块写实现类,利用反射的方式调用。注意避免反射混淆了类名!
    • 方案3:SPI(还是通过接口依赖方式去通信),其实实质还是反射,用起来非常顺手。

4.4 业务耦合逐渐劣化

  • 随着时间的推移,各个业务线的代码边界会像组件化之前的主工程一样逐渐劣化,耦合会越来越严重。
    • 第一种解决方式:使用 sourceSets 的方式将不同的业务代码放到不同的文件夹,但是 sourceSets 的问题在于,它并不能限制各个 sourceSet 之间互相引用,所以这种方式并不太友好!
    • 第二种解决方式:下沉,抽取需求为共同类,通过不同组件传值而达到调用关系,这样只需要改工具类即可改需求。但是这种只是符合需求一样,但是用在不同模块的场景。

05.组件化避坑的指南

5.1 避免组件依赖恶化

  • 分层架构,技术人员定义了每一层组件的依赖规范。
    • 主要是以防止不合理的循环依赖,保证整体依赖不劣化。在分层依赖规范中,高层可以依赖低层、实现可以依赖接口,接口层没有依赖,且优先以前向声明为主。
  • 避免业务公共组件不断下沉导致臃肿
    • 比如有首页,订单,视频,个人中心,设备等不同业务组件,一般利用到一些公共布局或资源,会往公共common组件下沉。要避免过渡下沉造成公共common库臃肿!

5.2 组件化时资源名冲突

  • 资源名冲突有哪些?
    • 比如,color,shape,drawable,图片资源,布局资源,或者anim资源等等,都有可能造成资源名称冲突。这是为何了,有时候大家负责不同的模块,如果不是按照统一规范命名,则会偶发出现该问题。
    • 尤其是如果string, color,dimens这些资源分布在了代码的各个角落,一个个去拆,非常繁琐。其实大可不必这么做。因为android在build时,会进行资源的merge和shrink。res/values下的各个文件(styles.xml需注意)最后都只会把用到的放到intermediate/res/merged/../valus.xml,无用的都会自动删除。并且最后我们可以使用lint来自动删除。所以这个地方不要耗费太多的时间。
  • 解决办法
    • 这个问题也不是新问题了,第三方SDK基本都会遇到,可以通过设置 resourcePrefix 来避免。设置了这个值后,你所有的资源名必须以指定的字符串做前缀,否则会报错。但是 resourcePrefix 这个值只能限定 xml 里面的资源,并不能限定图片资源,所有图片资源仍然需要你手动去修改资源名。
  • 个人建议
    • 将color,shape等放到基础库组件中,因为所有的业务组件都会依赖基础组件库。在styles.xml需注意,写属性名字的时候,一定要加上前缀限定词。假如说不加的话,有可能会在打包成aar后给其他模块使用的时候,会出现属性名名字重复的冲突。

5.3 关于依赖优化记录

  • 查看依赖树,在项目根目录下执行如下命令,将依赖导出到文件:
    ./gradlew app:dependencies > log_depend.txt
  • implementation:
    • 只能在内部使用此模块,比如我在一个library中使用implementation依赖了gson库,然后我的主项目依赖了library,那么,我的主项目就无法访问gson库中的方法。这样的好处是编译速度会加快,推荐使用implementation的方式去依赖
  • compile(api)
    • 这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
  • compileOnly
    • 使用场景:有多个library,只要确保有一个module中该依赖能参与到打包即可,其他的可以使用compileOnly。运行时不需要,例如仅源代码注解或注释处理器

06.公共基础库的介绍

6.1 公共组件层概括

  • 组件化开发中基础公共库,activity栈管理;Log日志;通用缓存库(支持sp,mmkv,lru,disk等多种存储方式切换);App重启;通用全面的工具类Utils;通用基类fragment;Vp库;通用接口层;intent内容打印到控制台库;加解密库;file文件管理;通用Utils库。
    • image

6.2 公共组件说明

公共基础库地址 库说明 功能介绍
ActivityManager Activity任务栈管理 轻松和完全解耦合式管理activity栈操作
AppStatusLib 常见广播监听库 可以全局监听电量,蓝牙,gps,网络,屏幕,Wi-Fi等状态
ToolUtilsLib 常用基础工具类 大量工具库相关utils代码,可以节省开发时间
ApplicationLib application初始化 用于组件化中application初始化操作库
ParallelTaskLib app任务启动神器 有向无环图,简介版本的启动优化策略task库
AppBaseStore 通用存储库 支持sp,mmkv,lru,disk,map多种缓存,统一api调用
BaseClassLib 基础base类 主要是四大组件,fragment等相关的包装类
ReflectionLib 反射工具库 提高反射调用,一行代码即可,增强反射的开发效率
AppLogLib 简易版本log 简单版本log日志工具库,可以自由灵活实现日志记录
AppRestartLib app重启动库 使用闹钟,service,清单等多种方式重新启动app
SafeIntentLib intent打印库 支持intent,Bundle数据完整信息输出到控制台
ArchitectureLib jitpack库 待完善中
FragmentManager Fragment生命周期监听 支持多activity的子fragment的周期监听
ToolFileLib File文件工具库 字节流,字符流,高效流读和写文件操作库
EventUploadLib 异常&事件&日志上报库 辅助基础和功能组件的日志,异常和埋点上报接口库
AppCommonInter 基础接口库 用于基础组件中异常降级,日志,异常等接口调用
AppPermission 简单的权限库 用于权限判断,申请以及回调相关处理库
AppLruDisk Lru磁盘缓存 Lru淘汰算法磁盘缓存库,写入file文件。基础工具库
AppLruCache Lru内存缓存 Lru淘汰算法内存缓存库,写入到map集合中
BaseVpAdapter Vp,Vp2适配器库 主要是针对vp控件adapter的简单封装

07.功能组件库的介绍

7.1 功能组件层概括

7.2 功能组件说明

功能组件库地址 库说明 功能介绍
ZxingServerLib 二维码扫描库 用于二维码扫描识别的基础功能
ZXingCodeLib 二维码生成库 用于生成二维码的基础库
SerialTaskLib 串行线程任务管理库 用于串行线程任务执行策略的task管理库
LocaleHelperLib 国际化locale库 国际化业务locale管理库
CountTimerLib 倒计时器库 用于倒计时时间工具库
AppTraceTool Trace工具库
LongAliveLib 保活库
ThreadPoolLib 线程池封装库 各种线程池案例封装库
AutoCloserLib 推到后台杀死app库 推到后台n时间后自动杀死app应用进程
AppProcessLib 前后台监听库 用于判断前后台状态,监听前后台切换的库
EasyExecutor 轻量级线程池库 轻量级线程池封装库,简易好用
ThreadDebugLib 线程debug工具 线程debug工具库
NtpTimeLib Ntp国际时间校验库 主要是用于智能设备时间校验库
AppUpdateLib App版本更新库 App版本更新,可以设置强制更新,普通更新

08.服务组件库的介绍

服务组件库地址 库说明 功能介绍
ImageServer 图片压缩库 图片经典压缩库,高度压缩图片质量库
OkHttpServer 网络请求库 简单对okhttp网络请求封装版本的网络库
ShareServer 本地分享工具库 调用本地分享,可以分享图片,文件等等
NfcServer NFC封装库 智能设备之间关于nfc通信交互的简单封装库
GsonServer 解析容错框架 解析gson数据容错框架,主要是对后台返回json数据实体偶发类型匹配错误校验
IpcServer IPC进程通信库
EasyBleServer 简单蓝牙库 蓝牙链接和配对,数据传递的简易版本封装库
LogUpload 日志上报库 支持上传本地路径日志文件到服务端,支持前后台上传和配置重试
PrivateServer 隐私合规API库
NetInterceptor 网络日志拦截器 网络日志拦截器,可以打印完整json内容输出到控制台
GlideProgressLib Glide加载进度库 替换请求拦截即监听glide加载图片百分比进度
CompressServer 图片加载库 简易版本图片压缩库
BellsVibrations 铃声和震动库 一键可以设置铃声,设置手机震动和调整声音的库

09.项目稳定性的实践

9.1 项目稳定性背景

  • 引用一句对系统稳定性的定义:
    • 系统稳定性指系统要素在外界影响下表现出的某种稳定状态。
  • 对于客户端来说,从 App 的使用者和开发者这两个角度来说,稳定性的含义有所不同:
    • 对于用户,稳定性意味着:使用 App 的过程中不崩不卡,能正常提供用户所需的服务,出现异常情况时引导合理,提示友好。
    • 对于开发者,稳定性意味着:线上整体性能指标达标,核心业务链路稳定不出错,非核心业务异常时有出口、可降级。
  • 因此应用的稳定性可以分为三个纬度,如下所示:
    • 1、Crash纬度:最重要的指标就是应用的Crash率。
    • 2、性能纬度:包括启动速度、内存、绘制等等优化方向,相对于Crash来说是次要的,但也是应用稳定性的一部分。
    • 3、业务高可用纬度:它是非常关键的一步,我们需要采用多种手段来保证我们App的主流程以及核心路径的稳定性。

9.2 稳定性建设实践

  • 事前预警
    • 监控触发报警 -> 有充足时间应对。(可以采用三方平台配置报警机制)
    • 分层监控:系统级监控、性能指标监控、业务监控、健康度分析(指标变化趋势)
    • 监控曲线:根据业务流程监控,以识别出现问题的环节
  • 事故处理
    • 第一原则:及时止损;因发版导致的问题,则及时回滚
    • 限流:防刷、等待+限时、轮训改为长链接(白名单放过关键路径,如支付)
    • 保护用户体验:客户端配合降级;力保关键路径:非关键路径模块降级
  • 事后总结
    • 必须找到根源:采用 5whys 分析方法从现象开始追踪到最根本的原因
    • 核算造成的损失:计算稳定性
    • 事故总结,如何优化:系统改进、流程改进、开发红线
    • 总结的意义:看到问题,采取措施,以便在将来再次遇到问题时处理地更快更好
  • 稳定性建设架构图
    • image

10.项目诊断工具开发

10.1 为何需要诊断工具

10.2 诊断工具分类说明

工具库地址 库说明 功能介绍
MonitorPrivacy 隐私合规检查 使用hook技术检测隐私合规api的调用堆栈
MonitorFileLib 磁盘查看工具
MonitorNetLib 网络抓包工具
MonitorCrashLib 崩溃拦截工具
MonitorInterceptor 弱网模拟工具
MonitorCatonLib 卡顿检测工具
MonitorPingLib Ping域名工具
MonitorFpsLib Fps检查工具
MonitorAnrLib ANR检测工具
LeakCanarySdk 内存泄漏工具
MonitorSpeed 流量测速工具
MonitorXposed Xposed检测
MonitorPhone App信息工具

11.遇到的问题点记录

12.其他介绍

12.1 其他内容介绍

image

12.2 一些技术流程

  • 存在问题如下所示
    • 流程混乱,把关不严:缺乏设计、闷头开发、收益质量得不到保障。需要有标准化流程托底。
  • 技术库标准化实践流程图
    • image
  • 技术库收益总结分析
    • 有什么收益:主要是解决了什么问题,给项目带了什么收益。让代码更简洁,让功能更加高效,还是其他?
    • 具有衡量数据:优化了什么,效率对比数据分析,内存优化前后数据对比等等,必须要有具体的衡量数据……
    • 有哪些问题待解决:遗留了哪些问题,为什么,后期是否有排期如何去优化?

12.3 其封装库推荐

工具库地址 库说明 功能介绍
YCWebView WebView封装库 基于腾讯x5开源库,提高webView开发效率,大概要节约你百分之六十的时间成本。
YCCommonLib App组件基础库 组件化开发中基础公共库,为App开发提高组件通用性
YCAndroidTool 测试工具库 用于项目测试,崩溃重启操作,崩溃记录日志,网络拦截查看,统计耗时,ping相关工具
YCBlogs 博客大汇总 技术博客大汇总,所有博客会同步到该库中
YCThreadPool 轻量级异步线程池 轻量级简易线程池库,轻量级线程池异步库,支持线程执行过程中状态回调监测
YCDialog 弹窗封装库 自定义Toast;自定义dialog控件;自定义DialogFragment弹窗;自定义PopupWindow弹窗;还有自定义Snackbar等等
YCVideoPlayer 通用音视频播放器 播放器内核(自由切换) + 视频播放器 + 边播边缓存 + 高度定制播放器UI视图层
YCScrollPager 滑动视频库 仿抖音,快手,短视频,竖直方向,一次滚动一个页面的封装库。
YCStateLayout 状态管理器库 状态切换,让View状态的切换和Activity彻底分离开。用builder模式来自由的添加需要的状态View
YCNotification 通知栏封装库 通知栏封装库,强大的通知栏工具类,链式编程调用

12.4 勘误及提问

  • 如果有疑问或者发现错误,可以在相应的 issues 进行提问或勘误。
  • 如果喜欢或者有所启发,欢迎star,对作者也是一种鼓励。转载麻烦注明出处。请挂上“潇湘剑雨”的小名!

12.5 关于LICENSE

  • 如下所示
    Copyright 2017 yangchong211github.com/yangchong211Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    
       http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

More Repositories

1

YCBlogs

技术博客笔记大汇总,包括Java基础,线程,并发,数据结构;Android技术博客等等;常用设计模式;常见的算法;网络协议知识点;部分flutter笔记;还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!转载请注明出处,谢谢!
6,403
star
2

YCVideoPlayer

🔥🔥🔥 基础封装视频播放器player,可以在ExoPlayer、MediaPlayer原生MediaPlayer可以自由切换内核;该播放器整体架构:播放器内核(自由切换) + 视频播放器 + 边播边缓存 + 高度定制播放器UI视图层。支持视频简单播放,列表播放,仿抖音滑动播放,自动切换播放,使用案例丰富,拓展性强。
Java
2,192
star
3

YCWebView

基于腾讯x5开源库,提高webView开发效率,大概要节约你百分之六十的时间成本。该案例支持处理js的交互逻辑且无耦合、同时暴露进度条加载进度、可以监听异常error状态、支持视频播放并且可以全频、支持加载word,xls,ppt,pdf,txt等文件文档、发短信、打电话、发邮件、打开文件操作上传图片、唤起原生App、支持webView页面截图、x5库为最新版本,功能强大。
Java
1,735
star
4

YCAndroidTool

用于项目测试,崩溃重启操作,崩溃记录日志【可以查看,分享】和重启【多种重启app方式】;网路拦截查看的工具小助手,拦截请求和响应数据,统计接口请求次数,流量消耗,以及统计网络链接/dns解析/request请求/respond响应等时间。提高开发效率……
Java
749
star
5

YCStateLayout

State switching, so that the View state switch and Activity completely separate. Using builder mode to freely add the required state View, can set data, data is empty, load data error, network error, load and other states, and support the layout of custom state. At present has been used in other formal projects, strong expansion!
Java
556
star
6

YCSlideLayout

购物商场商品详情页面自定义控件,模仿淘宝、京东、考拉等商品详情页分页加载的UI效果。可以嵌套RecyclerView、WebView、ViewPager、ScrollView等等。支持设置上拉分页加载动画效果……
Java
491
star
7

YCCustomText

自定义文本控件,支持富文本,包含两种状态:编辑状态和预览状态。编辑状态中,可以对插入本地或者网络图片,可以同时插入多张有序图片和删除图片,支持图文混排,并且可以对文字内容简单操作加粗字体,设置字体下划线,支持设置文字超链接(超链接支持跳转),已经用于多个实际项目中……
Java
479
star
8

YCRefreshView

自定义支持上拉加载更多,下拉刷新,可以自定义头部和底部,可以添加多个headerView,使用一个原生recyclerView就可以搞定复杂界面。支持自由切换状态【加载中,加载成功,加载失败,没网络等状态】的控件,可以自定义状态视图View。拓展功能【支持长按拖拽,侧滑删除】,轻量级,可以选择性添加 。持续更新……
Java
454
star
9

YCUpdateApp

轻量级版本更新弹窗,弹窗上支持更新进度条,可以设置普通更新或者强制更新。解决8.0以上通知栏不显示问题,解决7.0以上安装apk异常,下载完成则会自动提示安装;下载异常,失败,错误等状态,支持重启下载任务;还支持自定义下载路径。代码量少,调用简单……
Java
446
star
10

YCCaptureTool

App综合防抓包实践,关闭代理,设置配置文件;设置单向认证或双向认证;对数据加密和解密;sign签名参数;防止xposed,root,va挂载等操作。 比较通用全面的防抓包技术方案!
Java
421
star
11

YCScrollPager

仿抖音,快手,短视频,竖直方向,一次滚动一个页面的封装库。目前支持ViewPager做法,也支持RecyclerView做法……使用ViewPager则只是修改滑动速率,以及滚动翻页过渡时间;使用recyclerView打造丝滑切换视频的功能,更多内容可以看demo
Java
376
star
12

YCNotification

通知栏封装库,强大的通知栏工具类,链式编程调用,解决了8.0以上通知栏不显示问题,支持多种不同的使用场景,兼容老版本。还有自定义通知栏view,可高度定制布局……
Java
376
star
13

YCDialog

自定义弹窗,其中包括:自定义Toast;自定义dialog控件;自定义DialogFragment弹窗;自定义PopupWindow弹窗;还有自定义Snackbar等等;简单便用。目前已经用于多个正式项目中。
Java
359
star
14

YCStudyCpp

🔥🔥🔥 c++学习案例,系统学习,c++教程,基础案例,数据类型,变量和常量,运算符,表达式,判断和循环,函数,模版函数,指针,引用,数组和容器,IO输入和输出,结构和类,继承和派生,多线程,并发,线程安全锁,内存分配,堆和栈,异常,STL标准模版,预处理器,信号处理,程序调试,网络通信,综合案例等等
C++
353
star
15

YCStatusBar

关于状态栏方案总结案例,适合于绝大多数的使用场景……同时,兼容了小米,魅族等手机状态栏字体颜色设置失效问题。已经用于实际项目投资界,新芽,沙丘大学等APP,一键集成并使用!支持单Activity多Fragment动态修改状态栏颜色,入侵性低,一行代码即可实现你需要的需求
Java
313
star
16

YCJniHelper

JNI学习案例,通过简单的案例快速入门jni开发。JNI基础语法介绍,so库生成打包和反编译,Java和C/C++相关调用案例
Java
266
star
17

YCFlutterUtils

Flutter Utils 全网最齐全的工具类。包含bus,颜色,日期,文件,json,log,sp,加解密,num,图片,网络,正则,验证,路由,文本,时间,spi,计时器,拓展类,编解码,发射,异常,字节转化,解析等等工具类。
Dart
245
star
18

YCThreadPool

轻量级简易线程池库,轻量级线程池异步库,支持线程执行过程中状态回调监测(包含成功,失败,异常等多种状态);支持创建异步任务,可以设置线程的名称,延迟执行时间,线程优先级,回调callback等;可以根据自己需要创建自己需要的线程池;线程异常时,可以打印异常日志,避免崩溃。
Java
224
star
19

YCCommonLib

组件化开发中基础公共库,activity栈管理;fragment周期监听;Lru缓存库;反射库;分区存储;Log日志打印和存储;通用缓存库(支持sp,mmkv,lru,disk,fastsp等多种存储方式切换);App重启;通用全面的工具类Utils;通用基类fragment,adpater,activity等简单封装;intent内容打印到控制台库;通用基础接口
Java
191
star
20

YCWidgetLib

自定义控件,其中包含自定义折叠布局,拓展性强使用简单;万能自定义红点控件,充分解耦合接入方便;多种方案实现阴影效果库;自定义view和viewGroup圆角控件,彻底解决圆角问题等
Java
186
star
21

YCWalleHelper

瓦力多渠道打包的Python脚本测试工具,通过该自动化脚本,自需要run一下或者命令行运行脚本即可实现美团瓦力多渠道打包,打包速度很快。配置信息十分简单,代码中已经注释十分详细。可以自定义输出文件路径,可以修改多渠道配置信息,简单实用。
Tcl
133
star
22

YCBannerView

轮播图,支持多种自定义属性,可以设置轮播红点或者轮播数字,支持设置引导页。可以根据不同使用场景,可以选择无限循环,静态管理或者动态管理adapter,还可以设置暂停和开始轮播。后期添加了RecyclerView轮播图,同时自定义多种类型SnapHelper,卡片滑动流畅,目前已经用于多个正式项目中!!
Java
106
star
23

YCLeetcode

组件之间的通信,很友好起到隔离效果,接口+实现类,使用注解生成代码方式,无需手动注册,将使用步骤简单化,支持组件间以暴露接口提供服务的方式进行通信。
Java
76
star
24

YCStudyWeb

Web学习案例
JavaScript
71
star
25

YCToolLib

通用工具库组件,包括前后台判断,拦截器时间,心跳轮询库,Task任务库,二维码扫码库,转场动画库,通用TTS音频播放库,国际化locale库等等
Java
66
star
26

YCServerLib

gRPC学习案例,使用gRPC作为网络方案可以带来高效性、跨平台和语言、可靠性、易于使用和可扩展性等收益。同时可以减少手动编写代码的工作量,提高开发效率。
Java
51
star
27

YCStudyC

系统性学习C编程,变量,数据类型,循环,选择,输入和输出,数组和容器,函数,结构体,指针,预处理,文件操作,调试等。练习多个完整小项目:学生管理系统,贪吃蛇,万年历,推箱子,五子棋。是入手学习C的练习完整项目
C
49
star
28

YCDesignHelper

注解学习小案例,比较系统性学习注解并且应用实践。简单应用了运行期注解,通过注解实现了setContentView功能;简单应用了编译器注解,通过注解实现了防暴力点击的功能,同时支持设置时间间隔;使用注解替代枚举;使用注解一步步搭建简单路由案例。结合相应的博客,在来一些小案例,从此应该对注解有更加深入的理解……
Java
45
star
29

YCDesignBlog

设计模式,创建型设计模式,结构型设计模式,行为型设计模式,面向对象设计原则,六大设计原则,面向对象设计思想,项目架构演进。持续迭代笔记和完善案例,打造全网系统高质量的设计模式笔记!
Java
44
star
30

YCTimerHelper

倒计时工具,分别使用了handler,自定义CountDownTimer,Timer和TimerTask,chronometer控件,和属性动画实现倒计时的功能。封装CountDownTimer倒计时器【在原有基础上增加了暂停和恢复倒计时功能】,解决了倒计时无法到0和从最大值开始bug
Java
13
star
31

YCJavaBlog

Java高级进阶专栏博客,数据类型原理,泛型设计思想,面向对象,继承,封装,io流,序列化,拷贝,高效读写,反射,注解,spi机制,异常,四种引用,线程原理,线程通信,线程池设计思想,线程并发优化,上下文切换原理,CAS,锁的设计和原理,类加载,对象布局,代码攻击,内存模型,即时编译,内存回收机制,性能调优,集合设计思想
Java
7
star
32

YCComputerBlog

计算机基础博客,计算机组成原理,存储器的设计,局部性原理,地址映射,CPU处理器用途,指令架构,CPU性能,缓存一致性,Cache,MESI协议,伪共享,CPU三级缓存设计思想,输入和输出,总线系统设计,指令编程,程序如何运行,内存存储设计,物理内存和虚拟内存,共享内存设计,计算机二进制的由来,异常处理,IO流操作
4
star
33

YCSplashSdk

打开app启动页sdk,支持图片广告,也支持视频
3
star
34

YCUniApp

uni开发的项目,由于公司项目做混合开发,因此边学边做。基础入门级的案例分析,近期学习更新中
Vue
3
star
35

YCPluginTool

Plugin插件学习工具
2
star
36

YCAndroidBlog

Android技术专栏
1
star
37

yangchong211

1
star