我们知道在使用ARouter时,需要在build.config里配置:
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
并且知道annotationProcessor用来声明注解解析器,arouter-compiler用来解析ARouter中的各个注解并自动生成class类,那么我们就来看一下到底生成了哪些类:
其生成的5个索引文件有4大类(Group类有2个文件,按Group区分开了),他们都实现了ARouter中的接口:
至于他们都代表什么,我们后面一一分析。
ARouter初始化
在自定义Application中进行初始化:
// 尽可能早,推荐在Application中初始化
ARouter.init(Application.this);
点进去看一下:
//ARouter.java
public static void init(Application application) {
if (!hasInit) {
logger = _ARouter.logger;
_ARouter.logger.info(Consts.TAG, "ARouter init start.");
hasInit = _ARouter.init(application);
if (hasInit) {
_ARouter.afterInit();
}
_ARouter.logger.info(Consts.TAG, "ARouter init over.");
}
}
哦,ARouter又调用了_ARouter.init(application)去初始化,再点进去:
//_ARouter.java
private volatile static ThreadPoolExecutor executor = DefaultPoolExecutor.getInstance();
protected static synchronized boolean init(Application application) {
mContext = application;
LogisticsCenter.init(mContext, executor);
logger.info(Consts.TAG, "ARouter init success!");
hasInit = true;
mHandler = new Handler(Looper.getMainLooper());
return true;
}
哦,_ARouter
在init
初始化方法里除了初始化一些变量和一个handler
,又调用了LogisticsCenter.init(mContext, executor)
, 其中executor
是一个线程池, 继续跟到LogisticsCenter
里去:
/**
* LogisticsCenter contains all of the map.
* 1\. Creates instance when it is first used.
* 2\. Handler Multi-Module relationship map(*)
* 3\. Complex logic to solve duplicate group definition
*/
//LogisticsCenter.java
public synchronized static void init(Context context, ThreadPoolExecutor tpe) throws HandlerException {
Set<String> routerMap;
//1、遍历“com.alibaba.android.arouter.routes”路径下的类并把其加入到set中
if (ARouter.debuggable() || PackageUtils.isNewVersion(context)) {
// These class was generated by arouter-compiler.
routerMap = ClassUtils.getFileNameByPackageName(mContext, ROUTE_ROOT_PAKCAGE);
if (!routerMap.isEmpty()) {
context.getSharedPreferences(AROUTER_SP_CACHE_KEY, Context.MODE_PRIVATE).edit().putStringSet(AROUTER_SP_KEY_MAP, routerMap).apply();
}
// Save new version name when router map update finishes.
PackageUtils.updateVersion(context);
} else {
logger.info(TAG