20

我正在使用 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-liband ),并在andgreat-lib-debug中有依赖关系,但我更愿意避免这种情况并发布一个版本)debugCompilereleaseCompile

4

5 回答 5

22

我用这种方法取得了成功(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任务的一部分完成的,因此删除会反映在任务的输出中,并且最新的检查应该不受影响。
  • 路径是在没有魔术字符串的情况下计算的。如果我的示例过于宽松,您可能需要调整包含模式。
  • 变体是按buildType名称选择的,这比匹配整个变体名称的问题要小(尽管它仍然是字符串类型)。

请注意,这种方法也适用于res文件,而不是assets:只需替换mergeAssetsmergeResources.

其他答案提到packagingOptions并且aaptOptions正在吠叫错误的树,因为它们的范围适用于所有变体(它们是在android范围中定义的,而不是buildTypeor productFlavor)。

于 2016-09-29T01:31:11.257 回答
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),因此它不适用于“最新”检查。但这仅适用于发布版本,我更经常进行调试
  • 要删除的文件的路径是手动构建的。我不确定它是否足够通用,可以按原样在其他项目中重用
  • 我正在根据它们的名称选择变体。我会喜欢更有条理的东西。
于 2015-03-20T14:24:33.663 回答
7

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

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

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

发布构建示例(js文件夹和great.css文件):

release {
        aaptOptions {
            ignoreAssetsPattern '!js:!great.css:'
        }
    }
于 2016-06-22T12:11:28.637 回答
0

我认为您可以使用proguard。Proguard 包含在 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
        }

这是有关的链接信息:

您可以个性化、排除特定文件或忽略特定文件

于 2015-03-26T10:13:45.397 回答
0

这是不可能通过过滤器的。

不过,您可能有 2 个资产文件夹。一个主要的(src/main/assets)用于两者debugrelease一个(src/debug/assets)仅用于调试构建。

资源

于 2015-03-26T11:45:30.547 回答