Android Studio 动态增加或者去掉指定模块

501 阅读1分钟

动态编译一个模块

想解决的问题,在编译某个版本的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和指定的类型.会增加或者删除指定的模块

image.png

处理以上内容后,模块内容将根据规则完成或者去掉.如果去掉的话,需要我们解决app模块内容引入指定的模块内容的问题. 我们可以考虑使用反射来解决.

引入未编译模块代码

  • 通过反射来解决没有加入编译模块导致的编译错误问题.

引用

反射的使用

反射的使用2

反射的使用3

反射的使用

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")