Исключить активы для типа выпуска

Я импортирую библиотеку android в приложении, построенном с помощью gradle, например:

dependencies {
    compile 'com.example:great-lib:0.1-SNAPSHOT'
}

Эта библиотека содержит только активы, js, css и изображения, которые будут использоваться в webview, с таким макетом:

assets/
|-> great.css
|-> great.min.js
|-> great.min.js.map
|-> js/
|   |-> plop.js
|   |-> foo.js
|   ...
|-> img/
|   ...

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

До сих пор я пробовал:

android {
    // this doesn't exclude anything
    packageOptions {
        exclude 'assets/js'
    }
    buildTypes {
        release {
            // this does exclude the js folder, but in both release and debug
            aaptOptions {
                ignoreAssetsPattern "!js"
            }
        }
    }
}

Любая идея, если то, что я хочу, можно достичь, и если да, то как?

(Я также думал о публикации двух версий библиотеки (great-lib и great-lib-debug) и имеет зависимость от debugCompile и releaseCompile, но я бы предпочел избежать этого и опубликовать одно версия)

Ответы

Ответ 1

В итоге я сделал следующее:

android.applicationVariants.all { variant ->

  if (variant.name.contains('Release')) {
    // exclude source and sourcemap from release builds
    def noJsSourceTask = task("delete${variant.name}JsSource", type: Delete) {
      delete "${buildDir}/intermediates/assets/${variant.dirName}/js"
      delete "${buildDir}/intermediates/assets/${variant.dirName}/great.min.js.map"
    }
    variant.mergeAssets.finalizedBy noCeJsSourceTask
  }
}

Он работает нормально, но есть несколько вещей, которые мне не очень нравятся:

  • Я прикасаюсь к файлам, созданным заданием после его завершения (finalizedBy), поэтому он не работает с "обновленной" проверкой. Но это только для релизов, я чаще всего отлаживаю
  • путь к удаляемым файлам создается вручную. Я не уверен, достаточно ли он достаточно общий для повторного использования в других проектах:
  • Я выбираю варианты, основанные на их имени. Мне понравилось бы что-то более структурированное.

Ответ 2

У меня был успех с этим подходом (обновлен 2019-5-13 для поддержки TaskProvider; см. Историю изменений для более старых версий):

android {
⋮
    applicationVariants.all { variant ->
        if (variant.buildType.name == 'release') {
            variant.mergeAssetsProvider.configure {
                doLast {
                    delete(fileTree(dir: outputDir, includes: ['**/js', '**/*.js.map']))
                }
            }
        }
    }
⋮
}

Это должно решить проблемы с ответом @Xavier:

  • Удаление выполняется как часть варианта задачи mergeAssets поэтому удаление отражается в выходных данных задачи, и mergeAssets проверка не должна быть затронута.
  • Пути рассчитаны без магических строк. Возможно, вам придется настроить шаблоны включения в случае, если мой пример слишком разрешительный.
  • Вариант выбирается по имени buildType, что менее проблематично, чем сопоставление всего имени варианта (хотя оно все еще строго типизировано).

Обратите внимание, что этот подход также работает с файлами res а не с assets: просто замените mergeAssets на mergeResources.

Другие ответы упоминающих packagingOptions и aaptOptions лают неправильное дерево, так как они находятся в области видимости для всех вариантов (они определены в android объема, не buildType или productFlavor).

Ответ 3

Gradle предоставляет "aaptOptions, ignoreAssetsPattern" для фильтрации/исключения папок и файлов активов из сборки выпуска или отладки.

Пример для сборки отладки (js и great.css):

debug {            
        aaptOptions {
            ignoreAssetsPattern '!js:!great.css:'
        }
    }

Пример для сборки выпуска (js и great.css):

release {
        aaptOptions {
            ignoreAssetsPattern '!js:!great.css:'
        }
    }

Ответ 4

Я думаю, вы можете использовать proguard. Proguard включает в себя андроид-студию, обфускацию кода и удаление не используемых классов, и если вы хотите удалить все ресурсы, которые не используются. Только добавьте в свой файл build.gradle следующее:

 release {

            minifyEnabled true //remove classes, obfuscate code and zipalign
            shrinkResources true //remove resources
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//autogenerated files
        }

Это информация о ссылках на это:

Вы можете персонализировать, исключать определенные файлы или игнорировать определенные файлы.

Ответ 5

Это невозможно с помощью фильтра.

У вас может быть 2 папки с ресурсами. основной (src/main/assets), используемый для debug и release, и один (src/debug/assets), используемый только для сборки отладки.

источник