安卓工作室Gradle的第一步

6

有些人可能已经观看了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 {

        main {...}
        srcsetforanotherproject {...}
    }

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

签名配置:

    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插件的任何其他步骤都更清晰地解释了。除非有预定义的发布或调试设置在后台工作,否则我不知道...我是否需要澄清它...至少我认为需要,因为使用了namesuffixes、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文件。 - Jan-Terje Sørensen
优秀的问题,Gradle文档真是太糟糕了。 - Piotr
重复三次使用 sourceSets.debugRelease.setRoot("src/release") 是有意为之的吗? - Alex Bravo
1个回答

1

构建类型如何依赖于Flavors......它们只是将每个Flavor与每个BuildType相乘吗?

是的,Gradle会生成每种构建类型和产品Flavor的组合。根据Gradle插件用户指南,每种构建类型和产品Flavor的组合被称为构建变体

在Flavor中设置sourceSet是否可行(如果可以设置更多的sourceSets)?

当然!根据Sourcesets and Dependencies documentation,产品Flavors(和构建变体)也会自动包含其自己的来自src/myFlavorName 的sourceSet。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接