[Android]多module合成单一module技巧

作者: CangWang | 来源:发表于2016-07-27 20:05 被阅读4364次

    以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

    [Android]如何做一个崩溃率少于千分之三噶应用app--章节列表

    我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习的交流。

    群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!

    为何需要做会出现这样的需求呢?

    我们当时开发的架构就是用多个module作为功能模块加载,所以就会单个项目出现多module的状态。

    抽出sdk生成aar的时候,只能由一个module生成一个aar。

    查看网上很多资料,最终在StackOverflow里查到只能多个module合并成单一module才能处理生成aar,不然就只能修改android编译的源码了。

    但是我们工程业务是在持续开发中迭代的,我们没可能每次想更新一个sdk的时候都再做这种重复噶工作量。

    那要如何处理这种多module合并的问题。

    没错,我们需要写一个脚本。

    然后我们选择了写一个python的脚本。

    说明一下我的工程架构

    1.工程有一个主的工程client入口依赖于各个功能模块

    2.工程功能module模块依赖于一个base的模块

    3.base的module模块依赖于core和framework的模块。

    如下图:

    Q����


    首先我们需要了解一下我们考虑的地方

    1.如何生成一个总工程的AndroidMainfest呢?因为多个module,里面肯定有可能加载了很多四大组件的,那么都需要在各自的module注册的AndroidMainfest注册的。

    2.假如java文件有依赖于R.文件,而java文件分别在不同的module里面,合并module,其原来R的索引就会不存在了

    3.value里面的string color等文件会同名,如何处理呢?

    4.build.gradle如何配置呢?

    对于上面的问题解决的方案:

    1.将本来工程编译成功后,在build\intermediates\mainifests\full里面有已经生成好的AndroidMainfest.xml。

    这个文件有全部已经打包好四大组件。所以其实编译器是有能力将全部的module编译成单一module的,只是没有公开这样的设置

    2.对于依赖的R.文件,工程最终还是要编译成client的app的,将全部的java文件有加入import R的依赖移除,再添加成client的R依赖

    3.value里面的文件可以前部加入一个module的前缀(如string.xml,改为base_string.xml),aapt生成string里面的字符最好不要重复名称

    4.build.gradle 需要手动整合全部module所要依赖的修改(例如分享模块,会需要依赖分享的库,图片模块需要加入图片库),然后才能实验编译

    还需要总结一下我之后踩到的一些坑

    1.因为python是现学现用的,可能很多技巧也还没接触到,例如shutil.copyfile,shutil.copytree,os.system("xcopy")是有很大的区别的,请先尝试一下这些方法的区别,我一般都是用cmd运行试验的。

    2.Android中请确定资源的名称一定要是唯一的,例如drawable和layout,其他java文件等,请尽量名称不要重名。

    3.因为每个module建立的时候都有一个的对应的app_name,可以将其删除,这样会避免冲突

    4.移植的时候不需要将各个module里面的AndroidMainfest和build.gradle文件移到文件夹里面

    5.移植的时候,请先移植client的module(原生成app的module),然后再移植base,core,framework等基础module,再去移植其他功能模块的module,然后再替换AndroidMainfest和build.gradle等文件

    这些都是总结出来的一些经验,希望对各位有帮助吧,如果有疑问可以在之下留言。我收到会逐一回复。

    相关文章

      网友评论

        本文标题:[Android]多module合成单一module技巧

        本文链接:https://www.haomeiwen.com/subject/qjbmqttx.html