模块化-Application多module共存编译生成解决方案

栏目: IOS · Android · 发布时间: 4年前

内容简介:组件化的一个目的是为了业务解耦,子 module 有些特殊功能的初始化需要在网上很多方案是使用反射或者在这里通过注解编译时生成代码+反射实现,简单方便,易于理解。

组件化的一个目的是为了业务解耦,子 module 有些特殊功能的初始化需要在 Application 中完成,而壳 module 不需要知道具体如何完成这些初始化操作。这就需要解决多个 module 中 Application 共存的问题。

网上很多方案是使用反射或者在 AndroidManifest 中配置 meta-data 来实现。

这里通过注解编译时生成代码+反射实现,简单方便,易于理解。

方案实现

  1. 初始化,子 module 和壳 module 中都需要如下配置。
dependencies {
    //框架内核包括注解和接口,可以单独提取出来使用
    implementation 'com.github.coolfire2015.RxFluxArchitecture:core-arch:1.0.4'
    //注解编译器
    annotationProcessor 'com.github.coolfire2015.RxFluxArchitecture:core-arch-processor:${RX_FLUX_ARCHITECTURE}'
}
复制代码
  1. 子 module 中创建 AppLifecycle 类实现 RxAppLifecycle 接口,并使用 @RxAppDelegate 标注。
@RxAppDelegate
public class GanAppLifecyle implements RxAppLifecycle {
    @Override
    public void onCreate(Application application) {
        EventBus.builder()
                .addIndex(new GanEventBusIndex())
                .eventInheritance(false);
    }
}
复制代码
  1. 壳 module 中的 Application 继承 RxApp 类,并使用 @RxAppBody 标注。项目中唯一存在
@RxAppBody
public class SimpleApplication extends RxApp {
    
}
复制代码

方案原理

该方案采用 GlideLibraryGlideModule 的实现方式。

  1. 子 module 中, @RxAppDelegate 标注的 RxAppLifecycle 接口实现类,编译后会在子 module 路径 /build/generated/source/apt/debug/com/huyingbao/core/processor/ 下会生成一个索引类 RxIndexer_包名_类名.java
@RxIndex(
    modules = "com.huyingbao.module.wan.action.WanAppLifecyle"
)
public class RxIndexer_com_huyingbao_module_wan_action_WanAppLifecyle {
}
复制代码
  1. 壳 module 在编译过程中,编译处理器 RxArchProcessor 检查代码中是否唯一有使用 @RxAppBody 标注并继承 RxApp 的类
private void processRxAppBody(RoundEnvironment env) {
        for (TypeElement element : mProcessorUtil.getElementsFor(RxAppBody.class, env)) {
            if (mProcessorUtil.isRxApp(element)) {
                mRxAppList.add(element);
            }
        }
        mProcessorUtil.debugLog("got app modules: " + mRxAppList);
        if (mRxAppList.size() > 1) {
            throw new IllegalStateException("You cannot have more than one RxApp, found: " + mRxAppList);
        }
}
复制代码
  1. 如果有,则从当前包 /com/huyingbao/core/processor/ 附加的类中获取到所有子 module 中编译生成的 RxIndexer_ 类,再从 RxIndexer_ 类的注解 @RxIndex 中取出 modules 字段中存储的 RxAppLifecycle 接口实现类名。
private Set<String> getIndexedClassNames(PackageElement packageElement) {
        Set<String> rxAppLifecycles = new HashSet<>();
        //获取当前包元素附加的所有元素
        List<? extends Element> rxAppLifecycleGeneratedElements = packageElement.getEnclosedElements();
        for (Element indexer : rxAppLifecycleGeneratedElements) {
            RxIndex annotation = indexer.getAnnotation(RxIndex.class);
            // If the annotation is null, it means we've come across another class in the same package
            // that we can safely ignore.
            if (annotation != null) {
                Collections.addAll(rxAppLifecycles, annotation.modules());
            }
        }
        mProcessorUtil.debugLog("Found RxAppLifecycle: " + rxAppLifecycles);
        return rxAppLifecycles;
    }
复制代码
  1. 在壳 module 路径 /build/generated/source/apt/debug/com/huyingbao/core/arch/ 下会生成一个 RxAppLifecycle 实现类 RxAppLifecycleImpl
final class RxAppLifecycleImpl implements RxAppLifecycle {
  @Override
  public void onCreate(Application application) {
    new GanAppLifecycle().onCreate(application);
    new WanAppLifecyle().onCreate(application);
  }
}
复制代码
  1. RxApp 类中通过反射获取 RxAppLifecycleImpl 实例对象。
private RxAppLifecycle getAnnotationGeneratedRxAppLifecycleImpl() {
        RxAppLifecycle result = null;
        try {
            Class<RxAppLifecycle> clazz = (Class<RxAppLifecycle>)
                    Class.forName("com.huyingbao.core.arch.RxAppLifecycleImpl");
            result = clazz.getDeclaredConstructor().newInstance();
        } catch (ClassNotFoundException e) {
            if (Log.isLoggable(TAG, Log.WARN)) {
                Log.w(TAG, "Failed to find RxAppLifecycleImpl. You should include an"
                        + " annotationProcessor compile dependency on com.github.coolfire2015.RxFluxArchitecture:core-arch-processor"
                        + " in your application and a @RxAppDelegate annotated RxAppLifecycle implementation"
                        + " and a @RxAppBody annotated RxApp implementation");
            }
            // These exceptions can't be squashed across all versions of Android.
        } catch (InstantiationException e) {
            throwIncorrectRxAppLifecycle(e);
        } catch (IllegalAccessException e) {
            throwIncorrectRxAppLifecycle(e);
        } catch (NoSuchMethodException e) {
            throwIncorrectRxAppLifecycle(e);
        } catch (InvocationTargetException e) {
            throwIncorrectRxAppLifecycle(e);
        }
        return result;
}
复制代码

Application 生命周期方法中调用 RxAppLifecycleImpl 实例对象中的对应方法。

private RxAppLifecycle mGlobalRxAppLifecycle;

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    mGlobalRxAppLifecycle = getAnnotationGeneratedRxAppLifecycleImpl();
}

@Override
public void onCreate() {
    super.onCreate();
    if (mGlobalRxAppLifecycle != null) {
       mGlobalRxAppLifecycle.onCreate(this);
    }
}
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

精通Java并发编程(第2版)

精通Java并发编程(第2版)

[西] 哈维尔·费尔南德斯·冈萨雷斯 / 唐富年 / 人民邮电出版社 / 2018-10 / 89.00元

Java 提供了一套非常强大的并发API,可以轻松实现任何类型的并发应用程序。本书讲述Java 并发API 最重要的元素,包括执行器框架、Phaser 类、Fork/Join 框架、流API、并发数据结构、同步机制,并展示如何在实际开发中使用它们。此外,本书还介绍了设计并发应用程序的方法论、设计模式、实现良好并发应用程序的提示和技巧、测试并发应用程序的工具和方法,以及如何使用面向Java 虚拟机的......一起来看看 《精通Java并发编程(第2版)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换