如何在编译gradle库时复制代码

时间:2016-01-14 05:30:07

标签: android android-studio android-gradle

我正在为手机和手表构建一个Android库。虽然有些代码是相同的,但我需要两个独立的模块来存储手表代码和电话代码。

我构建了库并将其上传到Maven而没有问题。我可以毫无问题地将这些库导入到单独的项目中。

compile 'com.github.fleker:my-library:1.0.0'

compile 'com.github.fleker:my-library-wear:1.0.0'

但是,我希望通过在我的库中存储存储所有共享代码的第三个模块来减少复制和粘贴的代码量。在这个my-library-common模块中,我存储了一些类,然后将这个库添加到每个build.gradle

compile project(':my-library-common')

这似乎适用于我的图书馆项目。但是,当我上传此项目并尝试将其下载到其他地方时,我在执行Gradle同步时遇到错误:

Failed to Resolve: SettingsManager:settingsmanager:undefined Failed to Resolve: SettingsManager:library-common:undefined

所以我意识到自己的错误。当我编译项目时,我的手机和磨损模块正在从已知位置进行编译。但是,它不是导入代码,只是指向它。当我进入一个单独的项目时,该指针无效。

有没有办法可以强制library-common模块将其代码导入到我的两个主要模块中,这样我就可以为一些代码创建一个模块,但是有两个独立的模块作为我的实际库?

也许,而不是compile project(':my-library-common')有一些import project(':my-library-common')会将代码放入项目中,这样当我上传此库时,会包含my-library-common代码。

这有意义吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您需要使用gradle提供的Product Flavors(或技术构建变体)功能。

在构建文件中定义产品风格

...
android {
...
  defaultConfig { ... }
  signingConfigs { ... }
  buildTypes { ... }
  productFlavors {
    main {
        applicationId "com.buildsystemexample.main"
        versionName "1.0"
     }
    my-library {
        applicationId "com.buildsystemexample.lib"
        versionName "1.0"
    }
    my-library-wear {
        applicationId "com.buildsystemexample.lib-wear"
        versionName "1.0"
     }
   }
 }
...
  1. Gradle sync。

  2. 根据您的包名创建定义为您的产品口味的特定文件夹,即com.buildsystemexample

  3. 所以你基本上在上面提到的包下面有3个文件夹:main,lib,lib-wear

  4. 将公共代码放在主模块下。

  5. 将其他代码放在各自的模块下。即lib和lib-wear。

  6. 从BuildVariant标签(在android studio的左下角),您可以选择您的构建版本。

  7. 您可以通过在选项卡中选择特定的构建变体,一次编译一种类型的lib。

  8. 参考:android official docs