Как я могу уменьшить размер активов xml при создании моего apk - PullRequest
1 голос
/ 04 октября 2019

В моем приложении я использую каталог assets для хранения некоторых файлов XML (некоторые большие). Во время разработки я хочу, чтобы файлы использовали отступы, а также оставил в нем некоторые комментарии. Это увеличивает мои xml-файлы и может увеличить их размер.

Возможно ли добавить задачу в сборку gradle, чтобы удалить все отступы и комментарии для xml-файлов перед упаковкой в ​​apk? Если да, то как?

Это не только сократит мой apk, но и поможет во время выполнения с обработкой XML.

РЕДАКТИРОВАТЬ

ответ fhomovc был правильным, но в нем отсутствовала какая-то часть. Я отмечу это как правильное, но если кому-то еще это понадобится, вот подробности:

В общем, мне нужна задача, которая запустит утилиту minify, и она должна выглядеть следующим образом:

task minifyAssets(type:Exec) {
    workingDir dirName // the directory of the merged assets under the build directory
    commandLine 'minify', '-r', '-o', '.', '.'
    doFirst {
        println 'minifyAssets...'
    }
}

Эта задача должна выполняться только после выполнения задачи слитых активов и до выполнения задачи пакета.

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

Сначала создайте задачу exec и сделайте ее зависимой от задачи объединения

    applicationVariants.all { variant ->
        // dynamically add minify task for specific variant
        def dirName = new File("app\\build\\intermediates\\merged_assets\\"  + variant.name + "\\out\\levels").getAbsolutePath()
        def minifyTaskName = "minifyAssets" + variant.name
        def mergeAssetsTaskName = "merge" + variant.name + "Assets"
        def myTask = tasks.register(minifyTaskName, Exec) {
            workingDir dirName
            // require that minify utility will be in the path. Download from https://github.com/tdewolff/minify/tree/master/cmd/minify
            commandLine 'minify', '-r', '-o', '.', '.'
            doFirst {
                println 'minifyAssets...' + workingDir
            }
        }
        // set the minify task dependant on the merge assets task
        myTask.get().dependsOn mergeAssetsTaskName
    }

Теперь нам нужно, чтобы конкретная задача пакета зависела от задачи minify:

// when the package task is added make it dependant on the minify task
tasks.whenTaskAdded { theTask ->
    if (theTask.name.startsWith("package") && (theTask.name.endsWith("Debug") || theTask.name.endsWith("Release"))) {
        def minifyTaskName = theTask.name.replace("package", "minifyAssets")
        theTask.dependsOn minifyTaskName
    }
}

1 Ответ

0 голосов
/ 04 октября 2019

Вы можете запустить пользовательский скрипт с помощью xml minifier.

  • Для минификатора: вы можете установить minify , следуя предоставленным шагам установки.
  • Для скрипта: вы можете обратиться к thisответ . По сути, ваша задача будет выглядеть примерно так:

    task executeScript(type:Exec) {
        println 'Minifying xmls...'
        //on linux
        commandLine 'minify -r -o ./ --match=\.xml ./values' // ./values should be the path to your resources directory
    }
    

Просмотрите документацию, чтобы лучше понять, как работает minify. Я сам не тестировал это решение, поэтому может потребоваться несколько настроек, но вы получите общее представление. Если вы используете компьютер с Windows, тогда сценарий (commandLine) должен быть другим, если я смогу найти какие-либо примеры в Интернете, я добавлю их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...