Android Studio Gradle 第一步

Posted

技术标签:

【中文标题】Android Studio Gradle 第一步【英文标题】:Android Studio Gradle First Steps 【发布时间】:2013-06-14 19:56:07 【问题描述】:

有些人可能已经看过 android Studio Gradle i/o,Xavier Ducrohet 在他的快速演讲中提到了如何使用 android gradle 构建系统。我的问题是,文档和演示文稿缺乏快速入门的信息。或者至少对我来说。在我的以下代码中,我尝试解决 gradle android 插件系统的使用问题,我确定我的一些步骤是错误的,一些是正确的。 (我没有经常使用 ant 或 maven)

也许我会按照我目前所做的逐步完成它。

android 
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig 
        minSdkVersion 7
        targetSdkVersion 16

        signingStoreLocation = "debug.keystore"
        signingStorePassword = "***************"
        signingKeyAlias = "***************"
        signingKeyPassword = "**************"
    

首先我为调试构建配置默认设置(或每个使用默认设置的构建......这意味着没有构建类型或风格?)

源集:

    sourceSets 

        main 
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['com.project.maingradle', 'com.otherproject.changedsourcefilesforthisproject']
            res.srcDirs = ['res', 'resfromotherprojectusingpartsofsamecode']
            assets.srcDirs = ['assets']
        
    

在这一步中,我已经定义了 sourceSets。这是我第一个问题的地方。如果我想在两个项目中使用相同的代码,是否有可能/或者是否应该定义更多的源集,例如 -->

    sourceSets 

        main ...
        srcsetforanotherproject ...
    

...取决于底层的 src 文件夹?还是应该像在我的第一个 sourceSets 声明中那样定义 sourceSets,通过定义一组不同的,例如 res 文件夹,就像提到的 Xavier Ducrohet? (也不清楚我是否只能以这种方式对 res 文件夹执行此操作,或者也对 java.srcDirs = ['com.project.maingradle', 'com.otherproject.changedsourcefilesforthisproject'] 等 java src 代码文件夹执行此操作。

签名配置:

    signingConfigs 
        debugRelease 
            storeFile file("debug.keystore")
        

        release 
            storeFile file("release.keystore")
        

        testflight 
            storeFile file("testflight.keystore")
        
    

在这一步中,我定义了用于不同版本的不同键。应该没问题...

构建类型:

    buildTypes 

        debugRelease.initWith(buildTypes.release)
        testflight.initWith(buildTypes.release)

        sourceSets.debugRelease.setRoot("src/release")
        sourceSets.debugRelease.setRoot("src/release")
        sourceSets.debugRelease.setRoot("src/release")

        debugRelease 
            packageNameSuffix ".debugRelease"
            versionNameSuffix "-DEBUG"
            debuggable true
            signingConfig signingConfigs.debug
        

        testflight 
            packageNameSuffix ".testflight"
            versionNameSuffix "-TESTFLIGHT"
            signingConfig signingConfigs.testflight
        

        release 
            packageNameSuffix ".release"
            versionNameSuffix "-RELEASE"
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android.txt')
            signingConfig signingConfigs.release
        
    

这一步比 gradle android 插件的任何其他步骤解释得更清楚。除了我不知道是否有预定义的发布或调试设置在后台工作......我是否需要澄清它......至少我认为是这样,因为使用了名称后缀、proguard 或声明此构建的关键 (signingConfig)。

口味:

    flavorGroups "abi", "version"

    productFlavors 

        arm 
            flavorGroup "abi"
        

        standardproject1 
            flavorGroup "version"
            minSdkVersion 7
            targetSdkVersion 14
            packageName "com.project.maingradle.normal"
            sourceSet sourceSets.main
        

        standardproject2 
            flavorGroup "version"
            minSdkVersion 6
            targetSdkVersion 14
            packageName "com.otherproject.normal"
            sourceSet sourceSets.main
        

        testflightproject1 
            flavorGroup "version"
            minSdkVersion 7
            targetSdkVersion 14
            packageName "com.project.maingradle.testflight"
            sourceSet sourceSets.main
        

        testflightproject2 
            flavorGroup "version"
            minSdkVersion 6
            targetSdkVersion 14
            packageName "com.otherproject.testflight"
            sourceSet sourceSets.main
        
    

我个人认为口味是最有趣的部分。 Xavier Ducrohet 说,如果您想为不同的风味构建使用不同的键,您不应该在构建类型中定义键(而不是在风味中声明)?我不知道我是否理解正确。

无论如何...我在这里尝试做的是定义不同的风格,应该使用不同的设置来构建,比如不同系统的 sdk 版本控制、专有包名和设置一个依赖源集,就像你在示例中看到的那样。我不确定的是,构建类型如何依赖于风味......他们只是将每种风味与每种构建类型相乘吗?并且...是否可以设置一个 sourceSet(如果可以设置更多的 sourceSet),就像这样的味道?

【问题讨论】:

我尝试过类似的方法。您运行哪个命令来签署您的发布 apk,gradle build?我在build/apk 文件夹中只看到一个未签名的 apk 文件。 好问题,gradle 文档太糟糕了 是故意重复 sourceSets.debugRelease.setRoot("src/release") 三次吗? 【参考方案1】:

构建类型如何依赖于风味...他们只是将每种风味与每种构建类型相乘吗?

是的,Gradle 将生成构建类型和产品风格的每种组合。根据Gradle Plugin User Guide,每个构建类型和产品风味组合称为构建变体

可以设置一个sourceSet(如果可以设置更多的sourceSet),像这样的味道吗?

当然!根据Sourcesets and Dependencies documentation,产品风味(和构建变体)还自动包含来自src/myFlavorName 的自己的源集。

【讨论】:

以上是关于Android Studio Gradle 第一步的主要内容,如果未能解决你的问题,请参考以下文章

android studio gradle 两种更新方法更新

Android Studio Gradle优化方法

Android studio启动后卡在refreshing gradle project(包解决)

Android studio启动后卡在refreshing gradle project

Android studio启动后卡在refreshing gradle project

Android Studio 解决重复依赖