Android Studio:使用Android模块而无需复制代码

时间:2015-02-15 16:34:05

标签: android android-studio intellij-idea

我需要实现使用相同Android库AppA的两个应用AppBLibC

使用Android Studio,我希望有三个项目:LibCAppAAppB,其中AppAAppB引用{{1 }}。我找不到办法来获得这个。

到目前为止,我已实施LibC。在编写AppA时,我通过

创建了一个模块
AppA

File > New Module > Android Library > `LibC` 库现在位于LibC项目中,我需要在AppA项目中开始使用它。

问题1:

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

问题2:

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

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

The doc here说:

  

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

     

2)我可以将现有的库代码导入到一个新项目中。

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

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

2 个答案:

答案 0 :(得分:3)

由于我最近在自己的项目中有这个要求,我可能会给你一些建议。

基本上你可以选择:

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

如果AppA和AppB以某种方式相关(这是您必须决定的),您可以轻松实现。您的项目中已经有AppA和LibC,因此您只需要在Studio for AppB中创建另一个App模块(文件>新模块>应用程序模块)

有趣的是,您的项目目录最初名称为 AppA ,而您的AppA模块名为 app 。这是因为Android Studio默认使用向导中提供的名称命名项目,而第一个模块的名称始终为 app

您可以将包含的项目从 AppA 重命名为项目(通过右键单击项目>重构>重命名,并将应用模块重命名为 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。库作为外部依赖性人工制品

这可以被视为迄今为止最“专业”的方式。 创建您的应用程序项目,它们不必像选项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 :(得分:0)

我使用了一种更简单的方法。 让我们说你有两件事:

  1. 您的应用项目
  2. 您的模块。我们将其命名为MyLib。 (您可以通过点击应用>重构>重命名模块)将您的模块名称从应用更改为MyLib。
  3. 现在来到应用程序项目,您需要导入此模块。转到Settings.gradle它应该看起来像这样

      

    包括':app'

    现在

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

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

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

      

    包括':项目',' .. / MyModule:MyLib'

    我们快到了。

    点击"立即同步"。现在点击" MyApplication"转到OpenModuleSettings>依赖项。单击+然后单击“模块依赖关系”'。你会看到" MyLib"选择那里。只需添加它。

    完成。

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