前言: 前段时间知乎有人问起“如何学习开源框架”这个问题,大家是如何学习开源框架的呢?
一位来自阿里的大佬立马整理了下自己的思路:
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不断!!!