[Android]多module合成单一module技巧
2016-07-27 20:26
609 查看
为何需要做会出现这样的需求呢?
我们当时开发的架构就是用多个module作为功能模块加载,所以就会单个项目出现多module的状态。
抽出sdk生成aar的时候,只能由一个module生成一个aar。
查看网上很多资料,最终在StackOverflow里查到只能多个module合并成单一module才能处理生成aar,不然就只能修改android编译的源码了。
但是我们工程业务是在持续开发中迭代的,我们没可能每次想更新一个sdk的时候都再做这种重复噶工作量。
那要如何处理这种多
没错,我们需要写一个脚本。
然后我们选择了写一个python的脚本。
说明一下我的工程架构
1.工程有一个主的工程client入口依赖于各个功能模块
2.工程功能module模块依赖于一个base的模块
3.base的module模块依赖于core和framework的模块。
如下图:
首先我们需要了解一下我们考虑的地方
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等文件
这些都是总结出来的一些经验,希望对各位有帮助吧,如果有疑问可以在之下留言。我收到会逐一回复。
我们当时开发的架构就是用多个module作为功能模块加载,所以就会单个项目出现多module的状态。
抽出sdk生成aar的时候,只能由一个module生成一个aar。
查看网上很多资料,最终在StackOverflow里查到只能多个module合并成单一module才能处理生成aar,不然就只能修改android编译的源码了。
但是我们工程业务是在持续开发中迭代的,我们没可能每次想更新一个sdk的时候都再做这种重复噶工作量。
那要如何处理这种多
没错,我们需要写一个脚本。
然后我们选择了写一个python的脚本。
说明一下我的工程架构
1.工程有一个主的工程client入口依赖于各个功能模块
2.工程功能module模块依赖于一个base的模块
3.base的module模块依赖于core和framework的模块。
如下图:
首先我们需要了解一下我们考虑的地方
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等文件
这些都是总结出来的一些经验,希望对各位有帮助吧,如果有疑问可以在之下留言。我收到会逐一回复。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories