网易组件化路由架构

  • 作者:彭老师
  • 日期:2019-07-23
  • 类型:Android
  • 说明:本文源于彭老师手写摘要,如需转载请带上链接或注明出处!

组件化架构的意义

面试技巧

  • 团队开发时,方便项目管理,分工明确,互不干扰。不存在甩锅。每个人都可以做个安静的美男子
  • 个人开发时,提高逼格、养成企业开发模式的习惯
  • (女生找男朋友,首先看外边。再了解是否有房有车有存款。然后决定)
  • (如何在最短时间打动面试官道理是一样,资历摆在那好比外表,如果面试官问了了解组件化吗?)

开发需求(如下图:移动架构师 - 组件化架构设计图)

  • 组件化简单概括就是把一个功能完整的 App 或模块拆分成多个子模块
  • 每个子模块可以独立编译和运行, 也可以任意组合成另一个新的 App 或模块
  • 每个模块即不相互依赖但又可以相互交互
  • 遇到某些特殊情况甚至可以升级、降级、替换

团队效率

  • 例子:某BAT项目有20多个模块,总计两百多万代码。找一个功能特别费劲
  • 如果每一个模块都是由一个团队或者个人维护。这样就非常清晰
  • 测试部门(新增了小功能、原有功能小修改):
  • 如果不使用组件化打包,而是常规的统一打包整个项目apk。效率低、成本高

组件化的好处:

  • 1、分模块打包、测试
  • 2、统一版本管理,比如修改项目中10个模块的版本号,现在只需要修改一处

搭建框架可能遇到的问题:

  • Phone Module和Android Library区别、切换
  • 组件化开发的临时代码,集成化打包时动态隔离

原理分析(如下图:移动架构师 - 组件化路由架构设计图):


开发者文档,非常简单

@ARouter(path = "/app/MainActivity")
public class MainActivity extends BaseActivity {

@Parameter
String name;

@Parameter
int age;

@Parameter
boolean isSuccess;

@Parameter(name = "netease")
String abc;

@Parameter(name = "/order/getDrawable")
OrderDrawable orderDrawable;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (BuildConfig.isRelease) {
Log.e(Cons.TAG, "当前为:集成化模式,除app可运行,其他子模块都是Android Library");
} else {
Log.e(Cons.TAG, "当前为:组件化模式,app/order/personal子模块都可独立运行");
}

// 懒加载方式,跳到哪加载哪个类
ParameterManager.getInstance().loadParameter(this);

int drawableId = orderDrawable.getDrawable();
ImageView img = findViewById(R.id.img);
img.setImageResource(drawableId);
}

public void jumpOrder(View view) {
RouterManager.getInstance()
.build("/order/Order_MainActivity")
.withString("username", "simon")
.navigation(this, 163);
}

public void jumpPersonal(View view) {
RouterManager.getInstance()
.build("/personal/Personal_MainActivity")
.withString("username", "baby")
.navigation(this, 163);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
Log.e(Cons.TAG, data.getStringExtra("call"));
}
}
}

可能有同学想到了阿里路由:https://github.com/alibaba/ARouter

站在开发者的角度,彭老师只说4句话:

  • 1、全局静态Map缓存多达5个,还有一个全局静态List缓存
  • 2、加载私有目录下apk中的所有dex并遍历,获得所有包名为xxx的类(部分华为不兼容,为防止逆向)
  • 3、加载过程是耗时操作,开启了线程池工作
  • 4、核心代码已经2年未更新

更多技术内幕请关注:网易云课堂 - 微专业 - 安卓高级开发工程师