Built apk包含不需要的资源

时间:2015-11-20 10:32:16

标签: android gradle

有一个问题,我们的Gradle构建生成的apk在test/resources目录中包含一堆不必要的文件

我们的应用程序构建gradle包含几个本地模块依赖项,这些依赖项构建为android库。

我知道Gradle中有packagingOptions字段,但据我所知,您无法排除目录。排除每个文件不是一个选项。无论如何,我想知道这个的根本原因。

应用程序gradle build:

apply from: "${rootDir}/android_application.gradle"

dependencies {
    compile project(':local-lib1')
    //... etc
    compile project(':local-libN')

    testCompile libraries['junit']
 }

android {
    defaultConfig {
        versionCode 1
        versionName "1.0"

        multiDexEnabled true
    }
}

和android_application.gradle:

apply plugin: 'com.android.application'

android {
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }

    compileSdkVersion android_sdk_version
    buildToolsVersion android_build_tools_version

    defaultConfig {
        minSdkVersion android_min_sdk_version
        targetSdkVersion android_target_sdk_version
    }

    buildTypes {

    }
}

所有模块的结构如下:

module
|
--AndroidManifest.xml
--build.gradle
--assets/
--res/
--src
  |
  -- main/
  |  |
  |  --java/
  |  --resources/
  |
  -- test/
     |
     --java/
     --resources/

为什么test/resources被包含在apk中?我该如何排除它们?

编辑(显示lib gradle):

lib gradle示例:

apply from: "${rootDir}/android_library.gradle"


dependencies {
    compile 'com.android.support:multidex:1.0.0'
    // ...etc external deps

    // test deps
    testCompile libraries['logback-classic']
    testCompile libraries['junit']
    testCompile libraries['mockito-core']
    // etc...
}

android {
    packagingOptions { 
        exclude 'META-INF/LICENSE' 
        exclude 'META-INF/NOTICE' 
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
    }
}

android_library gradle:

apply plugin: 'android-library'

android {
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }

    compileSdkVersion android_sdk_version
    buildToolsVersion android_build_tools_version

    defaultConfig {
        minSdkVersion android_min_sdk_version
        targetSdkVersion android_target_sdk_version
    }

    buildTypes {
        release {

        }
    }
}

我正在使用gradlew.bat -x test build

构建

apk中包含的test/resources包含每个lib的相应test/resources中的所有文件。目录(未压缩)的大小是10mb,因此增加了不合理的数量到整个apk的大小。

2 个答案:

答案 0 :(得分:2)

试试resource shrinking。根据Google文档:“适用于Android的Gradle构建系统支持

  

资源缩减“:自动删除资源   在打包的应用程序中,在构建时未使用。除了删除   项目中运行时实际上不需要的资源,   如果应用程序实际上不需要,这也会从您依赖的库中删除资源

android {
    ...
    buildTypes {
        test {
            minifyEnabled true
            shrinkResources true
            ...
        }
    }
}

答案 1 :(得分:0)

想想我已经解决了这个问题。

我在app build.gradle和每个库build.gradle:

android {
    sourceSets {
        main {
            resources.srcDirs = ['src']
        }
    }
}

已更改为

android {
    sourceSets {
        main {
            resources.srcDirs = ['src/main']
        }
    }
}

我猜gradle正在将src/下的所有资源目录合并为一个 - http://tools.android.com/tech-docs/new-build-system/resource-merging