AndroidStudio多模块编译之子模块的调试

我们构建规模较大的Android工程时为了复用和分工协作,会使用到多模块构建应用程序。有时候一个App的编译也依赖于多个子模块,这样的App通常由一个app模块和若干个library模块组成。我们通过compile project(‘:library’)的方式就可以引入子模块供我们所用。但这种情况下有个问题,主模块引入的library默认情况下总是以release方式编译。

子模块无法调试和打印LOG

这就意味着,不管app模块是以debug还是release方式编译,子模块的BuildConfig.DEBUG的值永远是false,且log不得输出,更重要的是release版本中本地代码无法断点调试。
相关现象的英文描述引用:
By default a library only publishes its release variant. This variant will be used by all projects referencing the library, no matter which variant they build themselves. This is a temporary limitation due to Gradle limitations that we are working towards removing.

1.子模块发布debug版本

要解决这个问题,最直接的就是指定子模块固定发布debug版本供其他模块引用,You can control which variant gets published:

1
2
3
android {
defaultPublishConfig "debug"
}

如果有Flavor,也需要指定Flavor:

1
2
3
android {
defaultPublishConfig "flavor1Debug"
}

这样以后,子模块发布的版本总是被指定为debug版本,调试也可以正常进行了。

2.根据主模块切换编译方式

上一种办法,通过添加 defaultPublishConfig “debug” 解决了调试问题,这样虽然再debug状态下好使了,但是在发release版本的时候会导致DEBUG仍然为true。
除非手动修改defaultPublishConfig “release”,我们想实现其随app模块的切换自动切换呢。

  • Library
1
2
3
android {
publishNonDefault true
}
  • App
1
2
3
4
dependencies {
releaseCompile project(path: ':library', configuration: 'release')
debugCompile project(path: ':library', configuration: 'debug')
}

这些配置也很容易理解,就是让子模块生成多个arr包,主模块根据需要来决定编译时引用哪一个。

3.更多参考资料

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器