动态编译一个模块
想解决的问题,在编译某个版本的app时,不想编译指定的某个模块. 需要解决的问题.
- 方便使用
- 不编译指定的模块代码
- app模块中引入的模块代码方便处理
步骤
- 编译模块动态
- 引用模块代码动态
编译模块动态
- 通过build Variants在app中build.gradle中设置不同的类型,以及编译参数
- 通过implemention的前缀来完成模块根据build Variants来决定是否加入到编译中 在app/build.gradle
productFlavors {
miss {
manifestPlaceholders = [str: "releaseStr", package_name: "com.a.b"]
applicationIdSuffix ".miss"
versionNameSuffix "-miss"
resValue "string", "app_name", "@string/miss_app_name"
resValue "string", "defaultScreen", 'miss'
manifestPlaceholders = [app_icon : "@drawable/icon_miss_app"]
buildConfigField "int", "TYPE", "1"
dimension = "version"
}
}
missImplementation project(":miss")
可以通过切换build Variant轻松指定类型. 通过missImplementation和指定的类型.会增加或者删除指定的模块
处理以上内容后,模块内容将根据规则完成或者去掉.如果去掉的话,需要我们解决app模块内容引入指定的模块内容的问题. 我们可以考虑使用反射来解决.
引入未编译模块代码
- 通过反射来解决没有加入编译模块导致的编译错误问题.
引用
反射的使用
fun createIRouterForName(name: String): IRouter {
return try {
val f = Class.forName(name).kotlin
f.createInstance() as IRouter
} catch (e: Exception) {
DefaultRouter()
} catch (e: Error) {
DefaultRouter()
}
}
val fileRouter = createIRouterForName("com.a.find.fileshare.FileRouter")