我正在使用gradle构建的应用程序中导入一个android库,如下所示:
dependencies {
compile 'com.example:great-lib:0.1-SNAPSHOT'
}
此库仅包含要在webview中使用的资源,js,css和图像,其布局如下:
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
,但是我我宁愿避免这种情况并发布单一版本)
答案 0 :(得分:13)
我使用此方法取得了成功(TaskProvider
支持更新了2019-5-13;请参阅旧版本的编辑历史记录):
android {
⋮
applicationVariants.all { variant ->
if (variant.buildType.name == 'release') {
variant.mergeAssetsProvider.configure {
doLast {
delete(fileTree(dir: outputDir, includes: ['**/js', '**/*.js.map']))
}
}
}
}
⋮
}
这应该解决@ Xavier答案的问题:
mergeAssets
任务的一部分完成的,因此删除会反映在任务的输出中,并且最新的检查应该不受影响。buildType
名称选择,与匹配整个变体名称相比问题较少(尽管它仍然是字符串类型)。请注意,此方法也适用于res
个文件而不是assets
:只需将mergeAssets
替换为mergeResources
。
提及packagingOptions
和aaptOptions
的其他答案正在咆哮错误的树,因为它们的范围是所有变体(它们在android
范围内定义,不是buildType
或productFlavor
)。
答案 1 :(得分:11)
我最终做了以下事情:
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 :(得分:2)
Gradle提供“aaptOptions,ignoreAssetsPattern”来从发布或调试版本中过滤/排除资产文件夹和文件。
调试版本(js
文件夹和great.css
文件)的示例:
debug {
aaptOptions {
ignoreAssetsPattern '!js:!great.css:'
}
}
发布版本(js
文件夹和great.css
文件)示例:
release {
aaptOptions {
ignoreAssetsPattern '!js:!great.css:'
}
}
答案 3 :(得分:1)
我认为你可以使用proguard。 Proguard包含android studio,混淆代码,并删除未使用的类,如果你想删除app未使用的所有资源。只需将你的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
}
这是关于该链接的信息:
您可以个性化,排除特定文件或忽略特定文件
答案 4 :(得分:0)
通过过滤器无法实现。
您可以拥有2个资源文件夹。用于debug
和release
的主要(src / main / assets)和仅用于调试构建的一个(src / debug / assets)。