others - Android - 在发布版本的类型中排除assets

我正在用gradle构建的应用程序导入一个android库,就像这样:


dependencies {


 compile 'com.example:great-lib:0.1-SNAPSHOT'


}



这个库只包含assets,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-libgreat-lib-debug ),并且且拥有debugCompilereleaseCompile的依赖性,但是,是我更愿意避免这个版本),

时间:

我成功地使用了这种方法(更新2019-5-13用于TaskProvider支持 查看旧版本的编辑历史记录):


applicationVariants.all { variant ->


 if (variant.buildType.name == 'release') {


 variant.mergeAssetsProvider.configure {


 doLast {


 delete(fileTree(dir: outputDir, includes: ['**/js', '**/*.js.map']))


 }


 }


 }


}



  • 删除是作为variant mergeAssets任务的一部分完成的,因此删除会反映在任务的输出中,并且最新的检查应该不受影响。
  • 这些路径是在没有魔术字符串的情况下计算的,你可能需要调整包含模式,以防我的例子过于宽松。
  • buildType名称选择该变量,这比匹配整个变体名(虽然它仍然是stringly类型)的问题更小,

请注意,此方法也适用于res文件而不是assets : 用mergeResources替换mergeAssets

其他提到packagingOptions和aaptOptions的答案是错误的,因为它们是所有变量(它们是在android范围内定义的,而不是buildType或productFlavor)的范围。

最后,我执行了以下操作:


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 )之后,我接触到任务生成的文件,因此它不适合"up-to-date"检查,但是,它只适用于发布版本,我更经常地进行调试,
  • 要删除的文件的路径是手动生成的,我不确定它是否足够通用,可以在其他项目中重用,
  • 我根据他们的名字选择变种。我想要更结构化的东西。

Gradle提供"aaptoptions,ignoreAssetsPattern"来筛选/排除来自发布或调试生成的assets文件夹和文件。

调试生成(js文件夹和great.css文件)的例子:


debug { 


 aaptOptions {


 ignoreAssetsPattern '!js:!great.css:'


 }


 }



发布版本(js文件夹和great.css文件)的例子:


release {


 aaptOptions {


 ignoreAssetsPattern '!js:!great.css:'


 }


 }



我想你可以用混淆器,混淆器包括Android Studio,模糊处理代码和删除不用的类,如果你想删除所有未使用的资源,仅把我的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


 }



这是关于它的链接信息:

你可以个性化,排除特定文件或忽略特定文件,

通过过滤器是不可能的。

你可以有2个assets文件夹,用于debugrelease的主要(src/main/assets)和仅用于调试构建的一个(src/debug/assets)。

...