排除发布版本类型的资产

Xav*_*ier 16 android android-gradle-plugin aar

我正在使用gradle构建的应用程序中导入一个android库,如下所示:

dependencies {
    compile 'com.example:great-lib:0.1-SNAPSHOT'
}
Run Code Online (Sandbox Code Playgroud)

此库仅包含要在webview中使用的资源,js,css和图像,其布局如下:

assets/
|-> great.css
|-> great.min.js
|-> great.min.js.map
|-> js/
|   |-> plop.js
|   |-> foo.js
|   ...
|-> img/
|   ...
Run Code Online (Sandbox Code Playgroud)

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"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何想法是否有可能实现,如果是,如何?

(我也想过发布两个版本的库(great-libgreat-lib-debug),并且依赖于debugCompilereleaseCompile,但是我更愿意避免这种情况并发布一个版本)

Aar*_*ron 16

我用这种方法取得了成功:

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

这应该解决@ Xavier答案的问题:

  • 删除是作为变体TaskProvider任务的一部分完成的,因此删除会反映在任务的输出中,并且最新的检查应该不受影响.
  • 路径的计算没有魔术字符串.如果我的示例过于宽松,您可能需要调整包含模式.
  • 变量是通过mergeAssets名称选择的,这比匹配整个变体名称要少(尽管它仍然是字符串类型).

请注意,此方法也适用于buildType文件而不是res:只需替换assetsmergeAssets.

其他答案提到mergeResourcespackagingOptions正在咆哮错误的树,因为它们的范围是所有变体(它们在aaptOptions范围中定义,而不是androidbuildType).

  • 值得一提的是,这段代码是_inside_的`buildTypes`部分,它位于应用程序build.gradle的`android`部分. (3认同)

Xav*_*ier 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
  }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但有一些我不喜欢的事情:

  • 我正在触摸任务完成后生成的文件(finalizedBy),因此它与"最新"检查不兼容.但它只适用于发布版本,我更经常地进行调试
  • 要删除的文件的路径是手动构建的.我不确定它是否足够通用,可以在其他项目中重复使用
  • 我正在根据他们的名字选择变种.我会喜欢更有条理的东西.

  • 在 2019 年尝试此操作时,获得“警告:API 'variant.getMergeAssets()' 已过时并已被替换为 'variant.getMergeAssetsProvider()'.”。会喜欢显示正确的较新语法的编辑 (3认同)

小智 7

Gradle 提供“aaptOptions, ignoreAssetsPattern”来过滤/排除发布或调试版本中的资产文件夹和文件。

调试构建示例(js文件夹和great.css文件):

debug {            
        aaptOptions {
            ignoreAssetsPattern '!js:!great.css:'
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

release {
        aaptOptions {
            ignoreAssetsPattern '!js:!great.css:'
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • ignoreAssetsPattern 对我有用,但不能在每个构建类型的基础上工作 - 请参阅此处的问题:/sf/ask/3925260881/ -资产文件 (2认同)