从Eclipse迁移到Android-Studio(gradle)

时间:2014-01-02 19:21:35

标签: android gradle android-studio android-gradle

我正在尝试迁移我的应用程序以使用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作为依赖项包含在内,以便与项目一起编译???

3 个答案:

答案 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')      
}