今天看了《android组件化方案》这篇博客感觉对组件化的了解大大提升,先把链接给出“android组件化方案”,大家不想看我比比的,可以去看原文,想看我的个人浅显的理解的也欢迎。
组件化,个人理解有点像赛亚人合体一样。大部分都是一个独立的个体,组在一起就是一个更厉害的赛亚人,也有的部分就像合体的条件,虽然单独不能成为一个独立的个体,但是也是不可或缺的。android的组件化分为三部分:1,业务组件 2,功能组件 3,APK壳工程。 业务组件故名思意就是app的业务流程部分;功能组件就是业务组件通用的一些依赖库,例如:网络请求库的封装,刷新功能库,日志库等待;APK壳工程就是只有一个外壳的,把各个业务组件和功能组件组合起来的工程项目。
在业务组件组合程apk之前,每个业务组件都是可以单独运行的,因此每个组合之前都是工程不是依赖库。要控制它们是依赖库还是工程项目是可以通过build.gradle中更改apply plugin。
1、application属性,可以独立运行的Android程序,也就是我们的APP;
apply plugin: ‘com.android.application’
- 1
2、library属性,不可以独立运行,一般是Android程序依赖的库文件;
apply plugin: ‘com.android.library’
因为如果业务组件很多,手工配置很麻烦可以通过配置APK壳工程的根目录的gradle.properties(只能设置String常量),设置一个String常量来控制是否是依赖库还是工程。每次更改这个值都需要点击“sync project”按钮。
业务组件,功能组件,apk壳合并为一个app需要解决几个问题:
1,Androidmanifest的冲突问题
因为业务组件平常是一个单元可以运行,因此是需要一个完整的Androidmanifest,但是等它合并之后又不需要了。因此我们需要能够控制androidmanifest。那我们能够控制吗?答案是必然的!我们可以在build.gradle中指定用那个androidmanifest。既然如此我们就可以创建两个androidmanifest,然后通过判断是否组合的String常量来控制使用那个。
例如:
sourceSets {
main {
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
library的androidmanifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.guiying.girls">
<application android:theme="@style/AppTheme">
<activity
android:name=".main.GirlsActivity"
android:screenOrientation="portrait" />
<activity
android:name=".girl.GirlActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
</application>
</manifest>
没有权限申请,app名称、图标,启动activity
2.一些数据和通用数据的获取问题
因为业务组件是单独的个体,所以像登录界面就只有一个组件有,那其他组件就不用登录了吗?肯定不是的,因为网络请求是需要TOKEN和其他数据的,但是token一般只有登录后才会返回。在这里,我们可以在Application中初始化一些数据(token,context等)。同样为了防止合并的时候application冲突,需要把application去掉。可以在Java目录下创建一个文件夹如debug,然后把application放进去,最后在build.gradle中通过代码去掉这个文件夹。
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成开发模式下排除debug文件夹中的所有Java文件
java {
exclude 'debug/**'
}
}
3.library的冲突问题
我们还是要考虑另一个情况,我们在build.gradle中compile的第三方库,例如AndroidSupport库经常会被一些开源的控件所依赖,而我们自己一定也会compile AndroidSupport库 ,这就会造成第三方包和我们自己的包存在重复加载,解决办法就是找出那个多出来的库,并将多出来的库给排除掉,而且Gradle也是支持这样做的,分别有两种方式:根据组件名排除或者根据包名排除,下面以排除support-v4库为例:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile("com.jude:easyrecyclerview:$rootProject.easyRecyclerVersion") {
exclude module: 'support-v4'//根据组件名排除
exclude group: 'android.support.v4'//根据包名排除
}
}
4.组件间的跳转和通信
跳转可以通过第三方框架,阿里巴巴的ARouter 或者 ActivityRouter ,通信可以通过Eventbus或者广播