2

The app that we are working on is not very large - most of it is an empty application that gets filled in from various endpoints (server side), but we currently have 18 separate flavors of the app that get built.

The issue is, there will be 78 flavors of the application built and if the build time is linear, we are looking at about 11 hours per ./gradlew build request.

Im not well versed in Gradle at all and I was hoping you guys could help me find some problem areas that might be able to improve our build times

Here is the build.gradle:

apply plugin: 'com.android.application'

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

apply plugin: 'io.fabric'
apply from: '../jacoco.gradle'
apply from: '../flavors.gradle'
apply from: '../autoTasks.gradle'

ext {
    applicationName = 'OurApp'
    supportLibVersion = '25.3.0'
    playServicesVersion = '9.6.1'
}

android {
signingConfigs {
    debug {
        keyAlias 'key'
        keyPassword 'pass'
        storeFile file('../file.keystore')
        storePassword 'pass'
    }
    release {
        keyAlias 'key'
        keyPassword 'pass'
        storeFile file('../file.jks')
        storePassword 'pass'
    }
}

compileSdkVersion 25
buildToolsVersion "25.0.2"

defaultConfig {
    minSdkVersion 16
    targetSdkVersion 25
    vectorDrawables.useSupportLibrary true
    testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
    multiDexEnabled true
}

dataBinding {
    enabled true
}

lintOptions {
    abortOnError false
}

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release

        buildConfigField 'String', 'DFP_NETWORK_ID', '"id"'
        buildConfigField 'String', 'YOUTUBE_API_KEY', '"ourkey"'
    }
    debug {
        signingConfig signingConfigs.debug
        testCoverageEnabled = true

        buildConfigField 'String', 'DFP_NETWORK_ID', '"id"'
        buildConfigField 'String', 'YOUTUBE_API_KEY', '"anotherKey"'
    }
    debuggable.initWith(buildTypes.debug)
    debuggable {
        testCoverageEnabled = false
    }
}

dexOptions {
    javaMaxHeapSize "4g"
}

applicationVariants.all { variant ->
    if (variant.buildType.name == 'release') {
        createZipProguardTask(variant);
    }

    updateApkName(variant);
    }
}

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])

annotationProcessor 'com.bluelinelabs:logansquare-compiler:1.3.7'
annotationProcessor 'com.squareup:javapoet:1.8.0'
annotationProcessor 'com.google.dagger:dagger-compiler:2.7'

compile "com.android.support:appcompat-v7:${supportLibVersion}"
compile "com.android.support:design:${supportLibVersion}"
compile "com.android.support:recyclerview-v7:${supportLibVersion}"
compile "com.android.support:support-v13:${supportLibVersion}"
compile "com.android.support:percent:${supportLibVersion}"
compile "com.android.support:preference-v14:${supportLibVersion}"
compile "com.google.android.gms:play-services-gcm:${playServicesVersion}"
compile "com.google.android.gms:play-services-maps:${playServicesVersion}"
compile "com.google.firebase:firebase-core:${playServicesVersion}"
compile "com.google.firebase:firebase-messaging:${playServicesVersion}"

compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.roughike:bottom-bar:2.2.0'

compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.l4digital.rxloader:rxloader:2.0.1'

compile 'com.bluelinelabs:logansquare:1.3.7'
compile 'com.github.aurae.retrofit2:converter-logansquare:1.4.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

compile 'com.google.dagger:dagger:2.7'

compile 'com.facebook.stetho:stetho:1.4.2'
compile 'com.facebook.stetho:stetho-okhttp3:1.4.2'

compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
    transitive = true
}
compile(name:'googlemediaframework-release', ext:'aar')
compile "com.google.android.gms:play-services-ads:${playServicesVersion}"
compile "com.google.android.gms:play-services-analytics:${playServicesVersion}"
compile 'com.flurry.android:ads:6.2.0'
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0'
compile 'com.google.android.exoplayer:exoplayer:r1.5.14'

compile 'com.android.support:multidex:1.0.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'

debugCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
debuggableCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'

androidTestCompile 'junit:junit:4.12'
androidTestCompile 'com.squareup.okhttp3:okhttp:3.5.0'
androidTestCompile 'org.mockito:mockito-core:1.10.19'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
androidTestCompile('com.android.support.test:rules:0.5') {
    exclude module: 'support-annotations'
}
androidTestCompile (name:'cloudtestingscreenshotter_lib', ext:'aar')

androidTestCompile('com.android.support.test:runner:0.5') {
    exclude module: 'support-annotations'
}
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2') {
    exclude module: 'support-annotations'
}

compile(name:'MapSDK', ext:'aar')
compile('com.twitter.sdk.android:twitter:2.3.2@aar') {
    transitive = true;
}
}

def createZipProguardTask(variant) {
    def prefix = project.ext.applicationName;

    if (project.hasProperty('buildNumber')) {
        prefix += '-' + project.getProperties().get('buildNumber');
    }

    def taskName = variant.flavorName.substring(0, 1).toUpperCase() + variant.flavorName.substring(1);

    task("zipProguard${taskName}", type: Zip) {
        archiveName = "${prefix}-${variant.flavorName}-proguard.zip";

        from "build/outputs/mapping/${variant.flavorName}/release"
        destinationDir file('build/outputs/mapping')
    }
}

def updateApkName(variant) {
    def prefix = project.ext.applicationName;

    if (project.hasProperty('buildNumber')) {
        prefix += '-' + project.getProperties().get('buildNumber');
    }

    variant.outputs.each { output ->
        def fileName = output.outputFile.name.replace('app', prefix);
        def outputFile = new File(output.outputFile.parent.toString(), fileName.toString());

        output.outputFile = outputFile;
    }
}

Here is what we have in the gradle properties:

org.gradle.jvmargs=-Xmx4608M -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.daemon=true

Any input would be greatly appreciated - like I said, I'm not well versed in gradle at all, so I'm open to anything.

Thank you in advance

Nefariis
  • 3,451
  • 10
  • 34
  • 52

1 Answers1

0

I'm sure you figured something out by now, but just for future googlers -

Android Studio gradle takes too long to build improved the speed of my gradle build drastically.

It suggests enabling Offline work in Android Studio by going to file>settings>build, execution, deployment>gradle and checking the "Offline work" option.