Как рассчитать размер библиотек, которые добавляются в качестве зависимости в проект Android

Я работаю над проектом, в котором использую несколько библиотек, таких как сервис Google Play, модификация, gson, glide, twitter и facebook sdk. Итак, что я хочу знать, точный размер каждой библиотеки занимает мое приложение. Пожалуйста, помогите мне, есть ли какие-либо возможные способы анализа размера в студии Android. Любые предложения или советы по инструментам для моего требования были бы очень полезны для меня. Я публикую зависимости, которые я использую в своем build.gradle, следующим образом.

compile('com.twitter.sdk.android:twitter:1.9.0@aar') {
        transitive = true;
    }
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'org.twitter4j:twitter4j-core:4.0.2'
compile 'com.github.bumptech.glide:glide:3.6.1'
compile 'com.google.android.gms:play-services-gcm:8.4.0'
compile 'com.android.support:support-v4:23.2.0'

Примечание: я анализирую этот отчет, чтобы уменьшить размер apk моего приложения, удалив библиотеки, которые занимают много памяти.

Я полностью застрял с этим решением за последние пару дней. Я даже много искал и не смог найти оптимизированный подход для расчета точного размера использования библиотек в моем проекте.

Пожалуйста помоги. Заранее спасибо.


person Chandru    schedule 27.04.2016    source источник
comment
Что ж, как только они появятся в вашем приложении, все библиотеки будут объединены с вашим APK, и поэтому их трудно разделить. Вы можете посмотреть размер файлов JAR или AAR, а также файлы из транзитивных зависимостей, чтобы получить приблизительную оценку. Например, Glide выглядит примерно как 465 КБ, в то время как support-v4:23.2.1 составляет ~ 1,2 МБ (плюс еще ~ 19 КБ для его зависимости support-annotations).   -  person CommonsWare    schedule 27.04.2016
comment
Вы можете добавить зависимость по одной в полностью пустой проект Android, сгенерировать APK и рассчитать разницу для каждой.   -  person fractalwrench    schedule 27.04.2016
comment
@fractalwrench Все в порядке. Но опять же это будет утомительный процесс, вам придется собирать проект снова и снова.   -  person Chandru    schedule 28.04.2016


Ответы (3)


Не уверен, что это то, что вы ищете, но это может как-то помочь:

task depsize  {
    doLast {
        final formatStr = "%,10.2f"
        final conf = configurations.default
        final size = conf.collect { it.length() / (1024 * 1024) }.sum()
        final out = new StringBuffer()
        out << 'Total dependencies size:'.padRight(45)
        out << "${String.format(formatStr, size)} Mb\n\n"
        conf.sort { -it.length() }
            .each {
                out << "${it.name}".padRight(45)
                out << "${String.format(formatStr, (it.length() / 1024))} kb\n"
            }
        println(out)
    }
}

Задача выводит сумму всех зависимостей и выводит их размер в КБ, отсортированный по размеру desc.

Обновленная версия, совместимая с Gradle 5+

tasks.register("depsize") {
    def formatStr = "%,10.2f"
    def size = configurations.default.collect { it.length() / (1024 * 1024) }.sum()

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

    configurations
            .default
            .sort { -it.length() }
            .each {
                out << "${it.name}".padRight(45)
                out << "${String.format(formatStr, (it.length() / 1024))} kb\n"
            }
    println(out)
}

Обновление №2: последнюю версию кода задачи можно найти на github gist

person Slava Medvediev    schedule 27.06.2016
comment
Привет @medvedev. Спасибо за ответ. Я точно такой же искал. Я вставил этот фрагмент кода в build.gradle(app), но он ничего не печатает в журнале. Также попытался скопировать их в build.gradle (проект). - person Chandru; 09.07.2016
comment
Это странно. Я скопировал этот фрагмент кода из моего build.gradle. Чтобы получить вывод, я выполняю gradle depsize - person Slava Medvediev; 09.07.2016
comment
Тем не менее, это сработало для моей сборки без Android. С андроидом не пробовал. Простите за это. - person Slava Medvediev; 09.07.2016
comment
@МедведевВ. - Я тоже пробовал это, но только получил 0 Мб. Как и пользователь выше, он находится в build.gradle приложения в конце ... есть идеи? :app:depsize Total dependencies size: 0 Mb - person jpage4500; 21.02.2017
comment
Я думаю, вам нужно изменить значение по умолчанию в коде на что-то другое. fx в _debugApk, как указано в ответе выше. Не могу сказать точно, так как я не андроид, а просто поклонник Gradle. - person Slava Medvediev; 21.02.2017

Самый простой способ — использовать веб-сайт с названием http://www.methodscount.com/, где вы просто вставляете скомпилируйте оператор, и вы получите все подробности о его размере.

Например, если я вставлю в него com.github.paolorotolo:appintro:4.1.0, я получу следующий результат:

введите здесь описание изображения

Это не работает для нескольких библиотек, но в большинстве случаев выполняет свою работу.

person Aavgeen singh    schedule 08.06.2017

task (depsize) << {
def size = 0;
configurations._debugApk.collect { it.length() / (1024 * 1024) }.each { size += it }
println "Total dependencies size: ${Math.round(size * 100) / 100} Mb"

configurations
        ._debugApk
        .sort { -it.length() }
        .each { println "${it.name} : ${Math.round(it.length() / (1024) * 100) / 100} kb" }
}

Попробуйте поместить это в свой модуль приложения gradle.build, и тогда вы сможете запустить его напрямую через gradle. Если вы хотите увидеть все возможные конфигурации, добавьте:

configurations
        .findAll()
        .each { println "${it.name}" }
person David    schedule 22.08.2016
comment
Спасибо за ответ. Не могли бы вы сообщить мне, куда добавить это. Как только это будет сделано, я приму ответ, так что это будет очень полезно для других, которые ищут это требование. - person Chandru; 23.08.2016
comment
Я обновил свой ответ... вы можете поместить его в конец вашего модуля приложения gradle.build - person David; 23.08.2016