前言
我们知道模块儿化的一个重要特征就是,热插拔。本文主针对ARouter模块儿化的热插拔进行一个讲解。
转载请注明出处:http://blog.csdn.net/user11223344abc?viewmode=contents
前情回顾
还记得之前我们讲过2篇关于Arouter的文章:
Hello Arouter
https://blog.csdn.net/user11223344abc/article/details/79256921IProvider跨模块儿服务访问
https://blog.csdn.net/user11223344abc/article/details/79913830
那么本篇就接着这俩片文章的项目继续进行编码。
步骤
定位需要热插拔的模块
比如我想把项目内这俩个模块进行热插拔,moudle_home,moudle_user。(但是为了言简意赅,本文我只针对userMoudle进行配置,当你会了一个moudle的配置,其他moudle照搬即可。)
gradle.propertise文件内定义好属性,为true,表示不需要指定为热插拔,为false表示需要指定为热插拔。
isNeedHomeModule=true
#isNeedHomeModule=false
isNeedUserModule=true
#isNeedUserModule=false
新增热插拔时启动的页面,清单文件,Application
因为我们脱离了宿主moudle进行编译运行,那么,原先作为lib的moudle必然需要给其指定一个默认启动的Lauchactivity,以及清单Manifest文件。
新增热插拔时启动的页面
这个不多说,新建UserLauchAcitivty.java,布局你随便配
新增Application
为什么要新增这个,因为当我们在我们的子Moudle内进行了一些三方库的使用,就譬如说Arouter,那么这些三方库肯定牵涉到一个初始化配置,当我们脱离了宿主moudle进行编译的时候,就会出现在没有初始化就行三方库的调用,那么必定是要报错的。定义这个Application的含义就在于此。
这里我创建了一个UserLaunchAcitivty.java。
新增debug目录和manifest清单文件
之前俩步相当于是准备好了材料,这一步我们就要把这些材料配置到清单文件里去,但是注意,这个清单文件我们并不能直接修改当时我们创建libMoudle时的清单文件,为什么,因为这样做很容就把单独编译和融合编译的配置文件搞混,具体怎么做呢?
- 新建一个debug文件建
- copy原有的清单文件到该目录下,改吧改吧,这里我贴出我的配置文件。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="aroutertest.zj.com.moudle_user">
<application android:name=".application.UserApplication">
<activity android:name=".UserLaunchAcitivty">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".UserMainActivity" />
</application>
</manifest>
- 配置完清单文件之后,我们还需要在本地gradle内进行一个区分配置,因为目前我们项目内已经有俩个清单文件了。
android{
...
sourceSets{
main {
if(isNeedUserModule.toBoolean()){
manifest.srcFile 'src/main/AndroidManifest.xml'
}else {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
}
}
}
...
}
修改目标moudle内的配置
UserMoudle/build.gradle
if (isNeedUserModule.toBoolean()) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
android {
......
}
修改宿主moudle内的compile配置
当一个moudle需要编译为application时,在宿主内就不要去compile lib它。否则报错。
app/build.gradle
android {
...
dependencies {
if (isNeedUserModule.toBoolean()) {
compile project(':moudle_user')
}
}
}
效果展示
具体效果各位可以去下载demo来运行看看,我这里就不截图展示了。
需要提醒的是,如果按照本文来做可能会让你排查一下启动时候的清单文件的属性有无配置。具体可以看demo代码内,这里也不演示了。
分多的朋友求散分:
https://download.csdn.net/download/user11223344abc/10406008
没分的朋友也能下:
https://github.com/zj614android/ARouterHotPlugged
Thanks
https://blog.csdn.net/huangxiaoguo1/article/details/78753555