【问题标题】:Android Studio: using Android Modules without duplicating codeAndroid Studio:使用 Android 模块而不复制代码
【发布时间】:2015-02-15 16:34:04
【问题描述】:

我需要实现两个应用程序AppAAppB,它们使用相同的Android 库LibC

使用 Android Studio,我希望拥有三个项目:LibCAppAAppB,其中 AppAAppB 引用 LibC。我找不到获得这个的方法。

到目前为止,我已经实现了AppA。在编写AppA 时,我通过

创建了一个模块
File > New Module > Android Library > `LibC`

LibC 库现在位于 AppA 项目中,我需要在 AppB 项目中开始使用它。

问题一:

如何将LibC 移出项目AppA 并仅为LibC 创建一个项目?

问题2:

我应该如何创建一个只包含 Android 库的新项目?

如果我启动一个新的 Android 项目,它会不断创建一个新的应用程序。

The doc here 说:

1) 我需要创建一个新应用程序,然后在该应用程序中创建一个新模块(这是我在编写 AppA 时所做的);

2) 我可以将现有库代码导入新项目。

但是我不想将库的代码复制到新项目中(这就是发生的情况),我想使用 same 文件以便为库保留一个单一的代码库。

这可能吗?如果是,我在哪里可以找到有关它的文档?

【问题讨论】:

标签: android android-studio intellij-idea


【解决方案1】:

由于我最近在自己的项目中有这个需求,所以我可能对你有一些建议。

基本上这是您的选择:

1。具有不同模块的单个项目

如果 AppA 和 AppB 以某种方式相关(这是您必须决定的事情),您可以采用简单的方法。您的项目中已经有了 AppA 和 LibC,因此您只需在 Studio 中为 AppB 创建另一个 App 模块(文件 > 新建模块 > 应用程序模块)

您可能会看到有趣的是,您的项目目录最初的名称为 AppA,而您的 AppA 模块的名称为 app。这是因为默认情况下,Android Studio 以您在向导中提供的名称命名您的项目,而您的第一个模块始终命名为 app

您可以将包含的项目从 AppA 重命名为 project(通过右键单击项目 > 重构 > 重命名,然后重命名app 模块到 AppA

基本结构如下所示:

Studio Project AppA (rename to "project")
|
|\_app (module AppA, rename to "AppA")
| |_ src
|
|\_AppB (module AppB)
| |_ src
|
 \_LibC (module LibC, dependency for AppA and AppB)
  |_ src

此设置的优势在于它包含在一个 Android Studio 项目中,因此您可以免费获得应用模块和库之间的所有 Android Studio 重构魔法。

假设您更改了 LibC 中的一个方法,它将同时反映在 AppA 和 AppB 中。

2。不同的项目,库符号链接

基本上,这反映了您对于 AppA 和 AppB 有 两个不同 项目位置的想法 - 没有 2 个物理 LibC 位置。只需获取 LibC (AppA) 并将其符号链接到新位置 (AppB)。

不是一个漂亮的解决方案,但可能(我只能代表类 Unix 系统,但也应该适用于 Win。)

Studio Project AppA (location 1 on disk)
|
|\_app
| |_ src
|
 \_LibC (dependency for app)
  |_ src

… 

Studio Project AppB (location 2 on disk)
|
|\_app
| |_ src
|
 \_*LibC (symlinked from AppA project dir)
  |_ src

请注意,在这种情况下,项目间重构将失败,例如您打开项目 AppA,在 LibC 中进行重大更改,运行 AppA。稍后打开 AppB 会出现编译错误,因为 AppB 尚未适应使用 LibC 的新 API。

3。库作为外部依赖项

这可以被认为是迄今为止最“专业”的方式。 创建您的 App 项目,它们不必像选项 1 那样位于同一项目树中,并将它们与您的库 LibC(aar 或 jar)的构建工件链接。

理想情况下,这个工件是版本化的,并且位于(本地)maven 存储库中。 这样,您始终拥有一致的构建(因为您链接到库的特定版本,无论 LibC 当前处于何种开发状态)

Studio Project AppA (location 1 on disk)
|
 \_app
  |_ src
  |_ build.gradle dependency on libc (jar/aar + version XX)

… 

Studio Project AppB (location 2 on disk)
|
|
 \_app
  |_ src
  |_ build.gradle dependency on libc (jar/aar + version YY)


Studio Project LibC (location 3 on disk)
|
 \_LibC (library module from AppA project dir)
  |_ src (in development)

正如您所说,Android Studio 以某种方式强制您先创建应用模块,然后才能创建库模块。我希望这在未来的任何时候都会改变,但这没什么大不了的。之后只需创建您的库模块,然后摆脱应用程序模块。然后,您可以通过 gradle 构建您的库并导出工件(aar 或 jar)以用于您的项目。

在 LibC 的 build.gradle 中,您可能会发现类似这样的内容来将其部署到本地机器的 maven 存储库:

apply plugin: 'maven'
group = 'your.groupid.artefactid'
version = '0.2.0'

uploadArchives {
    repositories {
        mavenDeployer {
            repository url: 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath
        }
    }
}

参考http://www.alonsoruibal.com/my-gradle-tips-and-tricks/

如果您运行 gradle uploadArchives,它会创建您的工件并将其推送到您的本地 maven 存储库中。

[编辑]

还有另一个可能的解决方案,类似于选项 2。通过 gradle 从多个项目中引用库作为文件引用,请参阅

https://stackoverflow.com/a/21021293/1128600

此方法也有选项 2 的缺点(没有多个 API 版本控制,重构时没有应用间同步)

希望基于个人经验的总结能帮助你找到方向。

如果应用程序相关,我个人会选择选项 1,或者选项 3 (Maven)

【讨论】:

  • 经过其他一些尝试后,我最终得到了一个与您的选项 1 相对应的实现。对于小型项目来说还可以,但显然当库在“很多”应用程序之间共享时它无法扩展或不相关的应用程序(例如在我的情况下:现在我有四个应用程序 a、b、c、d 使用库,但只有两个相关的对 - a&b、c&d)。我不会使用“符号链接”解决方案。 Maven 没问题,但我不想在这个开发线中介绍它的复杂性。
  • 实际上使用 Maven(作为示例中所示的本地存储库)确实解决了您所说的所有问题 + 缩放,并且并不复杂(
  • 我从头开始创建了一个新项目。首先也是唯一的一件事,我对“app”模块进行了重构,将其重命名为“AppA”。现在我有这个错误:“检测到不支持的模块:以下模块不支持编译:AppA。你能检查一下吗?这发生在升级到 1.1.0 之后。
  • Maven 没问题,但我认为它增加了一层复杂性,这对于这种规模的堡垒项目来说是绝对不必要的(很少有应用程序有几个共享库)。
  • 我没有看到您添加的 StackOverflow 问题。但是,我尝试了其他报告不复制代码的解决方案,并且在我的情况下它们确实复制了。谢谢。
【解决方案2】:

我使用了一种更简单的方法。 假设您有两件事:

  1. 您的应用项目
  2. 您的模块。我们将其命名为 MyLib。 (您可以通过点击 app>Refactor>Rename module 将模块名称从 app 更改为 MyLib)。

现在来到您的应用程序项目,您需要在其中导入此模块。转到 Settings.gradle 它应该看起来像这样

包括 ':app'

现在

第 1 步:在此处添加模块的相对路径。例如,在我的情况下,我的项目和我的模块在同一个目录中

Projects
|
|\_MyApplication/app
|\_MyModule/MyLib 

现在您需要在 MyApplication 的 Settings.gradle 中添加 MyLib 模块。它应该是这样的

包括':Project','../MyModule:MyLib'

我们快到了。

点击“立即同步”。现在单击“MyApplication”,转到 OpenModuleSettings>Dependencies。单击+,然后单击“模块依赖性”。您将在那里的选项中看到“MyLib”。只需添加它。

完成。

P.S:Android Studio 现在将向您展示 Android Studio 中的 MyLib 项目。它没有被复制,它只是显示附件。您的代码库仅在一个地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多