前言: 前段时间知乎有人问起“如何学习开源框架”这个问题,大家是如何学习开源框架的呢?
一位来自阿里的大佬立马整理了下自己的思路:
1: 了解:先了解该开源框架是在什么背景下诞生的,主要用来解决什么问题。
2: 熟悉:这个开源框架的原理是什么?比如用了什么样的设计模式。比如运用了反射机制。
3: 思考:如果让你来设计这样的开源框架, 你如何设计?很多框架都很笨重,你是否能按照自己的设计弄一个轻量级的。做这一步的目的是让自己带着问题去学习开源框架,不然看着看着就云里雾里了。
4: 深入:下载开源框架的源代码,运行一个Demo,找到框架的入口,使用deBUG模式,断点看源代码的执行流程。
5: 总结:总结该开源框架的优点和缺点是什么。我想到这个阶段你可以说是精通该开源框架。
其他技巧:
有一定能力的技术人员先看DEMO 文档太多很容易看晕。
先看框架的外层,再看内层。逐层学习。
多画图,将信息结构化。
多总结,将信息由多变少。
实战应用:(组件化框架)
一,创建工程
1,APP空壳工程
通过AndroIDStudio创建一个APP空壳工程,如图:
APP空壳工程
然后在 APP 工程添加依赖具体业务组件 Module。比如:
依赖关系
2,具体业务组件Module
需要遵循一定组件命名规范,为何需要规范呢,因为需要通过组件命名规范来约束和保证组件的统一性和一致性,避免出现冲突。比如登陆组件,那么名称:b(类型)-ga(部门缩写)-login(组件名称),这就是我们基于共同的约定进行命名的,为后期维护和扩展都带来辨识度。
Login业务组件
二,业务组件配置文件
1,build.gradle配置文修改。如下:
<pre language="JavaScript" code_block="true">if (isModule.toBoolean()) { apply plugin: 'com.androID.application'} else { apply plugin: 'com.androID.library'}androID { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsversion rootProject.ext.buildToolsversion defaultConfig { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion if (isModule.toBoolean()) { applicationID "com.hik.ga.business.login" versionCode 1 versionname "1.0" } else { //ARouter javaCompileOptions { annotationProcessorOptions { arguments = [ modulename : project.getname() ] } } } } sourceSets { main { if (isModule.toBoolean()) { manifest.srcfile 'src/main/module/AndroIDManifest.xml' } else { manifest.srcfile 'src/main/AndroIDManifest.xml' //集成开发模式下排除deBUG文件夹中的所有Java文件 java { exclude 'deBUG/**' } } } } buildTypes { release { MinifyEnabled false proguardfiles getDefaultProguardfile('proguard-androID.txt'), 'proguard-rules.pro' } }}dependencIEs { implementation project(':b-ga-common-function-comlib') if (!isModule.toBoolean()) { annotationProcessor "com.alibaba:arouter-compiler:${rootProject.annotationProcessor}" }}
这里需要有几点说明一下:
1,通过 isModule.toBoolean() 方法来进行组件间集成模式和组件模式的切换,包括模块是属于Application 还是 library,由于集成了 ARouter,所以需要对 ARouter 配置文件进行处理。
2,如果组件模式下, 则需要重新设置 AndroIDManifest.xml 文件,里面配置新的Application路径。比如Login组件单独运行 AndroIDManifest 清单文件
<pre language="JavaScript" code_block="true"><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID" package="hik.ga.business.applogin" > <application androID:name="deBUG.LoginApplication" androID:allowBackup="false" androID:icon="@mipmap/ic_launcher" androID:label="@string/login_btn_str" androID:supportsRtl="true" androID:theme="@style/theme.AppCompat.light.NoActionbar"> <activity androID:name="hik.ga.business.applogin.login.vIEws.LoginActivity" androID:label="@string/login_btn_str" androID:launchMode="singletop" androID:screenorIEntation="portrait" androID:theme="@style/Apptheme.NoActionbarFullScreen"> <intent-filter> <action androID:name="androID.intent.action.MAIN" /> <category androID:name="androID.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
3,实现组件全局应用配置类,这个类的目的是在组件加载时初始化一些组件自身的资源,如下:
<pre language="JavaScript" code_block="true">public class LoginApplicationDelegate implements IApplicationDelegate { private static final String TAG = "LoginApplicationDelegate"; @OverrIDe public voID onCreate() { EFLog.d(TAG, "*------------------onCreate()---------------->"); } @OverrIDe public voID enterBackground() { EFLog.d(TAG, "*------------------enterBackground()---------------->"); } @OverrIDe public voID enterForeground() { EFLog.d(TAG, "*------------------enterForeground()---------------->"); } @OverrIDe public voID receiveRemoteNotification(Map<String, String> message) { EFLog.d(TAG, "receiveRemoteNotification msg = " + message); } @OverrIDe public voID onTerminate() { EFLog.d(TAG, "*------------------onTerminate()---------------->"); } @OverrIDe public voID onConfigurationChanged(Configuration configuration) { EFLog.d(TAG, "*------------------onConfigurationChanged()---------------->"); } @OverrIDe public voID onLowMemory() { EFLog.d(TAG, "*------------------onLowMemory()---------------->"); } @OverrIDe public voID onTrimMemory(int var1) { EFLog.d(TAG, "*------------------onTrimMemory()---------------->"); }}
三,路由服务
1,定义公共组件路由API和入口,通过路由服务组件查找,如图:
公共路由服务
2,组件路由实现
每个组件对外提供什么能力,首先需要在路由服务组件创建一个接口文件,如下是登陆组件接口声明和实现。
Login 接口:
定义Login接口
具体实现:
Login接口具体实现
路由使用:比如我们想从设置页面跳转到登陆页面,使用 Login 接口里的方法,使用如下:
<pre language="JavaScript" code_block="true">ILoginProvIDer loginService = (ILoginProvIDer) ARouter.getInstance().build(RouterPath.ROUTER_PATH_TO_LOGIN_SERVICE).navigation();if(loginService != null){ loginService.accountTologin(AccountActivity.this);}
当然,光有这些思路和搞懂单个知识的应用是还远远不够的,在AndroID开源框架设计思想中的知识点还是比较多的,想要搞懂还得学会整理和规划:我们常见的**AndroID热修复框架、插件化框架、组件化框架、图片加载框架、网络访问框架、RxJava响应式编程框架、IOC依赖注入框架、最近架构组件Jetpack等等AndroID第三方开源框架,**这些都是属于AndroID开源框架设计思想的。如下图所示:
这位阿里P8大佬针对以上知识点,熬夜整理出了一本长达1042页的完整版如何解读开源框架设计思想pdf文档,内容详细,把AndroID热修复框架、插件化框架、组件化框架、图片加载框架、网络访问框架、RxJava响应式编程框架、IOC依赖注入框架、最近架构组件Jetpack等等AndroID第三方开源框架这些知识点从源码分析到实战应用都讲的简单明了。
由于文档内容过多,篇幅受限,只能截图展示部分,更为了不影响阅读,这份文档已经打包在GitHub,有需要的朋友可以直接点此处前往免费下载。
1042页完整版解读开源框架设计思想pdf文档点击我就可以免费获取了,喜欢的朋友不要忘了给文章点个赞哦。
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!!!
更多Android相关资料可点此处获取。
总结以上是内存溢出为你收集整理的HR:作为一个Android开发者,开源框架设计思想你搞不懂,你走吧!全部内容,希望文章能够帮你解决HR:作为一个Android开发者,开源框架设计思想你搞不懂,你走吧!所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)