Skip to content

Instantly share code, notes, and snippets.

@medvedev
Last active October 23, 2023 16:56
Show Gist options
  • Star 39 You must be signed in to star a gist
  • Fork 11 You must be signed in to fork a gist
  • Save medvedev/968119d7786966d9ed4442ae17aca279 to your computer and use it in GitHub Desktop.
Save medvedev/968119d7786966d9ed4442ae17aca279 to your computer and use it in GitHub Desktop.
Gradle task that prints total dependencies size and (dependency+(size in kb)) list sorted by size desc
...
/* Tested with Gradle 6.3 */
tasks.register("depsize") {
description = 'Prints dependencies for "default" configuration'
doLast() {
listConfigurationDependencies(configurations.default)
}
}
tasks.register("depsize-all-configurations") {
description = 'Prints dependencies for all available configurations'
doLast() {
configurations
.findAll { it.isCanBeResolved() }
.each { listConfigurationDependencies(it) }
}
}
def listConfigurationDependencies(Configuration configuration) {
def formatStr = "%,10.2f"
def size = configuration.collect { it.length() / (1024 * 1024) }.sum()
def out = new StringBuffer()
out << "\nConfiguration name: \"${configuration.name}\"\n"
if (size) {
out << 'Total dependencies size:'.padRight(65)
out << "${String.format(formatStr, size)} Mb\n\n"
configuration.sort { -it.length() }
.each {
out << "${it.name}".padRight(65)
out << "${String.format(formatStr, (it.length() / 1024))} kb\n"
}
} else {
out << 'No dependencies found';
}
println(out)
}
...
@medvedev
Copy link
Author

Thanks for you feedback, @smrahmadi
I've updated gist. Now it runs with no errors in Gradle 5.4.1.
Most likely, is also compatible with Gradle 6.0.

@iman2420
Copy link

How to run it?
where to show log ?

@medvedev
Copy link
Author

How to run it?

gradle depsize

where to show log ?

Gradle's output

@iman2420
Copy link

Total dependencies size: nu Mb

Why?

@medvedev
Copy link
Author

Total dependencies size: nu Mb

Why?

I've updated gist. Try task depsize-all-configurations
Probably, this will bring you an answer.

@russell-shizhen
Copy link

russell-shizhen commented Aug 21, 2019

One point to mention, the script above should be put into project.afterEvaluate { }. Or more generically, inside the top level build.gradle add below

subprojects { prj ->

    prj.afterEvaluate {
         tasks.create("depsize") {
            listConfigurationDependencies(configurations.default)
         }

         tasks.create("depsize-all-configurations") {
            configurations.each {
                if (it.isCanBeResolved()) {
                    listConfigurationDependencies(it)
                }
            }
        }
    }
}

@maslick
Copy link

maslick commented Sep 2, 2019

cool stuff! thanks :)

@iman2420
Copy link

Could not get unknown property 'default' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.

and i change it to : listConfigurationDependencies(configurations.getByName("default"))
after change:
TaskCreationException: Could not create task ':depsize'.

@medvedev
Copy link
Author

@iman2420
What's your Gradle version?

@iman2420
Copy link

@medvedev
3.6.0-beta04

@ddlatham
Copy link

Just what I was looking for - thanks!

@medvedev
Copy link
Author

@smrahmadi probably to your build.gradle
@RKSharma89 I think this is out of scope of current gist's discussion and is more about general gradle usage

@MrzAhmadi
Copy link

Where segment of build.gradle should we put this code in ?!

buildscript {
    ext.kotlin_version = '1.3.70'
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0'
    }
}

allprojects {
    repositories {
        jcenter()
        google()
    }
}

tasks.create("depsize") {
    listConfigurationDependencies(configurations.default)
}


tasks.create("depsize-all-configurations") {
    configurations.each {
        if (it.isCanBeResolved()) {
            listConfigurationDependencies(it)
        }
    }
}

def listConfigurationDependencies(Configuration configuration) {
    def formatStr = "%,10.2f"

    def size = configuration.collect { it.length() / (1024 * 1024) }.sum()

    def out = new StringBuffer()
    out << "\nConfiguration name: \"${configuration.name}\"\n"
    if (size) {
        out << 'Total dependencies size:'.padRight(65)
        out << "${String.format(formatStr, size)} Mb\n\n"

        configuration.sort { -it.length() }
                .each {
                    out << "${it.name}".padRight(65)
                    out << "${String.format(formatStr, (it.length() / 1024))} kb\n"
                }
    } else {
        out << 'No dependencies found';
    }
    println(out)
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Get this error :

Build file '/Users/MYUSER/AndroidStudioProjects/jetpack-playground/build.gradle' line: 23
A problem occurred evaluating root project 'jetpack-playground'.
Could not create task ':depsize'.
Could not get unknown property 'default' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.

@medvedev
Copy link
Author

@smrahmadi what's your gradle version?

@MrzAhmadi
Copy link

@smrahmadi what's your gradle version?
@medvedev
distributionUrl=https://services.gradle.org/distributions/gradle-6.2.2-all.zip

@medvedev
Copy link
Author

Hm.. maybe they again changed something in API in 6.2.2 :(
I don't have bandwidth to check this during next week and update the gist.
So if you'll find out a solution, please, don't hesitate to share it.

@medvedev
Copy link
Author

@smrahmadi I've just tested tasks with Gradle 6.3. Worked with no issues.

@RohitSurwase
Copy link

RohitSurwase commented Apr 30, 2020

Gradle version : gradle-5.6.4-all.zip
Plugin : classpath 'com.android.tools.build:gradle:3.6.3'

Error with configurations.getByName("default")
Execution failed for task ':depsize'.

Configuration with name 'default' not found.

Error with configurations.default
Execution failed for task ':depsize'.

Could not get unknown property 'default' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.

@medvedev
Copy link
Author

@RohitSurwase
Maybe, if you don't have default configuraiton in your project, you should use different configuration name.
I'm not an Android developer, so can't help you with debugging this issue.
However, googling question like gradle default configuration not found brings up dozens of links.

@RohitSurwase
Copy link

@medvedev Yes, I did try with other available configuration names and and it get executed successfully just like 'depsize-all-configurations'.
But problem is nothing gets printed as a result.

@UltramanTIGA
Copy link

Hi,bro. My gradle version is 6.1.1, and I edit project root build.gradle as below:
`buildscript {
ext{
minSdkVersion = 23
targetSdkVersion = 29

    kotlinVersion = "1.3.72"
}
repositories {
    google()
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:4.0.1'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

}

allprojects {
repositories {
google()
jcenter()
maven { url 'https://www.jitpack.io' }
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

subprojects { prj ->

prj.afterEvaluate {
    tasks.register("depsize") {
        description = 'Prints dependencies for "default" configuration'
        doLast() {
            listConfigurationDependencies(configurations.default)
        }
    }

    tasks.register("depsize-all-configurations") {
        description = 'Prints dependencies for all available configurations'
        doLast() {
            configurations
                    .findAll { it.isCanBeResolved() }
                    .each { listConfigurationDependencies(it) }
        }
    }
}

}

def listConfigurationDependencies(Configuration configuration) {
def formatStr = "%,10.2f"

def size = configuration.collect { it.length() / (1024 * 1024) }.sum()

def out = new StringBuffer()
out << "\nConfiguration name: \"${configuration.name}\"\n"
if (size) {
    out << 'Total dependencies size:'.padRight(65)
    out << "${String.format(formatStr, size)} Mb\n\n"

    configuration.sort { -it.length() }
            .each {
                out << "${it.name}".padRight(65)
                out << "${String.format(formatStr, (it.length() / 1024))} kb\n"
            }
} else {
    out << 'No dependencies found';
}
println(out)

}`
I run "gradle depsize" and get result: No dependencies found

What wrong with my use? Please help me...

@medvedev
Copy link
Author

@UltramanTIGA did you try running gradle depsize-all-configurations? What's the output?

@UltramanTIGA
Copy link

@medvedev Oh, awesome! It output the list with many configuration name, some of them show "No dependencies found", and some show the dependencies list.
So you mean I should change the configuration name as what I want?

@medvedev
Copy link
Author

@UltramanTIGA
Yep, you may for example change "depsize" task to use a configuration other than "default".

@UltramanTIGA
Copy link

@medvedev Ok.Thanks a lot!

@phi1ipp
Copy link

phi1ipp commented Nov 10, 2020

In case somebody needs the same in .kts

tasks.register("depsize") {
	description = "Prints dependencies for \"default\" configuration"
	doLast {
		listConfigurationDependencies(configurations["default"])
	}
}

tasks.register("depsize-all-configurations") {
	description = "Prints dependencies for all available configurations"
	doLast {
		configurations
				.filter { it.isCanBeResolved }
				.forEach { listConfigurationDependencies(it) }
	}
}

fun listConfigurationDependencies(configuration: Configuration ) {
	val formatStr = "%,10.2f"

	val size = configuration.map { it.length() / (1024.0 * 1024.0) }.sum()

	val out = StringBuffer()
	out.append("\nConfiguration name: \"${configuration.name}\"\n")
	if (size > 0) {
		out.append("Total dependencies size:".padEnd(65))
		out.append("${String.format(formatStr, size)} Mb\n\n")

		configuration.sortedBy { -it.length() }
				.forEach {
					out.append(it.name.padEnd(65))
					out.append("${String.format(formatStr, (it.length() / 1024.0))} kb\n")
				}
	} else {
		out.append("No dependencies found")
	}
	println(out)
}

@dzikoysk
Copy link

dzikoysk commented Jun 7, 2021

@phi1ipp thanks :)

@ansyori28
Copy link

Hi, I'm getting this error > Could not get unknown property 'default' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer. when I run ./gradlew depsize.
I'm using gradle 7.2.2 by the way, any help will be much appreciated.
Thanks.

@og-abdul-mateen
Copy link

og-abdul-mateen commented Sep 21, 2022

For anyone who is having issues with the configurations.default, you can do the following.

  1. Print all your configurations to see what you've got.
  2. Replace default with a configuration that you would like to analyze. For example, you can use debugImplementationDependenciesMetadata instead of default.
  3. Run ./gradlew depsize

cc: @ansyori28

@Arkhypov
Copy link

configurations["default"].isCanBeResolved = true

on the top of build.gradle.kts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment