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

Android 编译gradle库时如何复制代码,android,android-studio,android-gradle-plugin,Android,Android Studio,Android Gradle Plugin,我正在为手机和手表建立一个Android库。虽然有些代码是相同的,但我确实需要两个单独的模块来存储手表代码和电话代码 我构建了这个库,并将它毫无疑问地上传到Maven。我可以将这些库导入到单独的项目中而不会出现问题 编译'com.github.fleker:my library:1.0.0' 编译'com.github.fleker:my library wear:1.0.0' 但是,我希望在我的库中有第三个模块来存储所有共享代码,从而减少复制和粘贴的代码量。在这个mylibrarycommon

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

我构建了这个库,并将它毫无疑问地上传到Maven。我可以将这些库导入到单独的项目中而不会出现问题

编译'com.github.fleker:my library:1.0.0'

编译'com.github.fleker:my library wear:1.0.0'

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

编译项目(“:我的库公用”)

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

未能解析:SettingsManager:SettingsManager:undefined
解析失败:设置管理员:库公用:未定义

所以我意识到我的错误。当我编译项目时,我的手机和穿戴模块是从一个已知的位置编译的。然而,它并没有导入代码,只是指向它。当我转到一个单独的项目时,该指针无效

是否有一种方法可以强制
库公共
模块将其代码导入我的两个主要模块中,这样我就可以为某些代码创建一个模块,但将另外两个单独的模块作为我的实际库

也许,有一种
导入项目(“:my library common”)
代替了
编译项目(“:my library common”)
,它会将代码放入项目中,这样当我上载此库时,就会包含
my library common
代码

这有意义吗


谢谢。

您需要使用gradle提供的产品风味(或技术构建变体)功能

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

  • 梯度同步

  • 在包名下创建定义为产品风格的特定文件夹,即com.buildsystemexample

  • 因此,在上面提到的包下基本上有3个文件夹:main、lib、lib

  • 将通用代码放在主模块下

  • 将其他代码放在各自的模块下。i、 e-lib和lib-wear

  • 从BuildVariant选项卡(android studio左下角)可以选择构建变体

  • 通过在选项卡中选择特定的构建变量,可以一次编译一种类型的库


  • 参考:

    您需要使用gradle提供的产品风味(或技术构建变体)功能

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

  • 梯度同步

  • 在包名下创建定义为产品风格的特定文件夹,即com.buildsystemexample

  • 因此,在上面提到的包下基本上有3个文件夹:main、lib、lib

  • 将通用代码放在主模块下

  • 将其他代码放在各自的模块下。i、 e-lib和lib-wear

  • 从BuildVariant选项卡(android studio左下角)可以选择构建变体

  • 通过在选项卡中选择特定的构建变量,可以一次编译一种类型的库


  • Ref:

    您好,谢谢您的评论。我想知道这在我的情况下是如何起作用的。现在我使用的是顶级模块,而您指的是构建变体。我的库没有打包然后上载。它们通过Sonatype和maven-push上传到Gradle。Gradle脚本:我认为作为一种解决办法,我可以将我的公共代码库推送到maven,然后将其包含在我的公共库中,而不是直接编译项目。@非常推荐Nick使用可传递依赖项。但即使你正在通过gradle进行maven推送,这也应该有效。大多数文档都谈到了应用程序的产品风格,但它也适用于库代码。唯一改变的是你平常的身材。gradle基本上一次检查选择了哪种口味,一次将aar文件推送到maven central。我开始尝试在构建文件中实现产品口味。然而,由于这是一个库而不是一个标准应用程序,我在设置flavors的应用程序ID时遇到了一个错误。我不确定是否有可能以这种方式拥有一个库的多个变体。嗨,谢谢你的评论。我想知道这在我的情况下是如何起作用的。现在我使用的是顶级模块,而您指的是构建变体。我的库没有打包然后上载。它们通过Sonatype和maven-push上传到Gradle。Gradle脚本:我认为作为一种解决办法,我可以将我的公共代码库推送到maven,然后将其包含在我的公共库中,而不是直接编译项目。@非常推荐Nick使用可传递依赖项。但即使你正在通过gradle进行maven推送,这也应该有效。大多数文档都谈到了应用程序的产品风格,但它也适用于库代码。唯一改变的是你平常的身材。gradle基本上一次检查选择了哪种口味,一次将aar文件推送到maven central。我开始尝试在构建文件中实现产品口味。然而,由于这是一个库而不是一个标准应用程序,我在设置flavors的应用程序ID时遇到了一个错误。我不确定是否有可能以这种方式拥有一个库的多个变体。
    ...
    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"
         }
       }
     }
    ...