我正在尝试迁移我的应用程序以使用gradle,但我遇到了一些问题,包括库项目。
我的项目树是这样的:
My projects root
- MyLib1
-- res
-- src
-- libs
- MyLib2
-- res
-- src
-- libs
- MyLib3
-- res
-- src
-- libs
- MyAppBase
-- res
-- src
-- libs
- MyApp - full version
-- res
-- src
-- libs
- MyAppFree - free version
-- res
-- src
-- libs
使用Eclipse,我有以下依赖项
MyAppBase depends on:
-MyLib1
-MyLib2
-MyLib3
MyApp depends on:
-MyAppBase
-MyLib1
-MyLib2
-MyLib3
MyAppFree depends on:
-MyAppBase
-MyLib1
-MyLib2
-MyLib3
这个组织在Eclipse中运行良好,但现在使用Android-Studio和gradle我遇到了问题。
我有以下build.gradle文件:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.7.+'
}
}
apply plugin: 'android'
dependencies {
//compile project('../MyLib1') <- error
compile fileTree(dir: 'libs', include: '*.jar')
}
android {
compileSdkVersion 18
buildToolsVersion "19.0.1"
defaultConfig {
minSdkVersion 4
targetSdkVersion 14
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
}
如何将项目MyLib1,MyLib2,MyLib3作为依赖项包含在内,以便与项目一起编译???
答案 0 :(得分:1)
目前,所有依赖项都需要存在于项目的根目录下,因此您需要将项目设置为以 MyLib1 , MyLib2 上的目录为根目录>, MyApp 等。此限制将在未来取消;您可以在https://code.google.com/p/android/issues/detail?id=56367跟踪其进度。您的库将是该根目录下的库模块,您的应用程序将是Android应用程序模块。每个模块都有自己独立的build.gradle
文件,可以编译为JAR(普通Java库),AAR(Android库,包括代码+资源)或APK(Android应用程序)。
我不确定 MyAppFree 和 MyApp 是否是单独的Eclipse项目;如果它们是,在Android Studio和Gradle下,我鼓励你将它们组合成一个具有免费和付费风格的模块。构建风格是明确设计的,以帮助这种用例。有关详细信息,请参阅http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors。
更新
在下面的评论中,您看起来有很多库。您可能不希望始终从源构建它们,或者管理具有数十个模块的项目。在这种情况下,将不经常更改的模块保留为单独的项目更有意义。这些项目可以编译到JAR或AAR,这将我们带回到您在Android Studio中如何工作的原始问题。
您可以将JAR文件复制到项目根目录下的libs
目录中并将其链接进去。我相信在尝试对AAR库执行相同操作时会出现问题。请参阅https://code.google.com/p/android/issues/detail?id=63908以跟踪其进度。如果您不想维护库的多个副本,您可以尝试对目录进行符号链接(I 认为将起作用),或者您可以设置本地Maven存储库并进行副项目将它们的工件发布到那个。在我的指尖,我没有详细说明的链接;你可以从http://www.gradle.org/docs/current/userguide/publishing_maven.html开始。
设置本地Maven仓库会有一个公平的学习曲线,但一旦完成,您可能会发现它可以非常干净地解决您的问题,如果您在一个拥有多个开发人员的商店,那么就像一个组织范围的Maven仓库,也许是从构建服务器发布到它的工件,你可以设置它。
答案 1 :(得分:0)
也许转到“项目结构”菜单(Ctrl + Shift + Alt + S)并将所需的依赖项添加到正确的模块中。
答案 2 :(得分:0)
在Android Studio中,您的项目结构应该如下所示
YourProjectName
-libraries
--myLib1
--myLib2
--myLib3
-MyAppBase
--build.gradle( It will have dependency of all three libraries like mentioned in last)
--src
--res
-MyApp
--src
---main
----java
----res
----Manifest
---full
----java
----res
----Manifest
---free
----java
----res
----Manifest
--build.gradle ( It will have dependency of only MyAppBase because your MyAppBase is already having dependency of all of your three libraries so no need to include them again)
现在,您可以在最后提到的build.gradle文件(如
)中获得构建版本 buildTypes {
debug {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
release{
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.prodSigning // write your signingConfig
}
}
productFlavors{
full {
//required configuration for full version
}
free {
//required configuration for full version
}
}
注意您的目录名称和build.gradle文件中的产品falvours名称必须相同,因此在编译时(从左侧面板或命令提示符中的Built Variant选项卡),它将自动获取代码/ res来自各个文件夹的/ manifest。
以上配置将提供以下四种类型的构建变体
debugFull,debugFree,releaseFull,releaseFree
您可以在MyAppBase的build.gradle中添加依赖项,如
dependencies {
compile project(':libraries:myLib1')
compile project(':libraries:myLib2')
compile project(':libraries:myLib3')
}
在MyApp模块的build.gradle文件中,像这样
dependencies {
compile project(':MyAppBase')
}