我需要实现使用相同Android库AppA
的两个应用AppB
和LibC
。
使用Android Studio,我希望有三个项目:LibC
,AppA
和AppB
,其中AppA
和AppB
引用{{1 }}。我找不到办法来获得这个。
到目前为止,我已实施LibC
。在编写AppA
时,我通过
AppA
File > New Module > Android Library > `LibC`
库现在位于LibC
项目中,我需要在AppA
项目中开始使用它。
如何将AppB
移出项目LibC
并仅为AppA
创建项目?
我应该如何创建仅包含Android库的新项目?
如果我开始一个新的Android项目,它会不断创建一个新的应用程序。
1)我需要创建一个新的Application,然后在该应用程序中创建一个新模块(这是我在编写
LibC
时所做的);2)我可以将现有的库代码导入到一个新项目中。
但是我不想将库的代码复制到新项目中(这就是发生的事情),我想使用相同的文件以便为库保留一个代码库。
这可能吗?如果是,我在哪里可以找到一些关于它的文档?
答案 0 :(得分:3)
由于我最近在自己的项目中有这个要求,我可能会给你一些建议。
基本上你可以选择:
如果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中。
基本上,这反映了您为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。
这可以被视为迄今为止最“专业”的方式。 创建您的应用程序项目,它们不必像选项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)
我使用了一种更简单的方法。 让我们说你有两件事:
现在来到应用程序项目,您需要导入此模块。转到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。它没有被复制,它只是显示附加的文件。您的代码库仅在一个地方。