Исключить активы для типа выпуска
Я импортирую библиотеку 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), используемый только для сборки отладки.
источник