排除发布版本类型的资产

时间:2015-03-06 11:04:13

标签: android android-gradle aar

我正在使用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-libgreat-lib-debug),并且依赖于debugCompilereleaseCompile,但是我我宁愿避免这种情况并发布单一版本)

5 个答案:

答案 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

提及packagingOptionsaaptOptions的其他答案正在咆哮错误的树,因为它们的范围是所有变体(它们在android范围内定义,不是buildTypeproductFlavor)。

答案 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个资源文件夹。用于debugrelease的主要(src / main / assets)和仅用于调试构建的一个(src / debug / assets)。

source