——》个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主精华、书籍
1、首先组件和模块都不是官方规定的,都是这些技术发展下来大家约定俗成的概念,他们都是一个个Module,只是概念内容不一样而已。
Module包含两种格式: application, library。一个Module就是一个小的项目,Module通过依赖来注入到主app工程中,也是AS概念中的模块。
>1.模块化开发:按照项目业务模块来划分,将一个app按业务拆分为登录模块、聊天模块等等。
模块化的概念可以说贯穿整个组件化,插件化。
>2.组件化开发:对应用功能的封装,一个功能一个组件。比如网络连接交互组件、即时通讯IM组件、数据库组件等。是对模块化更小的细分。
正常一个app中可以有多个module,但是一般只会有一个module是设置为application的,其他均设置为library。将一个工程分成各个模块,各个模块之间相互解耦,可以将module均设置为application独立开发并编译成一个独立的 app进行调试,然后又可以将各个模块module均设置为library组合起来整体构成一个完整的 app,这个概念和模块化没有本质的界限。
组件可以分为两大类,一类是application组件,一类是libs组件,application组件是一个可运行的app。library组件可以作为application的依赖,但是自身不可作为程序运行的存在。只有Module类型为application的组件才能单独提出来做为程序运行存在。
组件化是建立在模块化思想上的一次演进,一个变种。组件化本来就是模块化的概念。但是组件化的核心是模块角色的可转换性, 在打包时是library,在调试时是application。
解决以下项目中的问题:
1.稍微改动一个模块的一点代码都要编译整个工程,耗时耗力
2.公共资源、业务、模块混在一起耦合度太高
3.不方便测试
2.插件化开发
宿主是指普通的apk,插件一般是指经过处理的dex或者apk,在主流的插件化框架中多采用经过特殊处理的apk来作为插件,处理方式往往和编译以及打包环节有关。Android应用程序的.java文件在编译期会通过javac命令编译成.class文件,最后再把所有的.class文件编译成.dex文件放在.apk包里面。那么动态加载(插件化)就是在运行时把插件apk直接加载到classloader里面的技术。
目的:插件化就是要减小宿主程序apk包的大小,同时降低宿主程序的更新频率并做到自由装载模块、在线更新模块。
好处:
1.宿主和插件分开编译
2.并发开发
3.动态更新插件
4.按需下载模块
5.方法数或变量数爆棚
总结:
①组件化:
1. 用于项目过大,每次编译时间长
2. 用于团队多个人分工开发不同的模块
3. 更好的解耦
②插件化:
1. 用于版本新添加功能,更多的是启动另一个apk中的activity,或使用另一个apk的资源
2. 解决方法数超过65536问题
3. 按照需要下载模块,减小项目apk的大小
4.本质上它使用的技术还是热修复技术
③热更新:可以使用第三方的框架,现在都已经很成熟了如:腾讯提供的Bugly
1. 用于修复已经上线的bug等问题
2. 一般不用于新功能的版本上线
3.强调的是修改线上版本的bug,用技术去实现不更新整个apk的条件下,修改掉bug
总:
组件化的单位是组件(module)。插件化的单位是apk(一个完整的应用)。
组件化的灵活性在于按加载时机切换,分离出独立的业务功能组件,比如微信的朋友圈
插件化的灵活性在于是加载apk, 完全可以动态下载,动态更新,比组件化更灵活。
整个apk打包的流程图:
使用Android Asset Packaging Tool(aapt) ,将AndroidManifest.xml和res下的资源编译生成R.java文件,这样java文件就可以去引用资源了 - 使用aidl 工具去生成对应的Java interfaces - 将src和通过aapt生成的R.java,.aidl文件通过javaC命令去生成.class 文件 - 使用dex tool 将class文件转化成Dalvik byte code.这时候要将所有class文件和第三方的jar包都包括。 - 所有没有编译过得图片和编译过的图片,.dex文件传给apkbuilder去打包成.apk - 最后采用zipalign tool 打入签名
网友评论